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 // Test of Histogram class | 5 // Test of Histogram class |
| 6 | 6 |
| 7 #include <climits> | 7 #include <climits> |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
| 13 #include "base/metrics/bucket_ranges.h" | 13 #include "base/metrics/bucket_ranges.h" |
| 14 #include "base/metrics/histogram.h" | 14 #include "base/metrics/histogram.h" |
| 15 #include "base/metrics/sample_vector.h" | 15 #include "base/metrics/sample_vector.h" |
| 16 #include "base/metrics/statistics_recorder.h" | 16 #include "base/metrics/statistics_recorder.h" |
| 17 #include "base/pickle.h" | |
| 17 #include "base/time.h" | 18 #include "base/time.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| 19 | 20 |
| 20 using std::vector; | 21 using std::vector; |
| 21 | 22 |
| 22 namespace base { | 23 namespace base { |
| 23 | 24 |
| 24 class HistogramTest : public testing::Test { | 25 class HistogramTest : public testing::Test { |
| 25 protected: | 26 protected: |
| 26 virtual void SetUp() { | 27 virtual void SetUp() { |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 42 statistics_recorder_ = NULL; | 43 statistics_recorder_ = NULL; |
| 43 } | 44 } |
| 44 | 45 |
| 45 StatisticsRecorder* statistics_recorder_; | 46 StatisticsRecorder* statistics_recorder_; |
| 46 }; | 47 }; |
| 47 | 48 |
| 48 // Check for basic syntax and use. | 49 // Check for basic syntax and use. |
| 49 TEST_F(HistogramTest, BasicTest) { | 50 TEST_F(HistogramTest, BasicTest) { |
| 50 // Try basic construction | 51 // Try basic construction |
| 51 Histogram* histogram(Histogram::FactoryGet( | 52 Histogram* histogram(Histogram::FactoryGet( |
| 52 "TestHistogram", 1, 1000, 10, Histogram::kNoFlags)); | 53 "TestHistogram", 1, 1000, 10, HistogramBase::kNoFlags)); |
| 53 EXPECT_NE(reinterpret_cast<Histogram*>(NULL), histogram); | 54 EXPECT_NE(reinterpret_cast<Histogram*>(NULL), histogram); |
| 54 | 55 |
| 55 Histogram* linear_histogram(LinearHistogram::FactoryGet( | 56 Histogram* linear_histogram(LinearHistogram::FactoryGet( |
| 56 "TestLinearHistogram", 1, 1000, 10, Histogram::kNoFlags)); | 57 "TestLinearHistogram", 1, 1000, 10, HistogramBase::kNoFlags)); |
| 57 EXPECT_NE(reinterpret_cast<Histogram*>(NULL), linear_histogram); | 58 EXPECT_NE(reinterpret_cast<Histogram*>(NULL), linear_histogram); |
| 58 | 59 |
| 59 vector<int> custom_ranges; | 60 vector<int> custom_ranges; |
| 60 custom_ranges.push_back(1); | 61 custom_ranges.push_back(1); |
| 61 custom_ranges.push_back(5); | 62 custom_ranges.push_back(5); |
| 62 Histogram* custom_histogram(CustomHistogram::FactoryGet( | 63 Histogram* custom_histogram(CustomHistogram::FactoryGet( |
| 63 "TestCustomHistogram", custom_ranges, Histogram::kNoFlags)); | 64 "TestCustomHistogram", custom_ranges, HistogramBase::kNoFlags)); |
| 64 EXPECT_NE(reinterpret_cast<Histogram*>(NULL), custom_histogram); | 65 EXPECT_NE(reinterpret_cast<Histogram*>(NULL), custom_histogram); |
| 65 | 66 |
| 66 // Use standard macros (but with fixed samples) | 67 // Use standard macros (but with fixed samples) |
| 67 HISTOGRAM_TIMES("Test2Histogram", TimeDelta::FromDays(1)); | 68 HISTOGRAM_TIMES("Test2Histogram", TimeDelta::FromDays(1)); |
| 68 HISTOGRAM_COUNTS("Test3Histogram", 30); | 69 HISTOGRAM_COUNTS("Test3Histogram", 30); |
| 69 | 70 |
| 70 DHISTOGRAM_TIMES("Test4Histogram", TimeDelta::FromDays(1)); | 71 DHISTOGRAM_TIMES("Test4Histogram", TimeDelta::FromDays(1)); |
| 71 DHISTOGRAM_COUNTS("Test5Histogram", 30); | 72 DHISTOGRAM_COUNTS("Test5Histogram", 30); |
| 72 | 73 |
| 73 HISTOGRAM_ENUMERATION("Test6Histogram", 129, 130); | 74 HISTOGRAM_ENUMERATION("Test6Histogram", 129, 130); |
| 74 } | 75 } |
| 75 | 76 |
| 76 // Check that the macro correctly matches histograms by name and records their | 77 // Check that the macro correctly matches histograms by name and records their |
| 77 // data together. | 78 // data together. |
| 78 TEST_F(HistogramTest, NameMatchTest) { | 79 TEST_F(HistogramTest, NameMatchTest) { |
| 79 HISTOGRAM_PERCENTAGE("DuplicatedHistogram", 10); | 80 HISTOGRAM_PERCENTAGE("DuplicatedHistogram", 10); |
| 80 HISTOGRAM_PERCENTAGE("DuplicatedHistogram", 10); | 81 HISTOGRAM_PERCENTAGE("DuplicatedHistogram", 10); |
| 81 Histogram* histogram(LinearHistogram::FactoryGet( | 82 Histogram* histogram(LinearHistogram::FactoryGet( |
| 82 "DuplicatedHistogram", 1, 101, 102, Histogram::kNoFlags)); | 83 "DuplicatedHistogram", 1, 101, 102, HistogramBase::kNoFlags)); |
| 83 scoped_ptr<SampleVector> samples = histogram->SnapshotSampleVector(); | 84 scoped_ptr<SampleVector> samples = histogram->SnapshotSampleVector(); |
| 84 EXPECT_EQ(2, samples->TotalCount()); | 85 EXPECT_EQ(2, samples->TotalCount()); |
| 85 EXPECT_EQ(2, samples->GetCountAtIndex(10)); | 86 EXPECT_EQ(2, samples->GetCountAtIndex(10)); |
| 86 } | 87 } |
| 87 | 88 |
| 88 TEST_F(HistogramTest, ExponentialRangesTest) { | 89 TEST_F(HistogramTest, ExponentialRangesTest) { |
| 89 // Check that we got a nice exponential when there was enough rooom. | 90 // Check that we got a nice exponential when there was enough rooom. |
| 90 BucketRanges ranges(9); | 91 BucketRanges ranges(9); |
| 91 Histogram::InitializeBucketRanges(1, 64, 8, &ranges); | 92 Histogram::InitializeBucketRanges(1, 64, 8, &ranges); |
| 92 EXPECT_EQ(0, ranges.range(0)); | 93 EXPECT_EQ(0, ranges.range(0)); |
| 93 int power_of_2 = 1; | 94 int power_of_2 = 1; |
| 94 for (int i = 1; i < 8; i++) { | 95 for (int i = 1; i < 8; i++) { |
| 95 EXPECT_EQ(power_of_2, ranges.range(i)); | 96 EXPECT_EQ(power_of_2, ranges.range(i)); |
| 96 power_of_2 *= 2; | 97 power_of_2 *= 2; |
| 97 } | 98 } |
| 98 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges.range(8)); | 99 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges.range(8)); |
| 99 | 100 |
| 100 // Check the corresponding Histogram will use the correct ranges. | 101 // Check the corresponding Histogram will use the correct ranges. |
| 101 Histogram* histogram(Histogram::FactoryGet( | 102 Histogram* histogram(Histogram::FactoryGet( |
| 102 "Histogram", 1, 64, 8, Histogram::kNoFlags)); | 103 "Histogram", 1, 64, 8, HistogramBase::kNoFlags)); |
| 103 EXPECT_TRUE(ranges.Equals(histogram->bucket_ranges())); | 104 EXPECT_TRUE(ranges.Equals(histogram->bucket_ranges())); |
| 104 | 105 |
| 105 // When bucket count is limited, exponential ranges will partially look like | 106 // When bucket count is limited, exponential ranges will partially look like |
| 106 // linear. | 107 // linear. |
| 107 BucketRanges ranges2(16); | 108 BucketRanges ranges2(16); |
| 108 Histogram::InitializeBucketRanges(1, 32, 15, &ranges2); | 109 Histogram::InitializeBucketRanges(1, 32, 15, &ranges2); |
| 109 | 110 |
| 110 EXPECT_EQ(0, ranges2.range(0)); | 111 EXPECT_EQ(0, ranges2.range(0)); |
| 111 EXPECT_EQ(1, ranges2.range(1)); | 112 EXPECT_EQ(1, ranges2.range(1)); |
| 112 EXPECT_EQ(2, ranges2.range(2)); | 113 EXPECT_EQ(2, ranges2.range(2)); |
| 113 EXPECT_EQ(3, ranges2.range(3)); | 114 EXPECT_EQ(3, ranges2.range(3)); |
| 114 EXPECT_EQ(4, ranges2.range(4)); | 115 EXPECT_EQ(4, ranges2.range(4)); |
| 115 EXPECT_EQ(5, ranges2.range(5)); | 116 EXPECT_EQ(5, ranges2.range(5)); |
| 116 EXPECT_EQ(6, ranges2.range(6)); | 117 EXPECT_EQ(6, ranges2.range(6)); |
| 117 EXPECT_EQ(7, ranges2.range(7)); | 118 EXPECT_EQ(7, ranges2.range(7)); |
| 118 EXPECT_EQ(9, ranges2.range(8)); | 119 EXPECT_EQ(9, ranges2.range(8)); |
| 119 EXPECT_EQ(11, ranges2.range(9)); | 120 EXPECT_EQ(11, ranges2.range(9)); |
| 120 EXPECT_EQ(14, ranges2.range(10)); | 121 EXPECT_EQ(14, ranges2.range(10)); |
| 121 EXPECT_EQ(17, ranges2.range(11)); | 122 EXPECT_EQ(17, ranges2.range(11)); |
| 122 EXPECT_EQ(21, ranges2.range(12)); | 123 EXPECT_EQ(21, ranges2.range(12)); |
| 123 EXPECT_EQ(26, ranges2.range(13)); | 124 EXPECT_EQ(26, ranges2.range(13)); |
| 124 EXPECT_EQ(32, ranges2.range(14)); | 125 EXPECT_EQ(32, ranges2.range(14)); |
| 125 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges2.range(15)); | 126 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges2.range(15)); |
| 126 | 127 |
| 127 // Check the corresponding Histogram will use the correct ranges. | 128 // Check the corresponding Histogram will use the correct ranges. |
| 128 Histogram* histogram2(Histogram::FactoryGet( | 129 Histogram* histogram2(Histogram::FactoryGet( |
| 129 "Histogram2", 1, 32, 15, Histogram::kNoFlags)); | 130 "Histogram2", 1, 32, 15, HistogramBase::kNoFlags)); |
| 130 EXPECT_TRUE(ranges2.Equals(histogram2->bucket_ranges())); | 131 EXPECT_TRUE(ranges2.Equals(histogram2->bucket_ranges())); |
| 131 } | 132 } |
| 132 | 133 |
| 133 TEST_F(HistogramTest, LinearRangesTest) { | 134 TEST_F(HistogramTest, LinearRangesTest) { |
| 134 BucketRanges ranges(9); | 135 BucketRanges ranges(9); |
| 135 LinearHistogram::InitializeBucketRanges(1, 7, 8, &ranges); | 136 LinearHistogram::InitializeBucketRanges(1, 7, 8, &ranges); |
| 136 // Gets a nice linear set of bucket ranges. | 137 // Gets a nice linear set of bucket ranges. |
| 137 for (int i = 0; i < 8; i++) | 138 for (int i = 0; i < 8; i++) |
| 138 EXPECT_EQ(i, ranges.range(i)); | 139 EXPECT_EQ(i, ranges.range(i)); |
| 139 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges.range(8)); | 140 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges.range(8)); |
| 140 // The correspoding LinearHistogram should use the correct ranges. | 141 // The correspoding LinearHistogram should use the correct ranges. |
| 141 Histogram* histogram( | 142 Histogram* histogram( |
| 142 LinearHistogram::FactoryGet("Linear", 1, 7, 8, Histogram::kNoFlags)); | 143 LinearHistogram::FactoryGet("Linear", 1, 7, 8, HistogramBase::kNoFlags)); |
| 143 EXPECT_TRUE(ranges.Equals(histogram->bucket_ranges())); | 144 EXPECT_TRUE(ranges.Equals(histogram->bucket_ranges())); |
| 144 | 145 |
| 145 // Linear ranges are not divisible. | 146 // Linear ranges are not divisible. |
| 146 BucketRanges ranges2(6); | 147 BucketRanges ranges2(6); |
| 147 LinearHistogram::InitializeBucketRanges(1, 6, 5, &ranges2); | 148 LinearHistogram::InitializeBucketRanges(1, 6, 5, &ranges2); |
| 148 EXPECT_EQ(0, ranges2.range(0)); | 149 EXPECT_EQ(0, ranges2.range(0)); |
| 149 EXPECT_EQ(1, ranges2.range(1)); | 150 EXPECT_EQ(1, ranges2.range(1)); |
| 150 EXPECT_EQ(3, ranges2.range(2)); | 151 EXPECT_EQ(3, ranges2.range(2)); |
| 151 EXPECT_EQ(4, ranges2.range(3)); | 152 EXPECT_EQ(4, ranges2.range(3)); |
| 152 EXPECT_EQ(6, ranges2.range(4)); | 153 EXPECT_EQ(6, ranges2.range(4)); |
| 153 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges2.range(5)); | 154 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges2.range(5)); |
| 154 // The correspoding LinearHistogram should use the correct ranges. | 155 // The correspoding LinearHistogram should use the correct ranges. |
| 155 Histogram* histogram2( | 156 Histogram* histogram2( |
| 156 LinearHistogram::FactoryGet("Linear2", 1, 6, 5, Histogram::kNoFlags)); | 157 LinearHistogram::FactoryGet("Linear2", 1, 6, 5, HistogramBase::kNoFlags)); |
| 157 EXPECT_TRUE(ranges2.Equals(histogram2->bucket_ranges())); | 158 EXPECT_TRUE(ranges2.Equals(histogram2->bucket_ranges())); |
| 158 } | 159 } |
| 159 | 160 |
| 160 TEST_F(HistogramTest, ArrayToCustomRangesTest) { | 161 TEST_F(HistogramTest, ArrayToCustomRangesTest) { |
| 161 const HistogramBase::Sample ranges[3] = {5, 10, 20}; | 162 const HistogramBase::Sample ranges[3] = {5, 10, 20}; |
| 162 vector<HistogramBase::Sample> ranges_vec = | 163 vector<HistogramBase::Sample> ranges_vec = |
| 163 CustomHistogram::ArrayToCustomRanges(ranges, 3); | 164 CustomHistogram::ArrayToCustomRanges(ranges, 3); |
| 164 ASSERT_EQ(6u, ranges_vec.size()); | 165 ASSERT_EQ(6u, ranges_vec.size()); |
| 165 EXPECT_EQ(5, ranges_vec[0]); | 166 EXPECT_EQ(5, ranges_vec[0]); |
| 166 EXPECT_EQ(6, ranges_vec[1]); | 167 EXPECT_EQ(6, ranges_vec[1]); |
| 167 EXPECT_EQ(10, ranges_vec[2]); | 168 EXPECT_EQ(10, ranges_vec[2]); |
| 168 EXPECT_EQ(11, ranges_vec[3]); | 169 EXPECT_EQ(11, ranges_vec[3]); |
| 169 EXPECT_EQ(20, ranges_vec[4]); | 170 EXPECT_EQ(20, ranges_vec[4]); |
| 170 EXPECT_EQ(21, ranges_vec[5]); | 171 EXPECT_EQ(21, ranges_vec[5]); |
| 171 } | 172 } |
| 172 | 173 |
| 173 TEST_F(HistogramTest, CustomHistogramTest) { | 174 TEST_F(HistogramTest, CustomHistogramTest) { |
| 174 // A well prepared custom ranges. | 175 // A well prepared custom ranges. |
| 175 vector<HistogramBase::Sample> custom_ranges; | 176 vector<HistogramBase::Sample> custom_ranges; |
| 176 custom_ranges.push_back(1); | 177 custom_ranges.push_back(1); |
| 177 custom_ranges.push_back(2); | 178 custom_ranges.push_back(2); |
| 178 Histogram* histogram = CustomHistogram::FactoryGet( | 179 Histogram* histogram = CustomHistogram::FactoryGet( |
| 179 "TestCustomHistogram1", custom_ranges, Histogram::kNoFlags); | 180 "TestCustomHistogram1", custom_ranges, HistogramBase::kNoFlags); |
| 180 const BucketRanges* ranges = histogram->bucket_ranges(); | 181 const BucketRanges* ranges = histogram->bucket_ranges(); |
| 181 ASSERT_EQ(4u, ranges->size()); | 182 ASSERT_EQ(4u, ranges->size()); |
| 182 EXPECT_EQ(0, ranges->range(0)); // Auto added. | 183 EXPECT_EQ(0, ranges->range(0)); // Auto added. |
| 183 EXPECT_EQ(1, ranges->range(1)); | 184 EXPECT_EQ(1, ranges->range(1)); |
| 184 EXPECT_EQ(2, ranges->range(2)); | 185 EXPECT_EQ(2, ranges->range(2)); |
| 185 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges->range(3)); // Auto added. | 186 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges->range(3)); // Auto added. |
| 186 | 187 |
| 187 // A unordered custom ranges. | 188 // A unordered custom ranges. |
| 188 custom_ranges.clear(); | 189 custom_ranges.clear(); |
| 189 custom_ranges.push_back(2); | 190 custom_ranges.push_back(2); |
| 190 custom_ranges.push_back(1); | 191 custom_ranges.push_back(1); |
| 191 histogram = CustomHistogram::FactoryGet( | 192 histogram = CustomHistogram::FactoryGet( |
| 192 "TestCustomHistogram2", custom_ranges, Histogram::kNoFlags); | 193 "TestCustomHistogram2", custom_ranges, HistogramBase::kNoFlags); |
| 193 ranges = histogram->bucket_ranges(); | 194 ranges = histogram->bucket_ranges(); |
| 194 ASSERT_EQ(4u, ranges->size()); | 195 ASSERT_EQ(4u, ranges->size()); |
| 195 EXPECT_EQ(0, ranges->range(0)); | 196 EXPECT_EQ(0, ranges->range(0)); |
| 196 EXPECT_EQ(1, ranges->range(1)); | 197 EXPECT_EQ(1, ranges->range(1)); |
| 197 EXPECT_EQ(2, ranges->range(2)); | 198 EXPECT_EQ(2, ranges->range(2)); |
| 198 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges->range(3)); | 199 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges->range(3)); |
| 199 | 200 |
| 200 // A custom ranges with duplicated values. | 201 // A custom ranges with duplicated values. |
| 201 custom_ranges.clear(); | 202 custom_ranges.clear(); |
| 202 custom_ranges.push_back(4); | 203 custom_ranges.push_back(4); |
| 203 custom_ranges.push_back(1); | 204 custom_ranges.push_back(1); |
| 204 custom_ranges.push_back(4); | 205 custom_ranges.push_back(4); |
| 205 histogram = CustomHistogram::FactoryGet( | 206 histogram = CustomHistogram::FactoryGet( |
| 206 "TestCustomHistogram3", custom_ranges, Histogram::kNoFlags); | 207 "TestCustomHistogram3", custom_ranges, HistogramBase::kNoFlags); |
| 207 ranges = histogram->bucket_ranges(); | 208 ranges = histogram->bucket_ranges(); |
| 208 ASSERT_EQ(4u, ranges->size()); | 209 ASSERT_EQ(4u, ranges->size()); |
| 209 EXPECT_EQ(0, ranges->range(0)); | 210 EXPECT_EQ(0, ranges->range(0)); |
| 210 EXPECT_EQ(1, ranges->range(1)); | 211 EXPECT_EQ(1, ranges->range(1)); |
| 211 EXPECT_EQ(4, ranges->range(2)); | 212 EXPECT_EQ(4, ranges->range(2)); |
| 212 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges->range(3)); | 213 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges->range(3)); |
| 213 } | 214 } |
| 214 | 215 |
| 215 TEST_F(HistogramTest, CustomHistogramWithOnly2Buckets) { | 216 TEST_F(HistogramTest, CustomHistogramWithOnly2Buckets) { |
| 216 // This test exploits the fact that the CustomHistogram can have 2 buckets, | 217 // This test exploits the fact that the CustomHistogram can have 2 buckets, |
| 217 // while the base class Histogram is *supposed* to have at least 3 buckets. | 218 // while the base class Histogram is *supposed* to have at least 3 buckets. |
| 218 // We should probably change the restriction on the base class (or not inherit | 219 // We should probably change the restriction on the base class (or not inherit |
| 219 // the base class!). | 220 // the base class!). |
| 220 | 221 |
| 221 vector<HistogramBase::Sample> custom_ranges; | 222 vector<HistogramBase::Sample> custom_ranges; |
| 222 custom_ranges.push_back(4); | 223 custom_ranges.push_back(4); |
| 223 | 224 |
| 224 Histogram* histogram = CustomHistogram::FactoryGet( | 225 Histogram* histogram = CustomHistogram::FactoryGet( |
| 225 "2BucketsCustomHistogram", custom_ranges, Histogram::kNoFlags); | 226 "2BucketsCustomHistogram", custom_ranges, HistogramBase::kNoFlags); |
| 226 const BucketRanges* ranges = histogram->bucket_ranges(); | 227 const BucketRanges* ranges = histogram->bucket_ranges(); |
| 227 ASSERT_EQ(3u, ranges->size()); | 228 ASSERT_EQ(3u, ranges->size()); |
| 228 EXPECT_EQ(0, ranges->range(0)); | 229 EXPECT_EQ(0, ranges->range(0)); |
| 229 EXPECT_EQ(4, ranges->range(1)); | 230 EXPECT_EQ(4, ranges->range(1)); |
| 230 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges->range(2)); | 231 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges->range(2)); |
| 231 } | 232 } |
| 232 | 233 |
| 233 // Make sure histogram handles out-of-bounds data gracefully. | 234 // Make sure histogram handles out-of-bounds data gracefully. |
| 234 TEST_F(HistogramTest, BoundsTest) { | 235 TEST_F(HistogramTest, BoundsTest) { |
| 235 const size_t kBucketCount = 50; | 236 const size_t kBucketCount = 50; |
| 236 Histogram* histogram(Histogram::FactoryGet( | 237 Histogram* histogram(Histogram::FactoryGet( |
| 237 "Bounded", 10, 100, kBucketCount, Histogram::kNoFlags)); | 238 "Bounded", 10, 100, kBucketCount, HistogramBase::kNoFlags)); |
| 238 | 239 |
| 239 // Put two samples "out of bounds" above and below. | 240 // Put two samples "out of bounds" above and below. |
| 240 histogram->Add(5); | 241 histogram->Add(5); |
| 241 histogram->Add(-50); | 242 histogram->Add(-50); |
| 242 | 243 |
| 243 histogram->Add(100); | 244 histogram->Add(100); |
| 244 histogram->Add(10000); | 245 histogram->Add(10000); |
| 245 | 246 |
| 246 // Verify they landed in the underflow, and overflow buckets. | 247 // Verify they landed in the underflow, and overflow buckets. |
| 247 scoped_ptr<SampleVector> samples = histogram->SnapshotSampleVector(); | 248 scoped_ptr<SampleVector> samples = histogram->SnapshotSampleVector(); |
| 248 EXPECT_EQ(2, samples->GetCountAtIndex(0)); | 249 EXPECT_EQ(2, samples->GetCountAtIndex(0)); |
| 249 EXPECT_EQ(0, samples->GetCountAtIndex(1)); | 250 EXPECT_EQ(0, samples->GetCountAtIndex(1)); |
| 250 size_t array_size = histogram->bucket_count(); | 251 size_t array_size = histogram->bucket_count(); |
| 251 EXPECT_EQ(kBucketCount, array_size); | 252 EXPECT_EQ(kBucketCount, array_size); |
| 252 EXPECT_EQ(0, samples->GetCountAtIndex(array_size - 2)); | 253 EXPECT_EQ(0, samples->GetCountAtIndex(array_size - 2)); |
| 253 EXPECT_EQ(2, samples->GetCountAtIndex(array_size - 1)); | 254 EXPECT_EQ(2, samples->GetCountAtIndex(array_size - 1)); |
| 254 | 255 |
| 255 vector<int> custom_ranges; | 256 vector<int> custom_ranges; |
| 256 custom_ranges.push_back(10); | 257 custom_ranges.push_back(10); |
| 257 custom_ranges.push_back(50); | 258 custom_ranges.push_back(50); |
| 258 custom_ranges.push_back(100); | 259 custom_ranges.push_back(100); |
| 259 Histogram* test_custom_histogram(CustomHistogram::FactoryGet( | 260 Histogram* test_custom_histogram = CustomHistogram::FactoryGet( |
| 260 "TestCustomRangeBoundedHistogram", custom_ranges, Histogram::kNoFlags)); | 261 "TestCustomRangeBoundedHistogram", custom_ranges, |
| 262 HistogramBase::kNoFlags); | |
| 261 | 263 |
| 262 // Put two samples "out of bounds" above and below. | 264 // Put two samples "out of bounds" above and below. |
| 263 test_custom_histogram->Add(5); | 265 test_custom_histogram->Add(5); |
| 264 test_custom_histogram->Add(-50); | 266 test_custom_histogram->Add(-50); |
| 265 test_custom_histogram->Add(100); | 267 test_custom_histogram->Add(100); |
| 266 test_custom_histogram->Add(1000); | 268 test_custom_histogram->Add(1000); |
| 267 test_custom_histogram->Add(INT_MAX); | 269 test_custom_histogram->Add(INT_MAX); |
| 268 | 270 |
| 269 // Verify they landed in the underflow, and overflow buckets. | 271 // Verify they landed in the underflow, and overflow buckets. |
| 270 scoped_ptr<SampleVector> custom_samples = | 272 scoped_ptr<SampleVector> custom_samples = |
| 271 test_custom_histogram->SnapshotSampleVector(); | 273 test_custom_histogram->SnapshotSampleVector(); |
| 272 EXPECT_EQ(2, custom_samples->GetCountAtIndex(0)); | 274 EXPECT_EQ(2, custom_samples->GetCountAtIndex(0)); |
| 273 EXPECT_EQ(0, custom_samples->GetCountAtIndex(1)); | 275 EXPECT_EQ(0, custom_samples->GetCountAtIndex(1)); |
| 274 size_t bucket_count = test_custom_histogram->bucket_count(); | 276 size_t bucket_count = test_custom_histogram->bucket_count(); |
| 275 EXPECT_EQ(0, custom_samples->GetCountAtIndex(bucket_count - 2)); | 277 EXPECT_EQ(0, custom_samples->GetCountAtIndex(bucket_count - 2)); |
| 276 EXPECT_EQ(3, custom_samples->GetCountAtIndex(bucket_count - 1)); | 278 EXPECT_EQ(3, custom_samples->GetCountAtIndex(bucket_count - 1)); |
| 277 } | 279 } |
| 278 | 280 |
| 279 // Check to be sure samples land as expected is "correct" buckets. | 281 // Check to be sure samples land as expected is "correct" buckets. |
| 280 TEST_F(HistogramTest, BucketPlacementTest) { | 282 TEST_F(HistogramTest, BucketPlacementTest) { |
| 281 Histogram* histogram(Histogram::FactoryGet( | 283 Histogram* histogram(Histogram::FactoryGet( |
| 282 "Histogram", 1, 64, 8, Histogram::kNoFlags)); | 284 "Histogram", 1, 64, 8, HistogramBase::kNoFlags)); |
| 283 | 285 |
| 284 // Add i+1 samples to the i'th bucket. | 286 // Add i+1 samples to the i'th bucket. |
| 285 histogram->Add(0); | 287 histogram->Add(0); |
| 286 int power_of_2 = 1; | 288 int power_of_2 = 1; |
| 287 for (int i = 1; i < 8; i++) { | 289 for (int i = 1; i < 8; i++) { |
| 288 for (int j = 0; j <= i; j++) | 290 for (int j = 0; j <= i; j++) |
| 289 histogram->Add(power_of_2); | 291 histogram->Add(power_of_2); |
| 290 power_of_2 *= 2; | 292 power_of_2 *= 2; |
| 291 } | 293 } |
| 292 | 294 |
| 293 // Check to see that the bucket counts reflect our additions. | 295 // Check to see that the bucket counts reflect our additions. |
| 294 scoped_ptr<SampleVector> samples = histogram->SnapshotSampleVector(); | 296 scoped_ptr<SampleVector> samples = histogram->SnapshotSampleVector(); |
| 295 for (int i = 0; i < 8; i++) | 297 for (int i = 0; i < 8; i++) |
| 296 EXPECT_EQ(i + 1, samples->GetCountAtIndex(i)); | 298 EXPECT_EQ(i + 1, samples->GetCountAtIndex(i)); |
| 297 } | 299 } |
| 298 | 300 |
| 299 TEST_F(HistogramTest, CorruptSampleCounts) { | 301 TEST_F(HistogramTest, CorruptSampleCounts) { |
| 300 Histogram* histogram(Histogram::FactoryGet( | 302 Histogram* histogram(Histogram::FactoryGet( |
| 301 "Histogram", 1, 64, 8, Histogram::kNoFlags)); // As per header file. | 303 "Histogram", 1, 64, 8, HistogramBase::kNoFlags)); // As per header file. |
| 302 | 304 |
| 303 // Add some samples. | 305 // Add some samples. |
| 304 histogram->Add(20); | 306 histogram->Add(20); |
| 305 histogram->Add(40); | 307 histogram->Add(40); |
| 306 | 308 |
| 307 scoped_ptr<SampleVector> snapshot = histogram->SnapshotSampleVector(); | 309 scoped_ptr<SampleVector> snapshot = histogram->SnapshotSampleVector(); |
| 308 EXPECT_EQ(Histogram::NO_INCONSISTENCIES, | 310 EXPECT_EQ(Histogram::NO_INCONSISTENCIES, |
| 309 histogram->FindCorruption(*snapshot)); | 311 histogram->FindCorruption(*snapshot)); |
| 310 EXPECT_EQ(2, snapshot->redundant_count()); | 312 EXPECT_EQ(2, snapshot->redundant_count()); |
| 311 EXPECT_EQ(2, snapshot->TotalCount()); | 313 EXPECT_EQ(2, snapshot->TotalCount()); |
| 312 | 314 |
| 313 snapshot->counts_[3] += 100; // Sample count won't match redundant count. | 315 snapshot->counts_[3] += 100; // Sample count won't match redundant count. |
| 314 EXPECT_EQ(Histogram::COUNT_LOW_ERROR, | 316 EXPECT_EQ(Histogram::COUNT_LOW_ERROR, |
| 315 histogram->FindCorruption(*snapshot)); | 317 histogram->FindCorruption(*snapshot)); |
| 316 snapshot->counts_[2] -= 200; | 318 snapshot->counts_[2] -= 200; |
| 317 EXPECT_EQ(Histogram::COUNT_HIGH_ERROR, | 319 EXPECT_EQ(Histogram::COUNT_HIGH_ERROR, |
| 318 histogram->FindCorruption(*snapshot)); | 320 histogram->FindCorruption(*snapshot)); |
| 319 | 321 |
| 320 // But we can't spot a corruption if it is compensated for. | 322 // But we can't spot a corruption if it is compensated for. |
| 321 snapshot->counts_[1] += 100; | 323 snapshot->counts_[1] += 100; |
| 322 EXPECT_EQ(Histogram::NO_INCONSISTENCIES, | 324 EXPECT_EQ(Histogram::NO_INCONSISTENCIES, |
| 323 histogram->FindCorruption(*snapshot)); | 325 histogram->FindCorruption(*snapshot)); |
| 324 } | 326 } |
| 325 | 327 |
| 326 TEST_F(HistogramTest, CorruptBucketBounds) { | 328 TEST_F(HistogramTest, CorruptBucketBounds) { |
| 327 Histogram* histogram(Histogram::FactoryGet( | 329 Histogram* histogram(Histogram::FactoryGet( |
| 328 "Histogram", 1, 64, 8, Histogram::kNoFlags)); // As per header file. | 330 "Histogram", 1, 64, 8, HistogramBase::kNoFlags)); // As per header file. |
| 329 | 331 |
| 330 scoped_ptr<SampleVector> snapshot = histogram->SnapshotSampleVector(); | 332 scoped_ptr<SampleVector> snapshot = histogram->SnapshotSampleVector(); |
| 331 EXPECT_EQ(Histogram::NO_INCONSISTENCIES, | 333 EXPECT_EQ(Histogram::NO_INCONSISTENCIES, |
| 332 histogram->FindCorruption(*snapshot)); | 334 histogram->FindCorruption(*snapshot)); |
| 333 | 335 |
| 334 BucketRanges* bucket_ranges = | 336 BucketRanges* bucket_ranges = |
| 335 const_cast<BucketRanges*>(histogram->bucket_ranges()); | 337 const_cast<BucketRanges*>(histogram->bucket_ranges()); |
| 336 HistogramBase::Sample tmp = bucket_ranges->range(1); | 338 HistogramBase::Sample tmp = bucket_ranges->range(1); |
| 337 bucket_ranges->set_range(1, bucket_ranges->range(2)); | 339 bucket_ranges->set_range(1, bucket_ranges->range(2)); |
| 338 bucket_ranges->set_range(2, tmp); | 340 bucket_ranges->set_range(2, tmp); |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 350 | 352 |
| 351 bucket_ranges->set_range(4, bucket_ranges->range(4) - 1); | 353 bucket_ranges->set_range(4, bucket_ranges->range(4) - 1); |
| 352 EXPECT_EQ(Histogram::RANGE_CHECKSUM_ERROR, | 354 EXPECT_EQ(Histogram::RANGE_CHECKSUM_ERROR, |
| 353 histogram->FindCorruption(*snapshot)); | 355 histogram->FindCorruption(*snapshot)); |
| 354 | 356 |
| 355 // Repair histogram so that destructor won't DCHECK(). | 357 // Repair histogram so that destructor won't DCHECK(). |
| 356 bucket_ranges->set_range(3, bucket_ranges->range(3) - 1); | 358 bucket_ranges->set_range(3, bucket_ranges->range(3) - 1); |
| 357 bucket_ranges->set_range(4, bucket_ranges->range(4) + 1); | 359 bucket_ranges->set_range(4, bucket_ranges->range(4) + 1); |
| 358 } | 360 } |
| 359 | 361 |
| 362 TEST_F(HistogramTest, HistogramSerializeInfo) { | |
| 363 Histogram* histogram = Histogram::FactoryGet( | |
| 364 "Histogram", 1, 64, 8, HistogramBase::kIPCSerializationSourceFlag); | |
| 365 | |
| 366 Pickle pickle; | |
| 367 histogram->SerializeInfo(&pickle); | |
| 368 | |
| 369 PickleIterator iter(pickle); | |
| 370 | |
| 371 int type; | |
| 372 EXPECT_TRUE(iter.ReadInt(&type)); | |
| 373 EXPECT_EQ(HISTOGRAM, type); | |
| 374 | |
| 375 std::string name; | |
| 376 EXPECT_TRUE(iter.ReadString(&name)); | |
| 377 EXPECT_EQ("Histogram", name); | |
| 378 | |
| 379 int flag; | |
| 380 EXPECT_TRUE(iter.ReadInt(&flag)); | |
| 381 EXPECT_EQ(HistogramBase::kIPCSerializationSourceFlag, flag); | |
| 382 | |
| 383 int min; | |
| 384 EXPECT_TRUE(iter.ReadInt(&min)); | |
| 385 EXPECT_EQ(1, min); | |
| 386 | |
| 387 int max; | |
| 388 EXPECT_TRUE(iter.ReadInt(&max)); | |
| 389 EXPECT_EQ(64, max); | |
| 390 | |
| 391 int64 bucket_count; | |
| 392 EXPECT_TRUE(iter.ReadInt64(&bucket_count)); | |
| 393 EXPECT_EQ(8, bucket_count); | |
| 394 | |
| 395 uint32 checksum; | |
| 396 EXPECT_TRUE(iter.ReadUInt32(&checksum)); | |
| 397 EXPECT_EQ(histogram->bucket_ranges()->checksum(), checksum); | |
| 398 | |
| 399 // No more data in the pickle. | |
| 400 EXPECT_FALSE(iter.SkipBytes(1)); | |
| 401 } | |
| 402 | |
| 403 TEST_F(HistogramTest, CustomHistogramSerializeInfo) { | |
| 404 vector<int> custom_ranges; | |
| 405 custom_ranges.push_back(10); | |
| 406 custom_ranges.push_back(100); | |
| 407 | |
| 408 Histogram* custom_histogram = CustomHistogram::FactoryGet( | |
| 409 "TestCustomRangeBoundedHistogram", | |
| 410 custom_ranges, | |
| 411 HistogramBase::kNoFlags); | |
| 412 Pickle pickle; | |
| 413 custom_histogram->SerializeInfo(&pickle); | |
| 414 | |
| 415 // Validate the pickle. | |
| 416 PickleIterator iter(pickle); | |
| 417 | |
| 418 int i; | |
| 419 std::string s; | |
| 420 int64 bucket_count; | |
| 421 uint32 ui32; | |
| 422 EXPECT_TRUE(iter.ReadInt(&i) && iter.ReadString(&s) && iter.ReadInt(&i) && | |
| 423 iter.ReadInt(&i) && iter.ReadInt(&i) && | |
| 424 iter.ReadInt64(&bucket_count) && iter.ReadUInt32(&ui32)); | |
| 425 EXPECT_EQ(3, bucket_count); | |
| 426 | |
| 427 int range; | |
| 428 EXPECT_TRUE(iter.ReadInt(&range)); | |
| 429 EXPECT_EQ(0, range); | |
|
Ilya Sherman
2012/12/29 00:17:30
I thought the 0 and INT_MAX ranges weren't seriali
kaiwang
2013/01/08 00:51:40
oops, didn't unload the newest code
| |
| 430 EXPECT_TRUE(iter.ReadInt(&range)); | |
| 431 EXPECT_EQ(10, range); | |
| 432 EXPECT_TRUE(iter.ReadInt(&range)); | |
| 433 EXPECT_EQ(100, range); | |
| 434 EXPECT_TRUE(iter.ReadInt(&range)); | |
| 435 EXPECT_EQ(HistogramBase::kSampleType_MAX, range); | |
| 436 | |
| 437 // No more data in the pickle. | |
| 438 EXPECT_FALSE(iter.SkipBytes(1)); | |
| 439 } | |
| 440 | |
| 360 #if GTEST_HAS_DEATH_TEST | 441 #if GTEST_HAS_DEATH_TEST |
| 361 // For Histogram, LinearHistogram and CustomHistogram, the minimum for a | 442 // For Histogram, LinearHistogram and CustomHistogram, the minimum for a |
| 362 // declared range is 1, while the maximum is (HistogramBase::kSampleType_MAX - | 443 // declared range is 1, while the maximum is (HistogramBase::kSampleType_MAX - |
| 363 // 1). But we accept ranges exceeding those limits, and silently clamped to | 444 // 1). But we accept ranges exceeding those limits, and silently clamped to |
| 364 // those limits. This is for backwards compatibility. | 445 // those limits. This is for backwards compatibility. |
| 365 TEST(HistogramDeathTest, BadRangesTest) { | 446 TEST(HistogramDeathTest, BadRangesTest) { |
| 366 Histogram* histogram = Histogram::FactoryGet( | 447 Histogram* histogram = Histogram::FactoryGet( |
| 367 "BadRanges", 0, HistogramBase::kSampleType_MAX, 8, Histogram::kNoFlags); | 448 "BadRanges", 0, HistogramBase::kSampleType_MAX, 8, |
| 449 HistogramBase::kNoFlags); | |
| 368 EXPECT_EQ(1, histogram->declared_min()); | 450 EXPECT_EQ(1, histogram->declared_min()); |
| 369 EXPECT_EQ(HistogramBase::kSampleType_MAX - 1, histogram->declared_max()); | 451 EXPECT_EQ(HistogramBase::kSampleType_MAX - 1, histogram->declared_max()); |
| 370 | 452 |
| 371 Histogram* linear_histogram = LinearHistogram::FactoryGet( | 453 Histogram* linear_histogram = LinearHistogram::FactoryGet( |
| 372 "BadRangesLinear", 0, HistogramBase::kSampleType_MAX, 8, | 454 "BadRangesLinear", 0, HistogramBase::kSampleType_MAX, 8, |
| 373 Histogram::kNoFlags); | 455 HistogramBase::kNoFlags); |
| 374 EXPECT_EQ(1, linear_histogram->declared_min()); | 456 EXPECT_EQ(1, linear_histogram->declared_min()); |
| 375 EXPECT_EQ(HistogramBase::kSampleType_MAX - 1, | 457 EXPECT_EQ(HistogramBase::kSampleType_MAX - 1, |
| 376 linear_histogram->declared_max()); | 458 linear_histogram->declared_max()); |
| 377 | 459 |
| 378 vector<int> custom_ranges; | 460 vector<int> custom_ranges; |
| 379 custom_ranges.push_back(0); | 461 custom_ranges.push_back(0); |
| 380 custom_ranges.push_back(5); | 462 custom_ranges.push_back(5); |
| 381 Histogram* custom_histogram1 = CustomHistogram::FactoryGet( | 463 Histogram* custom_histogram1 = CustomHistogram::FactoryGet( |
| 382 "BadRangesCustom", custom_ranges, Histogram::kNoFlags); | 464 "BadRangesCustom", custom_ranges, HistogramBase::kNoFlags); |
| 383 const BucketRanges* ranges = custom_histogram1->bucket_ranges(); | 465 const BucketRanges* ranges = custom_histogram1->bucket_ranges(); |
| 384 ASSERT_EQ(3u, ranges->size()); | 466 ASSERT_EQ(3u, ranges->size()); |
| 385 EXPECT_EQ(0, ranges->range(0)); | 467 EXPECT_EQ(0, ranges->range(0)); |
| 386 EXPECT_EQ(5, ranges->range(1)); | 468 EXPECT_EQ(5, ranges->range(1)); |
| 387 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges->range(2)); | 469 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges->range(2)); |
| 388 | 470 |
| 389 // CustomHistogram does not accepts kSampleType_MAX as range. | 471 // CustomHistogram does not accepts kSampleType_MAX as range. |
| 390 custom_ranges.push_back(HistogramBase::kSampleType_MAX); | 472 custom_ranges.push_back(HistogramBase::kSampleType_MAX); |
| 391 EXPECT_DEATH(CustomHistogram::FactoryGet("BadRangesCustom2", custom_ranges, | 473 EXPECT_DEATH(CustomHistogram::FactoryGet("BadRangesCustom2", custom_ranges, |
| 392 Histogram::kNoFlags), | 474 HistogramBase::kNoFlags), |
| 393 ""); | 475 ""); |
| 394 | 476 |
| 395 // CustomHistogram needs at least 1 valid range. | 477 // CustomHistogram needs at least 1 valid range. |
| 396 custom_ranges.clear(); | 478 custom_ranges.clear(); |
| 397 custom_ranges.push_back(0); | 479 custom_ranges.push_back(0); |
| 398 EXPECT_DEATH(CustomHistogram::FactoryGet("BadRangesCustom3", custom_ranges, | 480 EXPECT_DEATH(CustomHistogram::FactoryGet("BadRangesCustom3", custom_ranges, |
| 399 Histogram::kNoFlags), | 481 HistogramBase::kNoFlags), |
| 400 ""); | 482 ""); |
| 401 } | 483 } |
| 402 #endif | 484 #endif |
| 403 | 485 |
| 404 } // namespace base | 486 } // namespace base |
| OLD | NEW |