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(10, range); |
| 430 EXPECT_TRUE(iter.ReadInt(&range)); |
| 431 EXPECT_EQ(100, range); |
| 432 |
| 433 // No more data in the pickle. |
| 434 EXPECT_FALSE(iter.SkipBytes(1)); |
| 435 } |
| 436 |
360 #if GTEST_HAS_DEATH_TEST | 437 #if GTEST_HAS_DEATH_TEST |
361 // For Histogram, LinearHistogram and CustomHistogram, the minimum for a | 438 // For Histogram, LinearHistogram and CustomHistogram, the minimum for a |
362 // declared range is 1, while the maximum is (HistogramBase::kSampleType_MAX - | 439 // declared range is 1, while the maximum is (HistogramBase::kSampleType_MAX - |
363 // 1). But we accept ranges exceeding those limits, and silently clamped to | 440 // 1). But we accept ranges exceeding those limits, and silently clamped to |
364 // those limits. This is for backwards compatibility. | 441 // those limits. This is for backwards compatibility. |
365 TEST(HistogramDeathTest, BadRangesTest) { | 442 TEST(HistogramDeathTest, BadRangesTest) { |
366 Histogram* histogram = Histogram::FactoryGet( | 443 Histogram* histogram = Histogram::FactoryGet( |
367 "BadRanges", 0, HistogramBase::kSampleType_MAX, 8, Histogram::kNoFlags); | 444 "BadRanges", 0, HistogramBase::kSampleType_MAX, 8, |
| 445 HistogramBase::kNoFlags); |
368 EXPECT_EQ(1, histogram->declared_min()); | 446 EXPECT_EQ(1, histogram->declared_min()); |
369 EXPECT_EQ(HistogramBase::kSampleType_MAX - 1, histogram->declared_max()); | 447 EXPECT_EQ(HistogramBase::kSampleType_MAX - 1, histogram->declared_max()); |
370 | 448 |
371 Histogram* linear_histogram = LinearHistogram::FactoryGet( | 449 Histogram* linear_histogram = LinearHistogram::FactoryGet( |
372 "BadRangesLinear", 0, HistogramBase::kSampleType_MAX, 8, | 450 "BadRangesLinear", 0, HistogramBase::kSampleType_MAX, 8, |
373 Histogram::kNoFlags); | 451 HistogramBase::kNoFlags); |
374 EXPECT_EQ(1, linear_histogram->declared_min()); | 452 EXPECT_EQ(1, linear_histogram->declared_min()); |
375 EXPECT_EQ(HistogramBase::kSampleType_MAX - 1, | 453 EXPECT_EQ(HistogramBase::kSampleType_MAX - 1, |
376 linear_histogram->declared_max()); | 454 linear_histogram->declared_max()); |
377 | 455 |
378 vector<int> custom_ranges; | 456 vector<int> custom_ranges; |
379 custom_ranges.push_back(0); | 457 custom_ranges.push_back(0); |
380 custom_ranges.push_back(5); | 458 custom_ranges.push_back(5); |
381 Histogram* custom_histogram1 = CustomHistogram::FactoryGet( | 459 Histogram* custom_histogram1 = CustomHistogram::FactoryGet( |
382 "BadRangesCustom", custom_ranges, Histogram::kNoFlags); | 460 "BadRangesCustom", custom_ranges, HistogramBase::kNoFlags); |
383 const BucketRanges* ranges = custom_histogram1->bucket_ranges(); | 461 const BucketRanges* ranges = custom_histogram1->bucket_ranges(); |
384 ASSERT_EQ(3u, ranges->size()); | 462 ASSERT_EQ(3u, ranges->size()); |
385 EXPECT_EQ(0, ranges->range(0)); | 463 EXPECT_EQ(0, ranges->range(0)); |
386 EXPECT_EQ(5, ranges->range(1)); | 464 EXPECT_EQ(5, ranges->range(1)); |
387 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges->range(2)); | 465 EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges->range(2)); |
388 | 466 |
389 // CustomHistogram does not accepts kSampleType_MAX as range. | 467 // CustomHistogram does not accepts kSampleType_MAX as range. |
390 custom_ranges.push_back(HistogramBase::kSampleType_MAX); | 468 custom_ranges.push_back(HistogramBase::kSampleType_MAX); |
391 EXPECT_DEATH(CustomHistogram::FactoryGet("BadRangesCustom2", custom_ranges, | 469 EXPECT_DEATH(CustomHistogram::FactoryGet("BadRangesCustom2", custom_ranges, |
392 Histogram::kNoFlags), | 470 HistogramBase::kNoFlags), |
393 ""); | 471 ""); |
394 | 472 |
395 // CustomHistogram needs at least 1 valid range. | 473 // CustomHistogram needs at least 1 valid range. |
396 custom_ranges.clear(); | 474 custom_ranges.clear(); |
397 custom_ranges.push_back(0); | 475 custom_ranges.push_back(0); |
398 EXPECT_DEATH(CustomHistogram::FactoryGet("BadRangesCustom3", custom_ranges, | 476 EXPECT_DEATH(CustomHistogram::FactoryGet("BadRangesCustom3", custom_ranges, |
399 Histogram::kNoFlags), | 477 HistogramBase::kNoFlags), |
400 ""); | 478 ""); |
401 } | 479 } |
402 #endif | 480 #endif |
403 | 481 |
404 } // namespace base | 482 } // namespace base |
OLD | NEW |