Chromium Code Reviews| 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_) | |
|
Alexei Svitkine (slow)
2016/04/11 14:51:34
Nit: {}
bcwhite
2016/04/12 00:32:02
Done.
| |
| 37 GlobalHistogramAllocator::CreateWithLocalMemory( | |
| 38 kAllocatorMemorySize, 0, "StatisticsRecorderTest"); | |
| 31 } | 39 } |
| 32 | 40 |
| 33 void TearDown() override { | 41 ~StatisticsRecorderTest() override { |
| 42 GlobalHistogramAllocator::ReleaseForTesting(); | |
| 34 UninitializeStatisticsRecorder(); | 43 UninitializeStatisticsRecorder(); |
| 35 GlobalHistogramAllocator::ReleaseForTesting(); | |
| 36 } | 44 } |
| 37 | 45 |
| 38 void InitializeStatisticsRecorder() { | 46 void InitializeStatisticsRecorder() { |
| 39 DCHECK(!statistics_recorder_); | 47 DCHECK(!statistics_recorder_); |
| 40 StatisticsRecorder::UninitializeForTesting(); | 48 StatisticsRecorder::UninitializeForTesting(); |
| 41 statistics_recorder_.reset(new StatisticsRecorder()); | 49 statistics_recorder_.reset(new StatisticsRecorder()); |
| 42 } | 50 } |
| 43 | 51 |
| 44 void UninitializeStatisticsRecorder() { | 52 void UninitializeStatisticsRecorder() { |
| 45 statistics_recorder_.reset(); | 53 statistics_recorder_.reset(); |
| 46 StatisticsRecorder::UninitializeForTesting(); | 54 StatisticsRecorder::UninitializeForTesting(); |
| 47 } | 55 } |
| 48 | 56 |
| 49 Histogram* CreateHistogram(const std::string& name, | 57 Histogram* CreateHistogram(const std::string& name, |
| 50 HistogramBase::Sample min, | 58 HistogramBase::Sample min, |
| 51 HistogramBase::Sample max, | 59 HistogramBase::Sample max, |
| 52 size_t bucket_count) { | 60 size_t bucket_count) { |
| 53 BucketRanges* ranges = new BucketRanges(bucket_count + 1); | 61 BucketRanges* ranges = new BucketRanges(bucket_count + 1); |
| 54 Histogram::InitializeBucketRanges(min, max, ranges); | 62 Histogram::InitializeBucketRanges(min, max, ranges); |
| 55 const BucketRanges* registered_ranges = | 63 const BucketRanges* registered_ranges = |
| 56 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges); | 64 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges); |
| 57 return new Histogram(name, min, max, registered_ranges); | 65 return new Histogram(name, min, max, registered_ranges); |
| 58 } | 66 } |
| 59 | 67 |
| 60 void DeleteHistogram(HistogramBase* histogram) { | 68 void DeleteHistogram(HistogramBase* histogram) { |
| 61 delete histogram; | 69 delete histogram; |
| 62 } | 70 } |
| 63 | 71 |
| 72 int CountIterableHistograms(StatisticsRecorder::HistogramIterator& iter) { | |
|
Alexei Svitkine (slow)
2016/04/11 14:51:34
Nit: Non-const ref as function params are discoura
bcwhite
2016/04/12 00:32:02
Done.
| |
| 73 int count = 0; | |
| 74 for (; iter != StatisticsRecorder::end(); ++iter) { | |
| 75 ++count; | |
| 76 } | |
| 77 return count; | |
| 78 } | |
| 79 | |
| 80 const bool use_persistent_histogram_allocator_; | |
| 81 | |
| 64 std::unique_ptr<StatisticsRecorder> statistics_recorder_; | 82 std::unique_ptr<StatisticsRecorder> statistics_recorder_; |
| 83 | |
| 84 private: | |
| 85 DISALLOW_COPY_AND_ASSIGN(StatisticsRecorderTest); | |
| 65 }; | 86 }; |
| 66 | 87 |
| 67 TEST_F(StatisticsRecorderTest, NotInitialized) { | 88 // Run all HistogramTest cases with both heap and persistent memory. |
| 89 INSTANTIATE_TEST_CASE_P(Allocator, StatisticsRecorderTest, testing::Bool()); | |
| 90 | |
| 91 TEST_P(StatisticsRecorderTest, NotInitialized) { | |
| 68 UninitializeStatisticsRecorder(); | 92 UninitializeStatisticsRecorder(); |
| 69 | 93 |
| 70 ASSERT_FALSE(StatisticsRecorder::IsActive()); | 94 ASSERT_FALSE(StatisticsRecorder::IsActive()); |
| 71 | 95 |
| 72 StatisticsRecorder::Histograms registered_histograms; | 96 StatisticsRecorder::Histograms registered_histograms; |
| 73 std::vector<const BucketRanges*> registered_ranges; | 97 std::vector<const BucketRanges*> registered_ranges; |
| 74 | 98 |
| 75 StatisticsRecorder::GetHistograms(®istered_histograms); | 99 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 76 EXPECT_EQ(0u, registered_histograms.size()); | 100 EXPECT_EQ(0u, registered_histograms.size()); |
| 77 | 101 |
| 78 Histogram* histogram = CreateHistogram("TestHistogram", 1, 1000, 10); | 102 Histogram* histogram = CreateHistogram("TestHistogram", 1, 1000, 10); |
| 79 | 103 |
| 80 // When StatisticsRecorder is not initialized, register is a noop. | 104 // When StatisticsRecorder is not initialized, register is a noop. |
| 81 EXPECT_EQ(histogram, | 105 EXPECT_EQ(histogram, |
| 82 StatisticsRecorder::RegisterOrDeleteDuplicate(histogram)); | 106 StatisticsRecorder::RegisterOrDeleteDuplicate(histogram)); |
| 83 // Manually delete histogram that was not registered. | 107 // Manually delete histogram that was not registered. |
| 84 DeleteHistogram(histogram); | 108 DeleteHistogram(histogram); |
| 85 | 109 |
| 86 // RegisterOrDeleteDuplicateRanges is a no-op. | 110 // RegisterOrDeleteDuplicateRanges is a no-op. |
| 87 BucketRanges* ranges = new BucketRanges(3); | 111 BucketRanges* ranges = new BucketRanges(3); |
| 88 ranges->ResetChecksum(); | 112 ranges->ResetChecksum(); |
| 89 EXPECT_EQ(ranges, | 113 EXPECT_EQ(ranges, |
| 90 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges)); | 114 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges)); |
| 91 StatisticsRecorder::GetBucketRanges(®istered_ranges); | 115 StatisticsRecorder::GetBucketRanges(®istered_ranges); |
| 92 EXPECT_EQ(0u, registered_ranges.size()); | 116 EXPECT_EQ(0u, registered_ranges.size()); |
| 93 } | 117 } |
| 94 | 118 |
| 95 TEST_F(StatisticsRecorderTest, RegisterBucketRanges) { | 119 TEST_P(StatisticsRecorderTest, RegisterBucketRanges) { |
| 96 std::vector<const BucketRanges*> registered_ranges; | 120 std::vector<const BucketRanges*> registered_ranges; |
| 97 | 121 |
| 98 BucketRanges* ranges1 = new BucketRanges(3); | 122 BucketRanges* ranges1 = new BucketRanges(3); |
| 99 ranges1->ResetChecksum(); | 123 ranges1->ResetChecksum(); |
| 100 BucketRanges* ranges2 = new BucketRanges(4); | 124 BucketRanges* ranges2 = new BucketRanges(4); |
| 101 ranges2->ResetChecksum(); | 125 ranges2->ResetChecksum(); |
| 102 | 126 |
| 103 // Register new ranges. | 127 // Register new ranges. |
| 104 EXPECT_EQ(ranges1, | 128 EXPECT_EQ(ranges1, |
| 105 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges1)); | 129 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges1)); |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 123 // Register ranges with same values. | 147 // Register ranges with same values. |
| 124 BucketRanges* ranges3 = new BucketRanges(3); | 148 BucketRanges* ranges3 = new BucketRanges(3); |
| 125 ranges3->ResetChecksum(); | 149 ranges3->ResetChecksum(); |
| 126 EXPECT_EQ(ranges1, // returning ranges1 | 150 EXPECT_EQ(ranges1, // returning ranges1 |
| 127 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges3)); | 151 StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges3)); |
| 128 registered_ranges.clear(); | 152 registered_ranges.clear(); |
| 129 StatisticsRecorder::GetBucketRanges(®istered_ranges); | 153 StatisticsRecorder::GetBucketRanges(®istered_ranges); |
| 130 ASSERT_EQ(2u, registered_ranges.size()); | 154 ASSERT_EQ(2u, registered_ranges.size()); |
| 131 } | 155 } |
| 132 | 156 |
| 133 TEST_F(StatisticsRecorderTest, RegisterHistogram) { | 157 TEST_P(StatisticsRecorderTest, RegisterHistogram) { |
| 134 // Create a Histogram that was not registered. | 158 // Create a Histogram that was not registered. |
| 135 Histogram* histogram = CreateHistogram("TestHistogram", 1, 1000, 10); | 159 Histogram* histogram = CreateHistogram("TestHistogram", 1, 1000, 10); |
| 136 | 160 |
| 137 StatisticsRecorder::Histograms registered_histograms; | 161 StatisticsRecorder::Histograms registered_histograms; |
| 138 StatisticsRecorder::GetHistograms(®istered_histograms); | 162 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 139 EXPECT_EQ(0u, registered_histograms.size()); | 163 EXPECT_EQ(0u, registered_histograms.size()); |
| 140 | 164 |
| 141 // Register the Histogram. | 165 // Register the Histogram. |
| 142 EXPECT_EQ(histogram, | 166 EXPECT_EQ(histogram, |
| 143 StatisticsRecorder::RegisterOrDeleteDuplicate(histogram)); | 167 StatisticsRecorder::RegisterOrDeleteDuplicate(histogram)); |
| 144 StatisticsRecorder::GetHistograms(®istered_histograms); | 168 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 145 EXPECT_EQ(1u, registered_histograms.size()); | 169 EXPECT_EQ(1u, registered_histograms.size()); |
| 146 | 170 |
| 147 // Register the same Histogram again. | 171 // Register the same Histogram again. |
| 148 EXPECT_EQ(histogram, | 172 EXPECT_EQ(histogram, |
| 149 StatisticsRecorder::RegisterOrDeleteDuplicate(histogram)); | 173 StatisticsRecorder::RegisterOrDeleteDuplicate(histogram)); |
| 150 registered_histograms.clear(); | 174 registered_histograms.clear(); |
| 151 StatisticsRecorder::GetHistograms(®istered_histograms); | 175 StatisticsRecorder::GetHistograms(®istered_histograms); |
| 152 EXPECT_EQ(1u, registered_histograms.size()); | 176 EXPECT_EQ(1u, registered_histograms.size()); |
| 153 } | 177 } |
| 154 | 178 |
| 155 TEST_F(StatisticsRecorderTest, FindHistogram) { | 179 TEST_P(StatisticsRecorderTest, FindHistogram) { |
| 156 HistogramBase* histogram1 = Histogram::FactoryGet( | 180 HistogramBase* histogram1 = Histogram::FactoryGet( |
| 157 "TestHistogram1", 1, 1000, 10, HistogramBase::kNoFlags); | 181 "TestHistogram1", 1, 1000, 10, HistogramBase::kNoFlags); |
| 158 HistogramBase* histogram2 = Histogram::FactoryGet( | 182 HistogramBase* histogram2 = Histogram::FactoryGet( |
| 159 "TestHistogram2", 1, 1000, 10, HistogramBase::kNoFlags); | 183 "TestHistogram2", 1, 1000, 10, HistogramBase::kNoFlags); |
| 160 | 184 |
| 161 EXPECT_EQ(histogram1, StatisticsRecorder::FindHistogram("TestHistogram1")); | 185 EXPECT_EQ(histogram1, StatisticsRecorder::FindHistogram("TestHistogram1")); |
| 162 EXPECT_EQ(histogram2, StatisticsRecorder::FindHistogram("TestHistogram2")); | 186 EXPECT_EQ(histogram2, StatisticsRecorder::FindHistogram("TestHistogram2")); |
| 163 EXPECT_TRUE(StatisticsRecorder::FindHistogram("TestHistogram") == NULL); | 187 EXPECT_FALSE(StatisticsRecorder::FindHistogram("TestHistogram")); |
| 188 | |
| 189 // Create a new global allocator using the same memory as the old one. Any | |
| 190 // old one is kept around so the memory doesn't get released. The two | |
| 191 // objects will get released in a backwards order but this is okay because | |
| 192 // the destructors aren't allowed to access the underlying memory segment. | |
| 193 std::unique_ptr<GlobalHistogramAllocator> old_global = | |
| 194 GlobalHistogramAllocator::ReleaseForTesting(); | |
| 195 if (use_persistent_histogram_allocator_) { | |
| 196 GlobalHistogramAllocator::CreateWithPersistentMemory( | |
| 197 const_cast<void*>(old_global->data()), old_global->length(), 0, | |
| 198 old_global->Id(), old_global->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. The two | |
| 401 // objects will get released in a backwards order but this is okay because | |
| 402 // the destructors aren't allowed to access the underlying memory segment. | |
| 403 std::unique_ptr<GlobalHistogramAllocator> old_global = | |
| 404 GlobalHistogramAllocator::ReleaseForTesting(); | |
| 405 if (use_persistent_histogram_allocator_) { | |
| 406 GlobalHistogramAllocator::CreateWithPersistentMemory( | |
| 407 const_cast<void*>(old_global->data()), old_global->length(), 0, | |
| 408 old_global->Id(), old_global->Name()); | |
| 409 } | |
| 410 | |
| 411 // Reset statistics-recorder to validate operation from a clean start. | |
| 412 UninitializeStatisticsRecorder(); | |
| 413 InitializeStatisticsRecorder(); | |
| 414 | |
| 415 StatisticsRecorder::HistogramIterator i3 = StatisticsRecorder::begin(true); | |
| 416 EXPECT_EQ(use_persistent_histogram_allocator_ ? 2 : 0, | |
| 417 CountIterableHistograms(i3)); | |
| 418 | |
| 419 StatisticsRecorder::HistogramIterator i4 = StatisticsRecorder::begin(false); | |
| 420 EXPECT_EQ(0, CountIterableHistograms(i4)); | |
| 342 } | 421 } |
| 343 | 422 |
| 344 namespace { | 423 namespace { |
| 345 | 424 |
| 346 // CallbackCheckWrapper is simply a convenient way to check and store that | 425 // CallbackCheckWrapper is simply a convenient way to check and store that |
| 347 // a callback was actually run. | 426 // a callback was actually run. |
| 348 struct CallbackCheckWrapper { | 427 struct CallbackCheckWrapper { |
| 349 CallbackCheckWrapper() : called(false), last_histogram_value(0) {} | 428 CallbackCheckWrapper() : called(false), last_histogram_value(0) {} |
| 350 | 429 |
| 351 void OnHistogramChanged(base::HistogramBase::Sample histogram_value) { | 430 void OnHistogramChanged(base::HistogramBase::Sample histogram_value) { |
| 352 called = true; | 431 called = true; |
| 353 last_histogram_value = histogram_value; | 432 last_histogram_value = histogram_value; |
| 354 } | 433 } |
| 355 | 434 |
| 356 bool called; | 435 bool called; |
| 357 base::HistogramBase::Sample last_histogram_value; | 436 base::HistogramBase::Sample last_histogram_value; |
| 358 }; | 437 }; |
| 359 | 438 |
| 360 } // namespace | 439 } // namespace |
| 361 | 440 |
| 362 // Check that you can't overwrite the callback with another. | 441 // Check that you can't overwrite the callback with another. |
| 363 TEST_F(StatisticsRecorderTest, SetCallbackFailsWithoutHistogramTest) { | 442 TEST_P(StatisticsRecorderTest, SetCallbackFailsWithoutHistogramTest) { |
| 364 CallbackCheckWrapper callback_wrapper; | 443 CallbackCheckWrapper callback_wrapper; |
| 365 | 444 |
| 366 bool result = base::StatisticsRecorder::SetCallback( | 445 bool result = base::StatisticsRecorder::SetCallback( |
| 367 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, | 446 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, |
| 368 base::Unretained(&callback_wrapper))); | 447 base::Unretained(&callback_wrapper))); |
| 369 EXPECT_TRUE(result); | 448 EXPECT_TRUE(result); |
| 370 | 449 |
| 371 result = base::StatisticsRecorder::SetCallback( | 450 result = base::StatisticsRecorder::SetCallback( |
| 372 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, | 451 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, |
| 373 base::Unretained(&callback_wrapper))); | 452 base::Unretained(&callback_wrapper))); |
| 374 EXPECT_FALSE(result); | 453 EXPECT_FALSE(result); |
| 375 } | 454 } |
| 376 | 455 |
| 377 // Check that you can't overwrite the callback with another. | 456 // Check that you can't overwrite the callback with another. |
| 378 TEST_F(StatisticsRecorderTest, SetCallbackFailsWithHistogramTest) { | 457 TEST_P(StatisticsRecorderTest, SetCallbackFailsWithHistogramTest) { |
| 379 HistogramBase* histogram = Histogram::FactoryGet("TestHistogram", 1, 1000, 10, | 458 HistogramBase* histogram = Histogram::FactoryGet("TestHistogram", 1, 1000, 10, |
| 380 HistogramBase::kNoFlags); | 459 HistogramBase::kNoFlags); |
| 381 EXPECT_TRUE(histogram); | 460 EXPECT_TRUE(histogram); |
| 382 | 461 |
| 383 CallbackCheckWrapper callback_wrapper; | 462 CallbackCheckWrapper callback_wrapper; |
| 384 | 463 |
| 385 bool result = base::StatisticsRecorder::SetCallback( | 464 bool result = base::StatisticsRecorder::SetCallback( |
| 386 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, | 465 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, |
| 387 base::Unretained(&callback_wrapper))); | 466 base::Unretained(&callback_wrapper))); |
| 388 EXPECT_TRUE(result); | 467 EXPECT_TRUE(result); |
| 389 EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, | 468 EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, |
| 390 base::HistogramBase::kCallbackExists); | 469 base::HistogramBase::kCallbackExists); |
| 391 | 470 |
| 392 result = base::StatisticsRecorder::SetCallback( | 471 result = base::StatisticsRecorder::SetCallback( |
| 393 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, | 472 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, |
| 394 base::Unretained(&callback_wrapper))); | 473 base::Unretained(&callback_wrapper))); |
| 395 EXPECT_FALSE(result); | 474 EXPECT_FALSE(result); |
| 396 EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, | 475 EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, |
| 397 base::HistogramBase::kCallbackExists); | 476 base::HistogramBase::kCallbackExists); |
| 398 | 477 |
| 399 histogram->Add(1); | 478 histogram->Add(1); |
| 400 | 479 |
| 401 EXPECT_TRUE(callback_wrapper.called); | 480 EXPECT_TRUE(callback_wrapper.called); |
| 402 } | 481 } |
| 403 | 482 |
| 404 // Check that you can't overwrite the callback with another. | 483 // Check that you can't overwrite the callback with another. |
| 405 TEST_F(StatisticsRecorderTest, ClearCallbackSuceedsWithHistogramTest) { | 484 TEST_P(StatisticsRecorderTest, ClearCallbackSuceedsWithHistogramTest) { |
| 406 HistogramBase* histogram = Histogram::FactoryGet("TestHistogram", 1, 1000, 10, | 485 HistogramBase* histogram = Histogram::FactoryGet("TestHistogram", 1, 1000, 10, |
| 407 HistogramBase::kNoFlags); | 486 HistogramBase::kNoFlags); |
| 408 EXPECT_TRUE(histogram); | 487 EXPECT_TRUE(histogram); |
| 409 | 488 |
| 410 CallbackCheckWrapper callback_wrapper; | 489 CallbackCheckWrapper callback_wrapper; |
| 411 | 490 |
| 412 bool result = base::StatisticsRecorder::SetCallback( | 491 bool result = base::StatisticsRecorder::SetCallback( |
| 413 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, | 492 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, |
| 414 base::Unretained(&callback_wrapper))); | 493 base::Unretained(&callback_wrapper))); |
| 415 EXPECT_TRUE(result); | 494 EXPECT_TRUE(result); |
| 416 EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, | 495 EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, |
| 417 base::HistogramBase::kCallbackExists); | 496 base::HistogramBase::kCallbackExists); |
| 418 | 497 |
| 419 base::StatisticsRecorder::ClearCallback("TestHistogram"); | 498 base::StatisticsRecorder::ClearCallback("TestHistogram"); |
| 420 EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, 0); | 499 EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, 0); |
| 421 | 500 |
| 422 histogram->Add(1); | 501 histogram->Add(1); |
| 423 | 502 |
| 424 EXPECT_FALSE(callback_wrapper.called); | 503 EXPECT_FALSE(callback_wrapper.called); |
| 425 } | 504 } |
| 426 | 505 |
| 427 // Check that callback is used. | 506 // Check that callback is used. |
| 428 TEST_F(StatisticsRecorderTest, CallbackUsedTest) { | 507 TEST_P(StatisticsRecorderTest, CallbackUsedTest) { |
| 429 { | 508 { |
| 430 HistogramBase* histogram = Histogram::FactoryGet( | 509 HistogramBase* histogram = Histogram::FactoryGet( |
| 431 "TestHistogram", 1, 1000, 10, HistogramBase::kNoFlags); | 510 "TestHistogram", 1, 1000, 10, HistogramBase::kNoFlags); |
| 432 EXPECT_TRUE(histogram); | 511 EXPECT_TRUE(histogram); |
| 433 | 512 |
| 434 CallbackCheckWrapper callback_wrapper; | 513 CallbackCheckWrapper callback_wrapper; |
| 435 | 514 |
| 436 base::StatisticsRecorder::SetCallback( | 515 base::StatisticsRecorder::SetCallback( |
| 437 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, | 516 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, |
| 438 base::Unretained(&callback_wrapper))); | 517 base::Unretained(&callback_wrapper))); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 492 base::Unretained(&callback_wrapper))); | 571 base::Unretained(&callback_wrapper))); |
| 493 | 572 |
| 494 custom_histogram->Add(1); | 573 custom_histogram->Add(1); |
| 495 | 574 |
| 496 EXPECT_TRUE(callback_wrapper.called); | 575 EXPECT_TRUE(callback_wrapper.called); |
| 497 EXPECT_EQ(callback_wrapper.last_histogram_value, 1); | 576 EXPECT_EQ(callback_wrapper.last_histogram_value, 1); |
| 498 } | 577 } |
| 499 } | 578 } |
| 500 | 579 |
| 501 // Check that setting a callback before the histogram exists works. | 580 // Check that setting a callback before the histogram exists works. |
| 502 TEST_F(StatisticsRecorderTest, CallbackUsedBeforeHistogramCreatedTest) { | 581 TEST_P(StatisticsRecorderTest, CallbackUsedBeforeHistogramCreatedTest) { |
| 503 CallbackCheckWrapper callback_wrapper; | 582 CallbackCheckWrapper callback_wrapper; |
| 504 | 583 |
| 505 base::StatisticsRecorder::SetCallback( | 584 base::StatisticsRecorder::SetCallback( |
| 506 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, | 585 "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged, |
| 507 base::Unretained(&callback_wrapper))); | 586 base::Unretained(&callback_wrapper))); |
| 508 | 587 |
| 509 HistogramBase* histogram = Histogram::FactoryGet("TestHistogram", 1, 1000, 10, | 588 HistogramBase* histogram = Histogram::FactoryGet("TestHistogram", 1, 1000, 10, |
| 510 HistogramBase::kNoFlags); | 589 HistogramBase::kNoFlags); |
| 511 EXPECT_TRUE(histogram); | 590 EXPECT_TRUE(histogram); |
| 512 histogram->Add(1); | 591 histogram->Add(1); |
| 513 | 592 |
| 514 EXPECT_TRUE(callback_wrapper.called); | 593 EXPECT_TRUE(callback_wrapper.called); |
| 515 EXPECT_EQ(callback_wrapper.last_histogram_value, 1); | 594 EXPECT_EQ(callback_wrapper.last_histogram_value, 1); |
| 516 } | 595 } |
| 517 | 596 |
| 518 } // namespace base | 597 } // namespace base |
| OLD | NEW |