Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(764)

Side by Side Diff: base/metrics/histogram_unittest.cc

Issue 11682003: Serialize/Deserialize support in HistogramBase (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698