| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/metrics/statistics_recorder.h" | 5 #include "base/metrics/statistics_recorder.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/json/json_reader.h" | 13 #include "base/json/json_reader.h" |
| 14 #include "base/metrics/histogram_macros.h" | 14 #include "base/metrics/histogram_macros.h" |
| 15 #include "base/metrics/persistent_histogram_allocator.h" | 15 #include "base/metrics/persistent_histogram_allocator.h" |
| 16 #include "base/metrics/sparse_histogram.h" | 16 #include "base/metrics/sparse_histogram.h" |
| 17 #include "base/values.h" | 17 #include "base/values.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 19 | 19 |
| 20 namespace base { | 20 namespace base { |
| 21 | 21 |
| 22 class StatisticsRecorderTest : public testing::Test { | 22 class StatisticsRecorderTest : public testing::TestWithParam<bool> { |
| 23 protected: | 23 protected: |
| 24 void SetUp() override { | 24 const int32_t kAllocatorMemorySize = 64 << 10; // 64 KiB |
| 25 |
| 26 StatisticsRecorderTest() : use_persistent_histogram_allocator_(GetParam()) { |
| 25 // Get this first so it never gets created in persistent storage and will | 27 // Get this first so it never gets created in persistent storage and will |
| 26 // not appear in the StatisticsRecorder after it is re-initialized. | 28 // not appear in the StatisticsRecorder after it is re-initialized. |
| 27 PersistentHistogramAllocator::GetCreateHistogramResultHistogram(); | 29 PersistentHistogramAllocator::GetCreateHistogramResultHistogram(); |
| 30 |
| 28 // Each test will have a clean state (no Histogram / BucketRanges | 31 // Each test will have a clean state (no Histogram / BucketRanges |
| 29 // registered). | 32 // registered). |
| 30 InitializeStatisticsRecorder(); | 33 InitializeStatisticsRecorder(); |
| 34 |
| 35 // Use persistent memory for histograms if so indicated by test parameter. |
| 36 if (use_persistent_histogram_allocator_) { |
| 37 GlobalHistogramAllocator::CreateWithLocalMemory( |
| 38 kAllocatorMemorySize, 0, "StatisticsRecorderTest"); |
| 39 } |
| 31 } | 40 } |
| 32 | 41 |
| 33 void TearDown() override { | 42 ~StatisticsRecorderTest() override { |
| 43 GlobalHistogramAllocator::ReleaseForTesting(); |
| 34 UninitializeStatisticsRecorder(); | 44 UninitializeStatisticsRecorder(); |
| 35 GlobalHistogramAllocator::ReleaseForTesting(); | |
| 36 } | 45 } |
| 37 | 46 |
| 38 void InitializeStatisticsRecorder() { | 47 void InitializeStatisticsRecorder() { |
| 39 DCHECK(!statistics_recorder_); | 48 DCHECK(!statistics_recorder_); |
| 40 StatisticsRecorder::UninitializeForTesting(); | 49 StatisticsRecorder::UninitializeForTesting(); |
| 41 statistics_recorder_.reset(new StatisticsRecorder()); | 50 statistics_recorder_.reset(new StatisticsRecorder()); |
| 42 } | 51 } |
| 43 | 52 |
| 44 void UninitializeStatisticsRecorder() { | 53 void UninitializeStatisticsRecorder() { |
| 45 statistics_recorder_.reset(); | 54 statistics_recorder_.reset(); |
| 46 StatisticsRecorder::UninitializeForTesting(); | 55 StatisticsRecorder::UninitializeForTesting(); |
| 47 } | 56 } |
| 48 | 57 |
| 49 Histogram* CreateHistogram(const std::string& name, | 58 Histogram* CreateHistogram(const std::string& name, |
| 50 HistogramBase::Sample min, | 59 HistogramBase::Sample min, |
| 51 HistogramBase::Sample max, | 60 HistogramBase::Sample max, |
| 52 size_t bucket_count) { | 61 size_t bucket_count) { |
| 53 BucketRanges* ranges = new BucketRanges(bucket_count + 1); | 62 BucketRanges* ranges = new BucketRanges(bucket_count + 1); |
| 54 Histogram::InitializeBucketRanges(min, max, ranges); | 63 Histogram::InitializeBucketRanges(min, max, ranges); |
| 55 const BucketRanges* registered_ranges = | 64 const BucketRanges* registered_ranges = |
| 56 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges); | 65 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges); |
| 57 return new Histogram(name, min, max, registered_ranges); | 66 return new Histogram(name, min, max, registered_ranges); |
| 58 } | 67 } |
| 59 | 68 |
| 60 void DeleteHistogram(HistogramBase* histogram) { | 69 void DeleteHistogram(HistogramBase* histogram) { |
| 61 delete histogram; | 70 delete histogram; |
| 62 } | 71 } |
| 63 | 72 |
| 73 int CountIterableHistograms(StatisticsRecorder::HistogramIterator* iter) { |
| 74 int count = 0; |
| 75 for (; *iter != StatisticsRecorder::end(); ++*iter) { |
| 76 ++count; |
| 77 } |
| 78 return count; |
| 79 } |
| 80 |
| 81 const bool use_persistent_histogram_allocator_; |
| 82 |
| 64 std::unique_ptr<StatisticsRecorder> statistics_recorder_; | 83 std::unique_ptr<StatisticsRecorder> statistics_recorder_; |
| 84 std::unique_ptr<GlobalHistogramAllocator> old_global_allocator_; |
| 85 |
| 86 private: |
| 87 DISALLOW_COPY_AND_ASSIGN(StatisticsRecorderTest); |
| 65 }; | 88 }; |
| 66 | 89 |
| 67 TEST_F(StatisticsRecorderTest, NotInitialized) { | 90 // Run all HistogramTest cases with both heap and persistent memory. |
| 91 INSTANTIATE_TEST_CASE_P(Allocator, StatisticsRecorderTest, testing::Bool()); |
| 92 |
| 93 TEST_P(StatisticsRecorderTest, NotInitialized) { |
| 68 UninitializeStatisticsRecorder(); | 94 UninitializeStatisticsRecorder(); |
| 69 | 95 |
| 70 ASSERT_FALSE(StatisticsRecorder::IsActive()); | 96 ASSERT_FALSE(StatisticsRecorder::IsActive()); |
| 71 | 97 |
| 72 StatisticsRecorder::Histograms registered_histograms; | 98 StatisticsRecorder::Histograms registered_histograms; |
| 73 std::vector<const BucketRanges*> registered_ranges; | 99 std::vector<const BucketRanges*> registered_ranges; |
| 74 | 100 |
| 75 StatisticsRecorder::GetHistograms(®istered_histograms); | 101 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 76 EXPECT_EQ(0u, registered_histograms.size()); | 102 EXPECT_EQ(0u, registered_histograms.size()); |
| 77 | 103 |
| 78 Histogram* histogram = CreateHistogram("TestHistogram", 1, 1000, 10); | 104 Histogram* histogram = CreateHistogram("TestHistogram", 1, 1000, 10); |
| 79 | 105 |
| 80 // When StatisticsRecorder is not initialized, register is a noop. | 106 // When StatisticsRecorder is not initialized, register is a noop. |
| 81 EXPECT_EQ(histogram, | 107 EXPECT_EQ(histogram, |
| 82 StatisticsRecorder::RegisterOrDeleteDuplicate(histogram)); | 108 StatisticsRecorder::RegisterOrDeleteDuplicate(histogram)); |
| 83 // Manually delete histogram that was not registered. | 109 // Manually delete histogram that was not registered. |
| 84 DeleteHistogram(histogram); | 110 DeleteHistogram(histogram); |
| 85 | 111 |
| 86 // RegisterOrDeleteDuplicateRanges is a no-op. | 112 // RegisterOrDeleteDuplicateRanges is a no-op. |
| 87 BucketRanges* ranges = new BucketRanges(3); | 113 BucketRanges* ranges = new BucketRanges(3); |
| 88 ranges->ResetChecksum(); | 114 ranges->ResetChecksum(); |
| 89 EXPECT_EQ(ranges, | 115 EXPECT_EQ(ranges, |
| 90 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges)); | 116 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges)); |
| 91 StatisticsRecorder::GetBucketRanges(®istered_ranges); | 117 StatisticsRecorder::GetBucketRanges(®istered_ranges); |
| 92 EXPECT_EQ(0u, registered_ranges.size()); | 118 EXPECT_EQ(0u, registered_ranges.size()); |
| 93 } | 119 } |
| 94 | 120 |
| 95 TEST_F(StatisticsRecorderTest, RegisterBucketRanges) { | 121 TEST_P(StatisticsRecorderTest, RegisterBucketRanges) { |
| 96 std::vector<const BucketRanges*> registered_ranges; | 122 std::vector<const BucketRanges*> registered_ranges; |
| 97 | 123 |
| 98 BucketRanges* ranges1 = new BucketRanges(3); | 124 BucketRanges* ranges1 = new BucketRanges(3); |
| 99 ranges1->ResetChecksum(); | 125 ranges1->ResetChecksum(); |
| 100 BucketRanges* ranges2 = new BucketRanges(4); | 126 BucketRanges* ranges2 = new BucketRanges(4); |
| 101 ranges2->ResetChecksum(); | 127 ranges2->ResetChecksum(); |
| 102 | 128 |
| 103 // Register new ranges. | 129 // Register new ranges. |
| 104 EXPECT_EQ(ranges1, | 130 EXPECT_EQ(ranges1, |
| 105 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges1)); | 131 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges1)); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 123 // Register ranges with same values. | 149 // Register ranges with same values. |
| 124 BucketRanges* ranges3 = new BucketRanges(3); | 150 BucketRanges* ranges3 = new BucketRanges(3); |
| 125 ranges3->ResetChecksum(); | 151 ranges3->ResetChecksum(); |
| 126 EXPECT_EQ(ranges1, // returning ranges1 | 152 EXPECT_EQ(ranges1, // returning ranges1 |
| 127 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges3)); | 153 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges3)); |
| 128 registered_ranges.clear(); | 154 registered_ranges.clear(); |
| 129 StatisticsRecorder::GetBucketRanges(®istered_ranges); | 155 StatisticsRecorder::GetBucketRanges(®istered_ranges); |
| 130 ASSERT_EQ(2u, registered_ranges.size()); | 156 ASSERT_EQ(2u, registered_ranges.size()); |
| 131 } | 157 } |
| 132 | 158 |
| 133 TEST_F(StatisticsRecorderTest, RegisterHistogram) { | 159 TEST_P(StatisticsRecorderTest, RegisterHistogram) { |
| 134 // Create a Histogram that was not registered. | 160 // Create a Histogram that was not registered. |
| 135 Histogram* histogram = CreateHistogram("TestHistogram", 1, 1000, 10); | 161 Histogram* histogram = CreateHistogram("TestHistogram", 1, 1000, 10); |
| 136 | 162 |
| 137 StatisticsRecorder::Histograms registered_histograms; | 163 StatisticsRecorder::Histograms registered_histograms; |
| 138 StatisticsRecorder::GetHistograms(®istered_histograms); | 164 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 139 EXPECT_EQ(0u, registered_histograms.size()); | 165 EXPECT_EQ(0u, registered_histograms.size()); |
| 140 | 166 |
| 141 // Register the Histogram. | 167 // Register the Histogram. |
| 142 EXPECT_EQ(histogram, | 168 EXPECT_EQ(histogram, |
| 143 StatisticsRecorder::RegisterOrDeleteDuplicate(histogram)); | 169 StatisticsRecorder::RegisterOrDeleteDuplicate(histogram)); |
| 144 StatisticsRecorder::GetHistograms(®istered_histograms); | 170 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 145 EXPECT_EQ(1u, registered_histograms.size()); | 171 EXPECT_EQ(1u, registered_histograms.size()); |
| 146 | 172 |
| 147 // Register the same Histogram again. | 173 // Register the same Histogram again. |
| 148 EXPECT_EQ(histogram, | 174 EXPECT_EQ(histogram, |
| 149 StatisticsRecorder::RegisterOrDeleteDuplicate(histogram)); | 175 StatisticsRecorder::RegisterOrDeleteDuplicate(histogram)); |
| 150 registered_histograms.clear(); | 176 registered_histograms.clear(); |
| 151 StatisticsRecorder::GetHistograms(®istered_histograms); | 177 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 152 EXPECT_EQ(1u, registered_histograms.size()); | 178 EXPECT_EQ(1u, registered_histograms.size()); |
| 153 } | 179 } |
| 154 | 180 |
| 155 TEST_F(StatisticsRecorderTest, FindHistogram) { | 181 TEST_P(StatisticsRecorderTest, FindHistogram) { |
| 156 HistogramBase* histogram1 = Histogram::FactoryGet( | 182 HistogramBase* histogram1 = Histogram::FactoryGet( |
| 157 "TestHistogram1", 1, 1000, 10, HistogramBase::kNoFlags); | 183 "TestHistogram1", 1, 1000, 10, HistogramBase::kNoFlags); |
| 158 HistogramBase* histogram2 = Histogram::FactoryGet( | 184 HistogramBase* histogram2 = Histogram::FactoryGet( |
| 159 "TestHistogram2", 1, 1000, 10, HistogramBase::kNoFlags); | 185 "TestHistogram2", 1, 1000, 10, HistogramBase::kNoFlags); |
| 160 | 186 |
| 161 EXPECT_EQ(histogram1, StatisticsRecorder::FindHistogram("TestHistogram1")); | 187 EXPECT_EQ(histogram1, StatisticsRecorder::FindHistogram("TestHistogram1")); |
| 162 EXPECT_EQ(histogram2, StatisticsRecorder::FindHistogram("TestHistogram2")); | 188 EXPECT_EQ(histogram2, StatisticsRecorder::FindHistogram("TestHistogram2")); |
| 163 EXPECT_TRUE(StatisticsRecorder::FindHistogram("TestHistogram") == NULL); | 189 EXPECT_FALSE(StatisticsRecorder::FindHistogram("TestHistogram")); |
| 190 |
| 191 // Create a new global allocator using the same memory as the old one. Any |
| 192 // old one is kept around so the memory doesn't get released. |
| 193 old_global_allocator_ = GlobalHistogramAllocator::ReleaseForTesting(); |
| 194 if (use_persistent_histogram_allocator_) { |
| 195 GlobalHistogramAllocator::CreateWithPersistentMemory( |
| 196 const_cast<void*>(old_global_allocator_->data()), |
| 197 old_global_allocator_->length(), 0, old_global_allocator_->Id(), |
| 198 old_global_allocator_->Name()); |
| 199 } |
| 200 |
| 201 // Reset statistics-recorder to validate operation from a clean start. |
| 202 UninitializeStatisticsRecorder(); |
| 203 InitializeStatisticsRecorder(); |
| 204 |
| 205 if (use_persistent_histogram_allocator_) { |
| 206 EXPECT_TRUE(StatisticsRecorder::FindHistogram("TestHistogram1")); |
| 207 EXPECT_TRUE(StatisticsRecorder::FindHistogram("TestHistogram2")); |
| 208 } else { |
| 209 EXPECT_FALSE(StatisticsRecorder::FindHistogram("TestHistogram1")); |
| 210 EXPECT_FALSE(StatisticsRecorder::FindHistogram("TestHistogram2")); |
| 211 } |
| 212 EXPECT_FALSE(StatisticsRecorder::FindHistogram("TestHistogram")); |
| 164 } | 213 } |
| 165 | 214 |
| 166 TEST_F(StatisticsRecorderTest, GetSnapshot) { | 215 TEST_P(StatisticsRecorderTest, GetSnapshot) { |
| 167 Histogram::FactoryGet("TestHistogram1", 1, 1000, 10, Histogram::kNoFlags); | 216 Histogram::FactoryGet("TestHistogram1", 1, 1000, 10, Histogram::kNoFlags); |
| 168 Histogram::FactoryGet("TestHistogram2", 1, 1000, 10, Histogram::kNoFlags); | 217 Histogram::FactoryGet("TestHistogram2", 1, 1000, 10, Histogram::kNoFlags); |
| 169 Histogram::FactoryGet("TestHistogram3", 1, 1000, 10, Histogram::kNoFlags); | 218 Histogram::FactoryGet("TestHistogram3", 1, 1000, 10, Histogram::kNoFlags); |
| 170 | 219 |
| 171 StatisticsRecorder::Histograms snapshot; | 220 StatisticsRecorder::Histograms snapshot; |
| 172 StatisticsRecorder::GetSnapshot("Test", &snapshot); | 221 StatisticsRecorder::GetSnapshot("Test", &snapshot); |
| 173 EXPECT_EQ(3u, snapshot.size()); | 222 EXPECT_EQ(3u, snapshot.size()); |
| 174 | 223 |
| 175 snapshot.clear(); | 224 snapshot.clear(); |
| 176 StatisticsRecorder::GetSnapshot("1", &snapshot); | 225 StatisticsRecorder::GetSnapshot("1", &snapshot); |
| 177 EXPECT_EQ(1u, snapshot.size()); | 226 EXPECT_EQ(1u, snapshot.size()); |
| 178 | 227 |
| 179 snapshot.clear(); | 228 snapshot.clear(); |
| 180 StatisticsRecorder::GetSnapshot("hello", &snapshot); | 229 StatisticsRecorder::GetSnapshot("hello", &snapshot); |
| 181 EXPECT_EQ(0u, snapshot.size()); | 230 EXPECT_EQ(0u, snapshot.size()); |
| 182 } | 231 } |
| 183 | 232 |
| 184 TEST_F(StatisticsRecorderTest, RegisterHistogramWithFactoryGet) { | 233 TEST_P(StatisticsRecorderTest, RegisterHistogramWithFactoryGet) { |
| 185 StatisticsRecorder::Histograms registered_histograms; | 234 StatisticsRecorder::Histograms registered_histograms; |
| 186 | 235 |
| 187 StatisticsRecorder::GetHistograms(®istered_histograms); | 236 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 188 ASSERT_EQ(0u, registered_histograms.size()); | 237 ASSERT_EQ(0u, registered_histograms.size()); |
| 189 | 238 |
| 190 // Create a histogram. | 239 // Create a histogram. |
| 191 HistogramBase* histogram = Histogram::FactoryGet( | 240 HistogramBase* histogram = Histogram::FactoryGet( |
| 192 "TestHistogram", 1, 1000, 10, HistogramBase::kNoFlags); | 241 "TestHistogram", 1, 1000, 10, HistogramBase::kNoFlags); |
| 193 registered_histograms.clear(); | 242 registered_histograms.clear(); |
| 194 StatisticsRecorder::GetHistograms(®istered_histograms); | 243 StatisticsRecorder::GetHistograms(®istered_histograms); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 220 std::vector<int> custom_ranges; | 269 std::vector<int> custom_ranges; |
| 221 custom_ranges.push_back(1); | 270 custom_ranges.push_back(1); |
| 222 custom_ranges.push_back(5); | 271 custom_ranges.push_back(5); |
| 223 histogram = CustomHistogram::FactoryGet( | 272 histogram = CustomHistogram::FactoryGet( |
| 224 "TestCustomHistogram", custom_ranges, HistogramBase::kNoFlags); | 273 "TestCustomHistogram", custom_ranges, HistogramBase::kNoFlags); |
| 225 registered_histograms.clear(); | 274 registered_histograms.clear(); |
| 226 StatisticsRecorder::GetHistograms(®istered_histograms); | 275 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 227 EXPECT_EQ(4u, registered_histograms.size()); | 276 EXPECT_EQ(4u, registered_histograms.size()); |
| 228 } | 277 } |
| 229 | 278 |
| 230 TEST_F(StatisticsRecorderTest, RegisterHistogramWithMacros) { | 279 TEST_P(StatisticsRecorderTest, RegisterHistogramWithMacros) { |
| 280 // Macros cache pointers and so tests that use them can only be run once. |
| 281 // Stop immediately if this test has run previously. |
| 282 static bool already_run = false; |
| 283 if (already_run) |
| 284 return; |
| 285 already_run = true; |
| 286 |
| 231 StatisticsRecorder::Histograms registered_histograms; | 287 StatisticsRecorder::Histograms registered_histograms; |
| 232 | 288 |
| 233 HistogramBase* histogram = Histogram::FactoryGet( | 289 HistogramBase* histogram = Histogram::FactoryGet( |
| 234 "TestHistogramCounts", 1, 1000000, 50, HistogramBase::kNoFlags); | 290 "TestHistogramCounts", 1, 1000000, 50, HistogramBase::kNoFlags); |
| 235 | 291 |
| 236 // The histogram we got from macro is the same as from FactoryGet. | 292 // The histogram we got from macro is the same as from FactoryGet. |
| 237 LOCAL_HISTOGRAM_COUNTS("TestHistogramCounts", 30); | 293 LOCAL_HISTOGRAM_COUNTS("TestHistogramCounts", 30); |
| 238 registered_histograms.clear(); | 294 registered_histograms.clear(); |
| 239 StatisticsRecorder::GetHistograms(®istered_histograms); | 295 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 240 ASSERT_EQ(1u, registered_histograms.size()); | 296 ASSERT_EQ(1u, registered_histograms.size()); |
| 241 EXPECT_EQ(histogram, registered_histograms[0]); | 297 EXPECT_EQ(histogram, registered_histograms[0]); |
| 242 | 298 |
| 243 LOCAL_HISTOGRAM_TIMES("TestHistogramTimes", TimeDelta::FromDays(1)); | 299 LOCAL_HISTOGRAM_TIMES("TestHistogramTimes", TimeDelta::FromDays(1)); |
| 244 LOCAL_HISTOGRAM_ENUMERATION("TestHistogramEnumeration", 20, 200); | 300 LOCAL_HISTOGRAM_ENUMERATION("TestHistogramEnumeration", 20, 200); |
| 245 | 301 |
| 246 registered_histograms.clear(); | 302 registered_histograms.clear(); |
| 247 StatisticsRecorder::GetHistograms(®istered_histograms); | 303 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 248 EXPECT_EQ(3u, registered_histograms.size()); | 304 EXPECT_EQ(3u, registered_histograms.size()); |
| 249 } | 305 } |
| 250 | 306 |
| 251 TEST_F(StatisticsRecorderTest, BucketRangesSharing) { | 307 TEST_P(StatisticsRecorderTest, BucketRangesSharing) { |
| 252 std::vector<const BucketRanges*> ranges; | 308 std::vector<const BucketRanges*> ranges; |
| 253 StatisticsRecorder::GetBucketRanges(&ranges); | 309 StatisticsRecorder::GetBucketRanges(&ranges); |
| 254 EXPECT_EQ(0u, ranges.size()); | 310 EXPECT_EQ(0u, ranges.size()); |
| 255 | 311 |
| 256 Histogram::FactoryGet("Histogram", 1, 64, 8, HistogramBase::kNoFlags); | 312 Histogram::FactoryGet("Histogram", 1, 64, 8, HistogramBase::kNoFlags); |
| 257 Histogram::FactoryGet("Histogram2", 1, 64, 8, HistogramBase::kNoFlags); | 313 Histogram::FactoryGet("Histogram2", 1, 64, 8, HistogramBase::kNoFlags); |
| 258 | 314 |
| 259 StatisticsRecorder::GetBucketRanges(&ranges); | 315 StatisticsRecorder::GetBucketRanges(&ranges); |
| 260 EXPECT_EQ(1u, ranges.size()); | 316 EXPECT_EQ(1u, ranges.size()); |
| 261 | 317 |
| 262 Histogram::FactoryGet("Histogram3", 1, 64, 16, HistogramBase::kNoFlags); | 318 Histogram::FactoryGet("Histogram3", 1, 64, 16, HistogramBase::kNoFlags); |
| 263 | 319 |
| 264 ranges.clear(); | 320 ranges.clear(); |
| 265 StatisticsRecorder::GetBucketRanges(&ranges); | 321 StatisticsRecorder::GetBucketRanges(&ranges); |
| 266 EXPECT_EQ(2u, ranges.size()); | 322 EXPECT_EQ(2u, ranges.size()); |
| 267 } | 323 } |
| 268 | 324 |
| 269 TEST_F(StatisticsRecorderTest, ToJSON) { | 325 TEST_P(StatisticsRecorderTest, ToJSON) { |
| 270 LOCAL_HISTOGRAM_COUNTS("TestHistogram1", 30); | 326 Histogram::FactoryGet("TestHistogram1", 1, 1000, 50, HistogramBase::kNoFlags) |
| 271 LOCAL_HISTOGRAM_COUNTS("TestHistogram1", 40); | 327 ->Add(30); |
| 272 LOCAL_HISTOGRAM_COUNTS("TestHistogram2", 30); | 328 Histogram::FactoryGet("TestHistogram1", 1, 1000, 50, HistogramBase::kNoFlags) |
| 273 LOCAL_HISTOGRAM_COUNTS("TestHistogram2", 40); | 329 ->Add(40); |
| 330 Histogram::FactoryGet("TestHistogram2", 1, 1000, 50, HistogramBase::kNoFlags) |
| 331 ->Add(30); |
| 332 Histogram::FactoryGet("TestHistogram2", 1, 1000, 50, HistogramBase::kNoFlags) |
| 333 ->Add(40); |
| 274 | 334 |
| 275 std::string json(StatisticsRecorder::ToJSON(std::string())); | 335 std::string json(StatisticsRecorder::ToJSON(std::string())); |
| 276 | 336 |
| 277 // Check for valid JSON. | 337 // Check for valid JSON. |
| 278 std::unique_ptr<Value> root = JSONReader::Read(json); | 338 std::unique_ptr<Value> root = JSONReader::Read(json); |
| 279 ASSERT_TRUE(root.get()); | 339 ASSERT_TRUE(root.get()); |
| 280 | 340 |
| 281 DictionaryValue* root_dict = NULL; | 341 DictionaryValue* root_dict = NULL; |
| 282 ASSERT_TRUE(root->GetAsDictionary(&root_dict)); | 342 ASSERT_TRUE(root->GetAsDictionary(&root_dict)); |
| 283 | 343 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 318 EXPECT_EQ("TestHistogram2", histogram_name); | 378 EXPECT_EQ("TestHistogram2", histogram_name); |
| 319 | 379 |
| 320 json.clear(); | 380 json.clear(); |
| 321 UninitializeStatisticsRecorder(); | 381 UninitializeStatisticsRecorder(); |
| 322 | 382 |
| 323 // No data should be returned. | 383 // No data should be returned. |
| 324 json = StatisticsRecorder::ToJSON(query); | 384 json = StatisticsRecorder::ToJSON(query); |
| 325 EXPECT_TRUE(json.empty()); | 385 EXPECT_TRUE(json.empty()); |
| 326 } | 386 } |
| 327 | 387 |
| 328 TEST_F(StatisticsRecorderTest, IterationTest) { | 388 TEST_P(StatisticsRecorderTest, IterationTest) { |
| 329 StatisticsRecorder::Histograms registered_histograms; | 389 Histogram::FactoryGet("IterationTest1", 1, 64, 16, HistogramBase::kNoFlags); |
| 330 LOCAL_HISTOGRAM_COUNTS("TestHistogram.IterationTest1", 30); | 390 Histogram::FactoryGet("IterationTest2", 1, 64, 16, HistogramBase::kNoFlags); |
| 331 GlobalHistogramAllocator::CreateWithLocalMemory(64 << 10 /* 64 KiB */, 0, ""); | |
| 332 LOCAL_HISTOGRAM_COUNTS("TestHistogram.IterationTest2", 30); | |
| 333 | 391 |
| 334 StatisticsRecorder::HistogramIterator i1 = StatisticsRecorder::begin(true); | 392 StatisticsRecorder::HistogramIterator i1 = StatisticsRecorder::begin(true); |
| 335 EXPECT_NE(StatisticsRecorder::end(), i1); | 393 EXPECT_EQ(2, CountIterableHistograms(&i1)); |
| 336 EXPECT_NE(StatisticsRecorder::end(), ++i1); | |
| 337 EXPECT_EQ(StatisticsRecorder::end(), ++i1); | |
| 338 | 394 |
| 339 StatisticsRecorder::HistogramIterator i2 = StatisticsRecorder::begin(false); | 395 StatisticsRecorder::HistogramIterator i2 = StatisticsRecorder::begin(false); |
| 340 EXPECT_NE(StatisticsRecorder::end(), i2); | 396 EXPECT_EQ(use_persistent_histogram_allocator_ ? 0 : 2, |
| 341 EXPECT_EQ(StatisticsRecorder::end(), ++i2); | 397 CountIterableHistograms(&i2)); |
| 398 |
| 399 // Create a new global allocator using the same memory as the old one. Any |
| 400 // old one is kept around so the memory doesn't get released. |
| 401 old_global_allocator_ = GlobalHistogramAllocator::ReleaseForTesting(); |
| 402 if (use_persistent_histogram_allocator_) { |
| 403 GlobalHistogramAllocator::CreateWithPersistentMemory( |
| 404 const_cast<void*>(old_global_allocator_->data()), |
| 405 old_global_allocator_->length(), 0, old_global_allocator_->Id(), |
| 406 old_global_allocator_->Name()); |
| 407 } |
| 408 |
| 409 // Reset statistics-recorder to validate operation from a clean start. |
| 410 UninitializeStatisticsRecorder(); |
| 411 InitializeStatisticsRecorder(); |
| 412 |
| 413 StatisticsRecorder::HistogramIterator i3 = StatisticsRecorder::begin(true); |
| 414 EXPECT_EQ(use_persistent_histogram_allocator_ ? 2 : 0, |
| 415 CountIterableHistograms(&i3)); |
| 416 |
| 417 StatisticsRecorder::HistogramIterator i4 = StatisticsRecorder::begin(false); |
| 418 EXPECT_EQ(0, CountIterableHistograms(&i4)); |
| 342 } | 419 } |
| 343 | 420 |
| 344 namespace { | 421 namespace { |
| 345 | 422 |
| 346 // CallbackCheckWrapper is simply a convenient way to check and store that | 423 // CallbackCheckWrapper is simply a convenient way to check and store that |
| 347 // a callback was actually run. | 424 // a callback was actually run. |
| 348 struct CallbackCheckWrapper { | 425 struct CallbackCheckWrapper { |
| 349 CallbackCheckWrapper() : called(false), last_histogram_value(0) {} | 426 CallbackCheckWrapper() : called(false), last_histogram_value(0) {} |
| 350 | 427 |
| 351 void OnHistogramChanged(base::HistogramBase::Sample histogram_value) { | 428 void OnHistogramChanged(base::HistogramBase::Sample histogram_value) { |
| 352 called = true; | 429 called = true; |
| 353 last_histogram_value = histogram_value; | 430 last_histogram_value = histogram_value; |
| 354 } | 431 } |
| 355 | 432 |
| 356 bool called; | 433 bool called; |
| 357 base::HistogramBase::Sample last_histogram_value; | 434 base::HistogramBase::Sample last_histogram_value; |
| 358 }; | 435 }; |
| 359 | 436 |
| 360 } // namespace | 437 } // namespace |
| 361 | 438 |
| 362 // Check that you can't overwrite the callback with another. | 439 // Check that you can't overwrite the callback with another. |
| 363 TEST_F(StatisticsRecorderTest, SetCallbackFailsWithoutHistogramTest) { | 440 TEST_P(StatisticsRecorderTest, SetCallbackFailsWithoutHistogramTest) { |
| 364 CallbackCheckWrapper callback_wrapper; | 441 CallbackCheckWrapper callback_wrapper; |
| 365 | 442 |
| 366 bool result = base::StatisticsRecorder::SetCallback( | 443 bool result = base::StatisticsRecorder::SetCallback( |
| 367 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, | 444 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, |
| 368 base::Unretained(&callback_wrapper))); | 445 base::Unretained(&callback_wrapper))); |
| 369 EXPECT_TRUE(result); | 446 EXPECT_TRUE(result); |
| 370 | 447 |
| 371 result = base::StatisticsRecorder::SetCallback( | 448 result = base::StatisticsRecorder::SetCallback( |
| 372 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, | 449 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, |
| 373 base::Unretained(&callback_wrapper))); | 450 base::Unretained(&callback_wrapper))); |
| 374 EXPECT_FALSE(result); | 451 EXPECT_FALSE(result); |
| 375 } | 452 } |
| 376 | 453 |
| 377 // Check that you can't overwrite the callback with another. | 454 // Check that you can't overwrite the callback with another. |
| 378 TEST_F(StatisticsRecorderTest, SetCallbackFailsWithHistogramTest) { | 455 TEST_P(StatisticsRecorderTest, SetCallbackFailsWithHistogramTest) { |
| 379 HistogramBase* histogram = Histogram::FactoryGet("TestHistogram", 1, 1000, 10, | 456 HistogramBase* histogram = Histogram::FactoryGet("TestHistogram", 1, 1000, 10, |
| 380 HistogramBase::kNoFlags); | 457 HistogramBase::kNoFlags); |
| 381 EXPECT_TRUE(histogram); | 458 EXPECT_TRUE(histogram); |
| 382 | 459 |
| 383 CallbackCheckWrapper callback_wrapper; | 460 CallbackCheckWrapper callback_wrapper; |
| 384 | 461 |
| 385 bool result = base::StatisticsRecorder::SetCallback( | 462 bool result = base::StatisticsRecorder::SetCallback( |
| 386 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, | 463 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, |
| 387 base::Unretained(&callback_wrapper))); | 464 base::Unretained(&callback_wrapper))); |
| 388 EXPECT_TRUE(result); | 465 EXPECT_TRUE(result); |
| 389 EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, | 466 EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, |
| 390 base::HistogramBase::kCallbackExists); | 467 base::HistogramBase::kCallbackExists); |
| 391 | 468 |
| 392 result = base::StatisticsRecorder::SetCallback( | 469 result = base::StatisticsRecorder::SetCallback( |
| 393 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, | 470 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, |
| 394 base::Unretained(&callback_wrapper))); | 471 base::Unretained(&callback_wrapper))); |
| 395 EXPECT_FALSE(result); | 472 EXPECT_FALSE(result); |
| 396 EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, | 473 EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, |
| 397 base::HistogramBase::kCallbackExists); | 474 base::HistogramBase::kCallbackExists); |
| 398 | 475 |
| 399 histogram->Add(1); | 476 histogram->Add(1); |
| 400 | 477 |
| 401 EXPECT_TRUE(callback_wrapper.called); | 478 EXPECT_TRUE(callback_wrapper.called); |
| 402 } | 479 } |
| 403 | 480 |
| 404 // Check that you can't overwrite the callback with another. | 481 // Check that you can't overwrite the callback with another. |
| 405 TEST_F(StatisticsRecorderTest, ClearCallbackSuceedsWithHistogramTest) { | 482 TEST_P(StatisticsRecorderTest, ClearCallbackSuceedsWithHistogramTest) { |
| 406 HistogramBase* histogram = Histogram::FactoryGet("TestHistogram", 1, 1000, 10, | 483 HistogramBase* histogram = Histogram::FactoryGet("TestHistogram", 1, 1000, 10, |
| 407 HistogramBase::kNoFlags); | 484 HistogramBase::kNoFlags); |
| 408 EXPECT_TRUE(histogram); | 485 EXPECT_TRUE(histogram); |
| 409 | 486 |
| 410 CallbackCheckWrapper callback_wrapper; | 487 CallbackCheckWrapper callback_wrapper; |
| 411 | 488 |
| 412 bool result = base::StatisticsRecorder::SetCallback( | 489 bool result = base::StatisticsRecorder::SetCallback( |
| 413 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, | 490 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, |
| 414 base::Unretained(&callback_wrapper))); | 491 base::Unretained(&callback_wrapper))); |
| 415 EXPECT_TRUE(result); | 492 EXPECT_TRUE(result); |
| 416 EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, | 493 EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, |
| 417 base::HistogramBase::kCallbackExists); | 494 base::HistogramBase::kCallbackExists); |
| 418 | 495 |
| 419 base::StatisticsRecorder::ClearCallback("TestHistogram"); | 496 base::StatisticsRecorder::ClearCallback("TestHistogram"); |
| 420 EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, 0); | 497 EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, 0); |
| 421 | 498 |
| 422 histogram->Add(1); | 499 histogram->Add(1); |
| 423 | 500 |
| 424 EXPECT_FALSE(callback_wrapper.called); | 501 EXPECT_FALSE(callback_wrapper.called); |
| 425 } | 502 } |
| 426 | 503 |
| 427 // Check that callback is used. | 504 // Check that callback is used. |
| 428 TEST_F(StatisticsRecorderTest, CallbackUsedTest) { | 505 TEST_P(StatisticsRecorderTest, CallbackUsedTest) { |
| 429 { | 506 { |
| 430 HistogramBase* histogram = Histogram::FactoryGet( | 507 HistogramBase* histogram = Histogram::FactoryGet( |
| 431 "TestHistogram", 1, 1000, 10, HistogramBase::kNoFlags); | 508 "TestHistogram", 1, 1000, 10, HistogramBase::kNoFlags); |
| 432 EXPECT_TRUE(histogram); | 509 EXPECT_TRUE(histogram); |
| 433 | 510 |
| 434 CallbackCheckWrapper callback_wrapper; | 511 CallbackCheckWrapper callback_wrapper; |
| 435 | 512 |
| 436 base::StatisticsRecorder::SetCallback( | 513 base::StatisticsRecorder::SetCallback( |
| 437 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, | 514 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, |
| 438 base::Unretained(&callback_wrapper))); | 515 base::Unretained(&callback_wrapper))); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 base::Unretained(&callback_wrapper))); | 569 base::Unretained(&callback_wrapper))); |
| 493 | 570 |
| 494 custom_histogram->Add(1); | 571 custom_histogram->Add(1); |
| 495 | 572 |
| 496 EXPECT_TRUE(callback_wrapper.called); | 573 EXPECT_TRUE(callback_wrapper.called); |
| 497 EXPECT_EQ(callback_wrapper.last_histogram_value, 1); | 574 EXPECT_EQ(callback_wrapper.last_histogram_value, 1); |
| 498 } | 575 } |
| 499 } | 576 } |
| 500 | 577 |
| 501 // Check that setting a callback before the histogram exists works. | 578 // Check that setting a callback before the histogram exists works. |
| 502 TEST_F(StatisticsRecorderTest, CallbackUsedBeforeHistogramCreatedTest) { | 579 TEST_P(StatisticsRecorderTest, CallbackUsedBeforeHistogramCreatedTest) { |
| 503 CallbackCheckWrapper callback_wrapper; | 580 CallbackCheckWrapper callback_wrapper; |
| 504 | 581 |
| 505 base::StatisticsRecorder::SetCallback( | 582 base::StatisticsRecorder::SetCallback( |
| 506 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, | 583 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, |
| 507 base::Unretained(&callback_wrapper))); | 584 base::Unretained(&callback_wrapper))); |
| 508 | 585 |
| 509 HistogramBase* histogram = Histogram::FactoryGet("TestHistogram", 1, 1000, 10, | 586 HistogramBase* histogram = Histogram::FactoryGet("TestHistogram", 1, 1000, 10, |
| 510 HistogramBase::kNoFlags); | 587 HistogramBase::kNoFlags); |
| 511 EXPECT_TRUE(histogram); | 588 EXPECT_TRUE(histogram); |
| 512 histogram->Add(1); | 589 histogram->Add(1); |
| 513 | 590 |
| 514 EXPECT_TRUE(callback_wrapper.called); | 591 EXPECT_TRUE(callback_wrapper.called); |
| 515 EXPECT_EQ(callback_wrapper.last_histogram_value, 1); | 592 EXPECT_EQ(callback_wrapper.last_histogram_value, 1); |
| 516 } | 593 } |
| 517 | 594 |
| 518 } // namespace base | 595 } // namespace base |
| OLD | NEW |