OLD | NEW |
(Empty) | |
| 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 // TODO(kaiwang): Add SparseHistogram test. |
| 171 |
| 172 } // namespace base |
OLD | NEW |