1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <vector> 6 7 #include "base/metrics/histogram.h" 8 #include "base/metrics/histogram_base.h" 9 #include "base/metrics/sparse_histogram.h" 10 #include "base/metrics/statistics_recorder.h" 11 #include "base/pickle.h" 12 #include "testing/gtest/include/gtest/gtest.h" 13 14 namespace base { 15 16 class HistogramBaseTest : public testing::Test { 17 protected: 18 HistogramBaseTest() { 19 // Each test will have a clean state (no Histogram / BucketRanges 20 // registered). 21 statistics_recorder_ = NULL; 22 ResetStatisticsRecorder(); 23 } 24 25 virtual ~HistogramBaseTest() { 26 delete statistics_recorder_; 27 } 28 29 void ResetStatisticsRecorder() { 30 delete statistics_recorder_; 31 statistics_recorder_ = new StatisticsRecorder(); 32 } 33 34 private: 35 StatisticsRecorder* statistics_recorder_; 36 }; 37 38 TEST_F(HistogramBaseTest, DeserializeHistogram) { 39 HistogramBase* histogram = Histogram::FactoryGet( 40 "TestHistogram", 1, 1000, 10, 41 (HistogramBase::kUmaTargetedHistogramFlag | 42 HistogramBase::kIPCSerializationSourceFlag)); 43 44 Pickle pickle; 45 ASSERT_TRUE(histogram->SerializeInfo(&pickle)); 46 47 PickleIterator iter(pickle); 48 HistogramBase* deserialized = DeserializeHistogramInfo(&iter); 49 EXPECT_EQ(histogram, deserialized); 50 51 ResetStatisticsRecorder(); 52 53 PickleIterator iter2(pickle); 54 deserialized = DeserializeHistogramInfo(&iter2); 55 EXPECT_TRUE(deserialized); 56 EXPECT_NE(histogram, deserialized); 57 EXPECT_EQ("TestHistogram", deserialized->histogram_name()); 58 EXPECT_TRUE(deserialized->HasConstructionArguments(1, 1000, 10)); 59 60 // kIPCSerializationSourceFlag will be cleared. 61 EXPECT_EQ(HistogramBase::kUmaTargetedHistogramFlag, deserialized->flags()); 62 } 63 64 TEST_F(HistogramBaseTest, DeserializeHistogramAndAddSamples) { 65 HistogramBase* histogram = Histogram::FactoryGet( 66 "TestHistogram", 1, 1000, 10, HistogramBase::kIPCSerializationSourceFlag); 67 histogram->Add(1); 68 histogram->Add(10); 69 histogram->Add(100); 70 histogram->Add(1000); 71 72 Pickle pickle; 73 ASSERT_TRUE(histogram->SerializeInfo(&pickle)); 74 histogram->SnapshotSamples()->Serialize(&pickle); 75 76 PickleIterator iter(pickle); 77 DeserializeHistogramAndAddSamples(&iter); 78 79 // The histogram has kIPCSerializationSourceFlag. So samples will be ignored. 80 scoped_ptr<HistogramSamples> snapshot(histogram->SnapshotSamples()); 81 EXPECT_EQ(1, snapshot->GetCount(1)); 82 EXPECT_EQ(1, snapshot->GetCount(10)); 83 EXPECT_EQ(1, snapshot->GetCount(100)); 84 EXPECT_EQ(1, snapshot->GetCount(1000)); 85 86 // Clear kIPCSerializationSourceFlag to emulate multi-process usage. 87 histogram->ClearFlags(HistogramBase::kIPCSerializationSourceFlag); 88 PickleIterator iter2(pickle); 89 DeserializeHistogramAndAddSamples(&iter2); 90 91 scoped_ptr<HistogramSamples> snapshot2(histogram->SnapshotSamples()); 92 EXPECT_EQ(2, snapshot2->GetCount(1)); 93 EXPECT_EQ(2, snapshot2->GetCount(10)); 94 EXPECT_EQ(2, snapshot2->GetCount(100)); 95 EXPECT_EQ(2, snapshot2->GetCount(1000)); 96 } 97 98 TEST_F(HistogramBaseTest, DeserializeLinearHistogram) { 99 HistogramBase* histogram = LinearHistogram::FactoryGet( 100 "TestHistogram", 1, 1000, 10, 101 HistogramBase::kIPCSerializationSourceFlag); 102 103 Pickle pickle; 104 ASSERT_TRUE(histogram->SerializeInfo(&pickle)); 105 106 PickleIterator iter(pickle); 107 HistogramBase* deserialized = DeserializeHistogramInfo(&iter); 108 EXPECT_EQ(histogram, deserialized); 109 110 ResetStatisticsRecorder(); 111 112 PickleIterator iter2(pickle); 113 deserialized = DeserializeHistogramInfo(&iter2); 114 EXPECT_TRUE(deserialized); 115 EXPECT_NE(histogram, deserialized); 116 EXPECT_EQ("TestHistogram", deserialized->histogram_name()); 117 EXPECT_TRUE(deserialized->HasConstructionArguments(1, 1000, 10)); 118 EXPECT_EQ(0, deserialized->flags()); 119 } 120 121 TEST_F(HistogramBaseTest, DeserializeBooleanHistogram) { 122 HistogramBase* histogram = BooleanHistogram::FactoryGet( 123 "TestHistogram", HistogramBase::kIPCSerializationSourceFlag); 124 125 Pickle pickle; 126 ASSERT_TRUE(histogram->SerializeInfo(&pickle)); 127 128 PickleIterator iter(pickle); 129 HistogramBase* deserialized = DeserializeHistogramInfo(&iter); 130 EXPECT_EQ(histogram, deserialized); 131 132 ResetStatisticsRecorder(); 133 134 PickleIterator iter2(pickle); 135 deserialized = DeserializeHistogramInfo(&iter2); 136 EXPECT_TRUE(deserialized); 137 EXPECT_NE(histogram, deserialized); 138 EXPECT_EQ("TestHistogram", deserialized->histogram_name()); 139 EXPECT_TRUE(deserialized->HasConstructionArguments(1, 2, 3)); 140 EXPECT_EQ(0, deserialized->flags()); 141 } 142 143 TEST_F(HistogramBaseTest, DeserializeCustomHistogram) { 144 std::vector<HistogramBase::Sample> ranges; 145 ranges.push_back(13); 146 ranges.push_back(5); 147 ranges.push_back(9); 148 149 HistogramBase* histogram = CustomHistogram::FactoryGet( 150 "TestHistogram", ranges, HistogramBase::kIPCSerializationSourceFlag); 151 152 Pickle pickle; 153 ASSERT_TRUE(histogram->SerializeInfo(&pickle)); 154 155 PickleIterator iter(pickle); 156 HistogramBase* deserialized = DeserializeHistogramInfo(&iter); 157 EXPECT_EQ(histogram, deserialized); 158 159 ResetStatisticsRecorder(); 160 161 PickleIterator iter2(pickle); 162 deserialized = DeserializeHistogramInfo(&iter2); 163 EXPECT_TRUE(deserialized); 164 EXPECT_NE(histogram, deserialized); 165 EXPECT_EQ("TestHistogram", deserialized->histogram_name()); 166 EXPECT_TRUE(deserialized->HasConstructionArguments(5, 13, 4)); 167 EXPECT_EQ(0, deserialized->flags()); 168 } 169 170 TEST_F(HistogramBaseTest, DeserializeSparseHistogram) { 171 HistogramBase* histogram = SparseHistogram::FactoryGet( 172 "TestHistogram", HistogramBase::kIPCSerializationSourceFlag); 173 174 Pickle pickle; 175 ASSERT_TRUE(histogram->SerializeInfo(&pickle)); 176 177 PickleIterator iter(pickle); 178 HistogramBase* deserialized = DeserializeHistogramInfo(&iter); 179 EXPECT_EQ(histogram, deserialized); 180 181 ResetStatisticsRecorder(); 182 183 PickleIterator iter2(pickle); 184 deserialized = DeserializeHistogramInfo(&iter2); 185 EXPECT_TRUE(deserialized); 186 EXPECT_NE(histogram, deserialized); 187 EXPECT_EQ("TestHistogram", deserialized->histogram_name()); 188 EXPECT_EQ(0, deserialized->flags()); 189 } 190 191 } // namespace base 192