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/memory/scoped_ptr.h" |
| 8 #include "base/metrics/histogram.h" |
| 9 #include "base/metrics/statistics_recorder.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" |
| 11 |
| 12 namespace base { |
| 13 |
| 14 class StatisticsRecorderTest : public testing::Test { |
| 15 protected: |
| 16 virtual void SetUp() { |
| 17 // Each test will have a clean state (no Histogram / BucketRanges |
| 18 // registered). |
| 19 InitializeStatisticsRecorder(); |
| 20 } |
| 21 |
| 22 virtual void TearDown() { |
| 23 UninitializeStatisticsRecorder(); |
| 24 } |
| 25 |
| 26 void InitializeStatisticsRecorder() { |
| 27 statistics_recorder_ = new StatisticsRecorder(); |
| 28 } |
| 29 |
| 30 void UninitializeStatisticsRecorder() { |
| 31 delete statistics_recorder_; |
| 32 statistics_recorder_ = NULL; |
| 33 } |
| 34 |
| 35 void DeleteHistogram(Histogram* histogram) { |
| 36 delete histogram; |
| 37 } |
| 38 |
| 39 StatisticsRecorder* statistics_recorder_; |
| 40 }; |
| 41 |
| 42 TEST_F(StatisticsRecorderTest, NotInitialized) { |
| 43 UninitializeStatisticsRecorder(); |
| 44 |
| 45 ASSERT_FALSE(StatisticsRecorder::IsActive()); |
| 46 |
| 47 StatisticsRecorder::Histograms registered_histograms; |
| 48 std::vector<const BucketRanges*> registered_ranges; |
| 49 |
| 50 // We can still create histograms, but it's not registered. |
| 51 // TODO(kaiwang): Do not depend on Histogram FactoryGet implementation. |
| 52 Histogram* histogram( |
| 53 Histogram::FactoryGet("StatisticsRecorderTest_NotInitialized", |
| 54 1, 1000, 10, Histogram::kNoFlags)); |
| 55 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 56 EXPECT_EQ(0u, registered_histograms.size()); |
| 57 |
| 58 // RegisterOrDeleteDuplicateRanges is a no-op. |
| 59 BucketRanges* ranges = new BucketRanges(3);; |
| 60 ranges->ResetChecksum(); |
| 61 EXPECT_EQ(ranges, |
| 62 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges)); |
| 63 StatisticsRecorder::GetBucketRanges(®istered_ranges); |
| 64 EXPECT_EQ(0u, registered_ranges.size()); |
| 65 |
| 66 DeleteHistogram(histogram); |
| 67 } |
| 68 |
| 69 TEST_F(StatisticsRecorderTest, RegisterBucketRanges) { |
| 70 std::vector<const BucketRanges*> registered_ranges; |
| 71 |
| 72 BucketRanges* ranges1 = new BucketRanges(3);; |
| 73 ranges1->ResetChecksum(); |
| 74 BucketRanges* ranges2 = new BucketRanges(4);; |
| 75 ranges2->ResetChecksum(); |
| 76 |
| 77 // Register new ranges. |
| 78 EXPECT_EQ(ranges1, |
| 79 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges1)); |
| 80 EXPECT_EQ(ranges2, |
| 81 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges2)); |
| 82 StatisticsRecorder::GetBucketRanges(®istered_ranges); |
| 83 ASSERT_EQ(2u, registered_ranges.size()); |
| 84 |
| 85 // Register some ranges again. |
| 86 EXPECT_EQ(ranges1, |
| 87 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges1)); |
| 88 registered_ranges.clear(); |
| 89 StatisticsRecorder::GetBucketRanges(®istered_ranges); |
| 90 ASSERT_EQ(2u, registered_ranges.size()); |
| 91 // Make sure the ranges is still the one we know. |
| 92 ASSERT_EQ(3u, ranges1->size()); |
| 93 EXPECT_EQ(0, ranges1->range(0)); |
| 94 EXPECT_EQ(0, ranges1->range(1)); |
| 95 EXPECT_EQ(0, ranges1->range(2)); |
| 96 |
| 97 // Register ranges with same values. |
| 98 BucketRanges* ranges3 = new BucketRanges(3);; |
| 99 ranges3->ResetChecksum(); |
| 100 EXPECT_EQ(ranges1, // returning ranges1 |
| 101 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges3)); |
| 102 registered_ranges.clear(); |
| 103 StatisticsRecorder::GetBucketRanges(®istered_ranges); |
| 104 ASSERT_EQ(2u, registered_ranges.size()); |
| 105 } |
| 106 |
| 107 TEST_F(StatisticsRecorderTest, RegisterHistogram) { |
| 108 // Create a Histogram that was not registered. |
| 109 // TODO(kaiwang): Do not depend on Histogram FactoryGet implementation. |
| 110 UninitializeStatisticsRecorder(); |
| 111 Histogram* histogram = Histogram::FactoryGet( |
| 112 "TestHistogram", 1, 1000, 10, Histogram::kNoFlags); |
| 113 |
| 114 // Clean StatisticsRecorder. |
| 115 InitializeStatisticsRecorder(); |
| 116 StatisticsRecorder::Histograms registered_histograms; |
| 117 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 118 EXPECT_EQ(0u, registered_histograms.size()); |
| 119 |
| 120 // Register the Histogram. |
| 121 EXPECT_EQ(histogram, |
| 122 StatisticsRecorder::RegisterOrDeleteDuplicate(histogram)); |
| 123 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 124 EXPECT_EQ(1u, registered_histograms.size()); |
| 125 |
| 126 // Register the same Histogram again. |
| 127 EXPECT_EQ(histogram, |
| 128 StatisticsRecorder::RegisterOrDeleteDuplicate(histogram)); |
| 129 registered_histograms.clear(); |
| 130 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 131 EXPECT_EQ(1u, registered_histograms.size()); |
| 132 } |
| 133 |
| 134 TEST_F(StatisticsRecorderTest, FindHistogram) { |
| 135 Histogram* histogram1 = Histogram::FactoryGet( |
| 136 "TestHistogram1", 1, 1000, 10, Histogram::kNoFlags); |
| 137 Histogram* histogram2 = Histogram::FactoryGet( |
| 138 "TestHistogram2", 1, 1000, 10, Histogram::kNoFlags); |
| 139 |
| 140 EXPECT_EQ(histogram1, StatisticsRecorder::FindHistogram("TestHistogram1")); |
| 141 EXPECT_EQ(histogram2, StatisticsRecorder::FindHistogram("TestHistogram2")); |
| 142 EXPECT_TRUE(StatisticsRecorder::FindHistogram("TestHistogram") == NULL); |
| 143 } |
| 144 |
| 145 TEST_F(StatisticsRecorderTest, GetSnapshot) { |
| 146 Histogram::FactoryGet("TestHistogram1", 1, 1000, 10, Histogram::kNoFlags); |
| 147 Histogram::FactoryGet("TestHistogram2", 1, 1000, 10, Histogram::kNoFlags); |
| 148 Histogram::FactoryGet("TestHistogram3", 1, 1000, 10, Histogram::kNoFlags); |
| 149 |
| 150 StatisticsRecorder::Histograms snapshot; |
| 151 StatisticsRecorder::GetSnapshot("Test", &snapshot); |
| 152 EXPECT_EQ(3u, snapshot.size()); |
| 153 |
| 154 snapshot.clear(); |
| 155 StatisticsRecorder::GetSnapshot("1", &snapshot); |
| 156 EXPECT_EQ(1u, snapshot.size()); |
| 157 |
| 158 snapshot.clear(); |
| 159 StatisticsRecorder::GetSnapshot("hello", &snapshot); |
| 160 EXPECT_EQ(0u, snapshot.size()); |
| 161 } |
| 162 |
| 163 TEST_F(StatisticsRecorderTest, RegisterHistogramWithFactoryGet) { |
| 164 StatisticsRecorder::Histograms registered_histograms; |
| 165 |
| 166 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 167 ASSERT_EQ(0u, registered_histograms.size()); |
| 168 |
| 169 // Create a Histogram. |
| 170 Histogram* histogram = Histogram::FactoryGet( |
| 171 "TestHistogram", 1, 1000, 10, Histogram::kNoFlags); |
| 172 registered_histograms.clear(); |
| 173 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 174 EXPECT_EQ(1u, registered_histograms.size()); |
| 175 |
| 176 // Get an existing histogram. |
| 177 Histogram* histogram2 = Histogram::FactoryGet( |
| 178 "TestHistogram", 1, 1000, 10, Histogram::kNoFlags); |
| 179 registered_histograms.clear(); |
| 180 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 181 EXPECT_EQ(1u, registered_histograms.size()); |
| 182 EXPECT_EQ(histogram, histogram2); |
| 183 |
| 184 // Create a LinearHistogram. |
| 185 histogram = LinearHistogram::FactoryGet( |
| 186 "TestLinearHistogram", 1, 1000, 10, Histogram::kNoFlags); |
| 187 registered_histograms.clear(); |
| 188 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 189 EXPECT_EQ(2u, registered_histograms.size()); |
| 190 |
| 191 // Create a BooleanHistogram. |
| 192 histogram = BooleanHistogram::FactoryGet( |
| 193 "TestBooleanHistogram", Histogram::kNoFlags); |
| 194 registered_histograms.clear(); |
| 195 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 196 EXPECT_EQ(3u, registered_histograms.size()); |
| 197 |
| 198 // Create a CustomHistogram. |
| 199 std::vector<int> custom_ranges; |
| 200 custom_ranges.push_back(1); |
| 201 custom_ranges.push_back(5); |
| 202 histogram = CustomHistogram::FactoryGet( |
| 203 "TestCustomHistogram", custom_ranges, Histogram::kNoFlags); |
| 204 registered_histograms.clear(); |
| 205 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 206 EXPECT_EQ(4u, registered_histograms.size()); |
| 207 } |
| 208 |
| 209 TEST_F(StatisticsRecorderTest, RegisterHistogramWithMacros) { |
| 210 StatisticsRecorder::Histograms registered_histograms; |
| 211 |
| 212 Histogram* histogram = Histogram::FactoryGet( |
| 213 "TestHistogramCounts", 1, 1000000, 50, Histogram::kNoFlags); |
| 214 |
| 215 // The histogram we got from macro is the same as from FactoryGet. |
| 216 HISTOGRAM_COUNTS("TestHistogramCounts", 30); |
| 217 registered_histograms.clear(); |
| 218 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 219 ASSERT_EQ(1u, registered_histograms.size()); |
| 220 EXPECT_EQ(histogram, registered_histograms[0]); |
| 221 |
| 222 HISTOGRAM_TIMES("TestHistogramTimes", TimeDelta::FromDays(1)); |
| 223 HISTOGRAM_ENUMERATION("TestHistogramEnumeration", 20, 200); |
| 224 |
| 225 registered_histograms.clear(); |
| 226 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 227 EXPECT_EQ(3u, registered_histograms.size()); |
| 228 |
| 229 // Debugging only macros. |
| 230 DHISTOGRAM_TIMES("TestHistogramDebugTimes", TimeDelta::FromDays(1)); |
| 231 DHISTOGRAM_COUNTS("TestHistogramDebugCounts", 30); |
| 232 registered_histograms.clear(); |
| 233 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 234 #ifndef NDEBUG |
| 235 EXPECT_EQ(5u, registered_histograms.size()); |
| 236 #else |
| 237 EXPECT_EQ(3u, registered_histograms.size()); |
| 238 #endif |
| 239 } |
| 240 |
| 241 TEST_F(StatisticsRecorderTest, BucketRangesSharing) { |
| 242 Histogram* histogram1(Histogram::FactoryGet( |
| 243 "Histogram", 1, 64, 8, Histogram::kNoFlags)); |
| 244 Histogram* histogram2(Histogram::FactoryGet( |
| 245 "Histogram2", 1, 64, 8, Histogram::kNoFlags)); |
| 246 Histogram* histogram3(Histogram::FactoryGet( |
| 247 "Histogram3", 1, 64, 16, Histogram::kNoFlags)); |
| 248 |
| 249 const BucketRanges* bucket_ranges1 = histogram1->bucket_ranges(); |
| 250 const BucketRanges* bucket_ranges2 = histogram2->bucket_ranges(); |
| 251 const BucketRanges* bucket_ranges3 = histogram3->bucket_ranges(); |
| 252 EXPECT_EQ(bucket_ranges1, bucket_ranges2); |
| 253 EXPECT_FALSE(bucket_ranges1->Equals(bucket_ranges3)); |
| 254 } |
| 255 |
| 256 } // namespace base |
OLD | NEW |