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

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

Issue 6780035: Use lock-free lazy initialization for static histogram references (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 8 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
« no previous file with comments | « base/metrics/histogram.cc ('k') | chrome/browser/autocomplete/autocomplete.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "base/metrics/histogram.h" 7 #include "base/metrics/histogram.h"
8 #include "base/scoped_ptr.h"
8 #include "base/time.h" 9 #include "base/time.h"
9 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
10 11
11 namespace base { 12 namespace base {
12 namespace { 13 namespace {
13 14
14 class HistogramTest : public testing::Test { 15 class HistogramTest : public testing::Test {
15 }; 16 };
16 17
17 // Check for basic syntax and use. 18 // Check for basic syntax and use.
18 TEST(HistogramTest, StartupShutdownTest) { 19 TEST(HistogramTest, StartupShutdownTest) {
19 // Try basic construction 20 // Try basic construction
20 scoped_refptr<Histogram> histogram = Histogram::FactoryGet( 21 Histogram* histogram(Histogram::FactoryGet(
21 "TestHistogram", 1, 1000, 10, Histogram::kNoFlags); 22 "TestHistogram", 1, 1000, 10, Histogram::kNoFlags));
22 scoped_refptr<Histogram> histogram1 = Histogram::FactoryGet( 23 EXPECT_NE(reinterpret_cast<Histogram*>(NULL), histogram);
23 "Test1Histogram", 1, 1000, 10, Histogram::kNoFlags); 24 Histogram* histogram1(Histogram::FactoryGet(
25 "Test1Histogram", 1, 1000, 10, Histogram::kNoFlags));
26 EXPECT_NE(reinterpret_cast<Histogram*>(NULL), histogram1);
27 EXPECT_NE(histogram, histogram1);
24 28
25 scoped_refptr<Histogram> linear_histogram = LinearHistogram::FactoryGet( 29
26 "TestLinearHistogram", 1, 1000, 10, Histogram::kNoFlags); 30 Histogram* linear_histogram(LinearHistogram::FactoryGet(
27 scoped_refptr<Histogram> linear_histogram1 = LinearHistogram::FactoryGet( 31 "TestLinearHistogram", 1, 1000, 10, Histogram::kNoFlags));
28 "Test1LinearHistogram", 1, 1000, 10, Histogram::kNoFlags); 32 EXPECT_NE(reinterpret_cast<Histogram*>(NULL), linear_histogram);
33 Histogram* linear_histogram1(LinearHistogram::FactoryGet(
34 "Test1LinearHistogram", 1, 1000, 10, Histogram::kNoFlags));
35 EXPECT_NE(reinterpret_cast<Histogram*>(NULL), linear_histogram1);
36 EXPECT_NE(linear_histogram, linear_histogram1);
29 37
30 std::vector<int> custom_ranges; 38 std::vector<int> custom_ranges;
31 custom_ranges.push_back(1); 39 custom_ranges.push_back(1);
32 custom_ranges.push_back(5); 40 custom_ranges.push_back(5);
33 custom_ranges.push_back(10); 41 custom_ranges.push_back(10);
34 custom_ranges.push_back(20); 42 custom_ranges.push_back(20);
35 custom_ranges.push_back(30); 43 custom_ranges.push_back(30);
36 scoped_refptr<Histogram> custom_histogram = CustomHistogram::FactoryGet( 44 Histogram* custom_histogram(CustomHistogram::FactoryGet(
37 "TestCustomHistogram", custom_ranges, Histogram::kNoFlags); 45 "TestCustomHistogram", custom_ranges, Histogram::kNoFlags));
38 scoped_refptr<Histogram> custom_histogram1 = CustomHistogram::FactoryGet( 46 EXPECT_NE(reinterpret_cast<Histogram*>(NULL), custom_histogram);
39 "Test1CustomHistogram", custom_ranges, Histogram::kNoFlags); 47 Histogram* custom_histogram1(CustomHistogram::FactoryGet(
48 "Test1CustomHistogram", custom_ranges, Histogram::kNoFlags));
49 EXPECT_NE(reinterpret_cast<Histogram*>(NULL), custom_histogram1);
40 50
41 // Use standard macros (but with fixed samples) 51 // Use standard macros (but with fixed samples)
42 HISTOGRAM_TIMES("Test2Histogram", TimeDelta::FromDays(1)); 52 HISTOGRAM_TIMES("Test2Histogram", TimeDelta::FromDays(1));
43 HISTOGRAM_COUNTS("Test3Histogram", 30); 53 HISTOGRAM_COUNTS("Test3Histogram", 30);
44 54
45 DHISTOGRAM_TIMES("Test4Histogram", TimeDelta::FromDays(1)); 55 DHISTOGRAM_TIMES("Test4Histogram", TimeDelta::FromDays(1));
46 DHISTOGRAM_COUNTS("Test5Histogram", 30); 56 DHISTOGRAM_COUNTS("Test5Histogram", 30);
47 57
48 HISTOGRAM_ENUMERATION("Test6Histogram", 129, 130); 58 HISTOGRAM_ENUMERATION("Test6Histogram", 129, 130);
49 59
(...skipping 13 matching lines...) Expand all
63 TEST(HistogramTest, RecordedStartupTest) { 73 TEST(HistogramTest, RecordedStartupTest) {
64 // Test a statistics recorder, by letting histograms register. 74 // Test a statistics recorder, by letting histograms register.
65 StatisticsRecorder recorder; // This initializes the global state. 75 StatisticsRecorder recorder; // This initializes the global state.
66 76
67 StatisticsRecorder::Histograms histograms; 77 StatisticsRecorder::Histograms histograms;
68 EXPECT_EQ(0U, histograms.size()); 78 EXPECT_EQ(0U, histograms.size());
69 StatisticsRecorder::GetHistograms(&histograms); // Load up lists 79 StatisticsRecorder::GetHistograms(&histograms); // Load up lists
70 EXPECT_EQ(0U, histograms.size()); 80 EXPECT_EQ(0U, histograms.size());
71 81
72 // Try basic construction 82 // Try basic construction
73 scoped_refptr<Histogram> histogram = Histogram::FactoryGet( 83 Histogram* histogram(Histogram::FactoryGet(
74 "TestHistogram", 1, 1000, 10, Histogram::kNoFlags); 84 "TestHistogram", 1, 1000, 10, Histogram::kNoFlags));
85 EXPECT_NE(reinterpret_cast<Histogram*>(NULL), histogram);
75 histograms.clear(); 86 histograms.clear();
76 StatisticsRecorder::GetHistograms(&histograms); // Load up lists 87 StatisticsRecorder::GetHistograms(&histograms); // Load up lists
77 EXPECT_EQ(1U, histograms.size()); 88 EXPECT_EQ(1U, histograms.size());
78 scoped_refptr<Histogram> histogram1 = Histogram::FactoryGet( 89 Histogram* histogram1(Histogram::FactoryGet(
79 "Test1Histogram", 1, 1000, 10, Histogram::kNoFlags); 90 "Test1Histogram", 1, 1000, 10, Histogram::kNoFlags));
91 EXPECT_NE(reinterpret_cast<Histogram*>(NULL), histogram1);
80 histograms.clear(); 92 histograms.clear();
81 StatisticsRecorder::GetHistograms(&histograms); // Load up lists 93 StatisticsRecorder::GetHistograms(&histograms); // Load up lists
82 EXPECT_EQ(2U, histograms.size()); 94 EXPECT_EQ(2U, histograms.size());
83 95
84 scoped_refptr<Histogram> linear_histogram = LinearHistogram::FactoryGet( 96 Histogram* linear_histogram(LinearHistogram::FactoryGet(
85 "TestLinearHistogram", 1, 1000, 10, Histogram::kNoFlags); 97 "TestLinearHistogram", 1, 1000, 10, Histogram::kNoFlags));
98 EXPECT_NE(reinterpret_cast<Histogram*>(NULL), linear_histogram);
86 histograms.clear(); 99 histograms.clear();
87 StatisticsRecorder::GetHistograms(&histograms); // Load up lists 100 StatisticsRecorder::GetHistograms(&histograms); // Load up lists
88 EXPECT_EQ(3U, histograms.size()); 101 EXPECT_EQ(3U, histograms.size());
89 102
90 scoped_refptr<Histogram> linear_histogram1 = LinearHistogram::FactoryGet( 103 Histogram* linear_histogram1(LinearHistogram::FactoryGet(
91 "Test1LinearHistogram", 1, 1000, 10, Histogram::kNoFlags); 104 "Test1LinearHistogram", 1, 1000, 10, Histogram::kNoFlags));
105 EXPECT_NE(reinterpret_cast<Histogram*>(NULL), linear_histogram1);
92 histograms.clear(); 106 histograms.clear();
93 StatisticsRecorder::GetHistograms(&histograms); // Load up lists 107 StatisticsRecorder::GetHistograms(&histograms); // Load up lists
94 EXPECT_EQ(4U, histograms.size()); 108 EXPECT_EQ(4U, histograms.size());
95 109
96 std::vector<int> custom_ranges; 110 std::vector<int> custom_ranges;
97 custom_ranges.push_back(1); 111 custom_ranges.push_back(1);
98 custom_ranges.push_back(5); 112 custom_ranges.push_back(5);
99 custom_ranges.push_back(10); 113 custom_ranges.push_back(10);
100 custom_ranges.push_back(20); 114 custom_ranges.push_back(20);
101 custom_ranges.push_back(30); 115 custom_ranges.push_back(30);
102 scoped_refptr<Histogram> custom_histogram = CustomHistogram::FactoryGet( 116 Histogram* custom_histogram(CustomHistogram::FactoryGet(
103 "TestCustomHistogram", custom_ranges, Histogram::kNoFlags); 117 "TestCustomHistogram", custom_ranges, Histogram::kNoFlags));
104 scoped_refptr<Histogram> custom_histogram1 = CustomHistogram::FactoryGet( 118 EXPECT_NE(reinterpret_cast<Histogram*>(NULL), custom_histogram);
105 "TestCustomHistogram", custom_ranges, Histogram::kNoFlags); 119 Histogram* custom_histogram1(CustomHistogram::FactoryGet(
120 "TestCustomHistogram", custom_ranges, Histogram::kNoFlags));
121 EXPECT_NE(reinterpret_cast<Histogram*>(NULL), custom_histogram1);
106 122
107 histograms.clear(); 123 histograms.clear();
108 StatisticsRecorder::GetHistograms(&histograms); // Load up lists 124 StatisticsRecorder::GetHistograms(&histograms); // Load up lists
109 EXPECT_EQ(5U, histograms.size()); 125 EXPECT_EQ(5U, histograms.size());
110 126
111 // Use standard macros (but with fixed samples) 127 // Use standard macros (but with fixed samples)
112 HISTOGRAM_TIMES("Test2Histogram", TimeDelta::FromDays(1)); 128 HISTOGRAM_TIMES("Test2Histogram", TimeDelta::FromDays(1));
113 HISTOGRAM_COUNTS("Test3Histogram", 30); 129 HISTOGRAM_COUNTS("Test3Histogram", 30);
114 histograms.clear(); 130 histograms.clear();
115 StatisticsRecorder::GetHistograms(&histograms); // Load up lists 131 StatisticsRecorder::GetHistograms(&histograms); // Load up lists
(...skipping 15 matching lines...) Expand all
131 #endif 147 #endif
132 } 148 }
133 149
134 TEST(HistogramTest, RangeTest) { 150 TEST(HistogramTest, RangeTest) {
135 StatisticsRecorder recorder; 151 StatisticsRecorder recorder;
136 StatisticsRecorder::Histograms histograms; 152 StatisticsRecorder::Histograms histograms;
137 153
138 recorder.GetHistograms(&histograms); 154 recorder.GetHistograms(&histograms);
139 EXPECT_EQ(0U, histograms.size()); 155 EXPECT_EQ(0U, histograms.size());
140 156
141 scoped_refptr<Histogram> histogram = Histogram::FactoryGet( 157 Histogram* histogram(Histogram::FactoryGet(
142 "Histogram", 1, 64, 8, Histogram::kNoFlags); // As per header file. 158 "Histogram", 1, 64, 8, Histogram::kNoFlags)); // As per header file.
143 // Check that we got a nice exponential when there was enough rooom. 159 // Check that we got a nice exponential when there was enough rooom.
144 EXPECT_EQ(0, histogram->ranges(0)); 160 EXPECT_EQ(0, histogram->ranges(0));
145 int power_of_2 = 1; 161 int power_of_2 = 1;
146 for (int i = 1; i < 8; i++) { 162 for (int i = 1; i < 8; i++) {
147 EXPECT_EQ(power_of_2, histogram->ranges(i)); 163 EXPECT_EQ(power_of_2, histogram->ranges(i));
148 power_of_2 *= 2; 164 power_of_2 *= 2;
149 } 165 }
150 EXPECT_EQ(INT_MAX, histogram->ranges(8)); 166 EXPECT_EQ(INT_MAX, histogram->ranges(8));
151 167
152 scoped_refptr<Histogram> short_histogram = Histogram::FactoryGet( 168 Histogram* short_histogram(Histogram::FactoryGet(
153 "Histogram Shortened", 1, 7, 8, Histogram::kNoFlags); 169 "Histogram Shortened", 1, 7, 8, Histogram::kNoFlags));
154 // Check that when the number of buckets is short, we get a linear histogram 170 // Check that when the number of buckets is short, we get a linear histogram
155 // for lack of space to do otherwise. 171 // for lack of space to do otherwise.
156 for (int i = 0; i < 8; i++) 172 for (int i = 0; i < 8; i++)
157 EXPECT_EQ(i, short_histogram->ranges(i)); 173 EXPECT_EQ(i, short_histogram->ranges(i));
158 EXPECT_EQ(INT_MAX, short_histogram->ranges(8)); 174 EXPECT_EQ(INT_MAX, short_histogram->ranges(8));
159 175
160 scoped_refptr<Histogram> linear_histogram = LinearHistogram::FactoryGet( 176 Histogram* linear_histogram(LinearHistogram::FactoryGet(
161 "Linear", 1, 7, 8, Histogram::kNoFlags); 177 "Linear", 1, 7, 8, Histogram::kNoFlags));
162 // We also get a nice linear set of bucket ranges when we ask for it 178 // We also get a nice linear set of bucket ranges when we ask for it
163 for (int i = 0; i < 8; i++) 179 for (int i = 0; i < 8; i++)
164 EXPECT_EQ(i, linear_histogram->ranges(i)); 180 EXPECT_EQ(i, linear_histogram->ranges(i));
165 EXPECT_EQ(INT_MAX, linear_histogram->ranges(8)); 181 EXPECT_EQ(INT_MAX, linear_histogram->ranges(8));
166 182
167 scoped_refptr<Histogram> linear_broad_histogram = LinearHistogram::FactoryGet( 183 Histogram* linear_broad_histogram(LinearHistogram::FactoryGet(
168 "Linear widened", 2, 14, 8, Histogram::kNoFlags); 184 "Linear widened", 2, 14, 8, Histogram::kNoFlags));
169 // ...but when the list has more space, then the ranges naturally spread out. 185 // ...but when the list has more space, then the ranges naturally spread out.
170 for (int i = 0; i < 8; i++) 186 for (int i = 0; i < 8; i++)
171 EXPECT_EQ(2 * i, linear_broad_histogram->ranges(i)); 187 EXPECT_EQ(2 * i, linear_broad_histogram->ranges(i));
172 EXPECT_EQ(INT_MAX, linear_broad_histogram->ranges(8)); 188 EXPECT_EQ(INT_MAX, linear_broad_histogram->ranges(8));
173 189
174 scoped_refptr<Histogram> transitioning_histogram = 190 Histogram* transitioning_histogram(Histogram::FactoryGet(
175 Histogram::FactoryGet("LinearAndExponential", 1, 32, 15, 191 "LinearAndExponential", 1, 32, 15, Histogram::kNoFlags));
176 Histogram::kNoFlags);
177 // When space is a little tight, we transition from linear to exponential. 192 // When space is a little tight, we transition from linear to exponential.
178 EXPECT_EQ(0, transitioning_histogram->ranges(0)); 193 EXPECT_EQ(0, transitioning_histogram->ranges(0));
179 EXPECT_EQ(1, transitioning_histogram->ranges(1)); 194 EXPECT_EQ(1, transitioning_histogram->ranges(1));
180 EXPECT_EQ(2, transitioning_histogram->ranges(2)); 195 EXPECT_EQ(2, transitioning_histogram->ranges(2));
181 EXPECT_EQ(3, transitioning_histogram->ranges(3)); 196 EXPECT_EQ(3, transitioning_histogram->ranges(3));
182 EXPECT_EQ(4, transitioning_histogram->ranges(4)); 197 EXPECT_EQ(4, transitioning_histogram->ranges(4));
183 EXPECT_EQ(5, transitioning_histogram->ranges(5)); 198 EXPECT_EQ(5, transitioning_histogram->ranges(5));
184 EXPECT_EQ(6, transitioning_histogram->ranges(6)); 199 EXPECT_EQ(6, transitioning_histogram->ranges(6));
185 EXPECT_EQ(7, transitioning_histogram->ranges(7)); 200 EXPECT_EQ(7, transitioning_histogram->ranges(7));
186 EXPECT_EQ(9, transitioning_histogram->ranges(8)); 201 EXPECT_EQ(9, transitioning_histogram->ranges(8));
187 EXPECT_EQ(11, transitioning_histogram->ranges(9)); 202 EXPECT_EQ(11, transitioning_histogram->ranges(9));
188 EXPECT_EQ(14, transitioning_histogram->ranges(10)); 203 EXPECT_EQ(14, transitioning_histogram->ranges(10));
189 EXPECT_EQ(17, transitioning_histogram->ranges(11)); 204 EXPECT_EQ(17, transitioning_histogram->ranges(11));
190 EXPECT_EQ(21, transitioning_histogram->ranges(12)); 205 EXPECT_EQ(21, transitioning_histogram->ranges(12));
191 EXPECT_EQ(26, transitioning_histogram->ranges(13)); 206 EXPECT_EQ(26, transitioning_histogram->ranges(13));
192 EXPECT_EQ(32, transitioning_histogram->ranges(14)); 207 EXPECT_EQ(32, transitioning_histogram->ranges(14));
193 EXPECT_EQ(INT_MAX, transitioning_histogram->ranges(15)); 208 EXPECT_EQ(INT_MAX, transitioning_histogram->ranges(15));
194 209
195 std::vector<int> custom_ranges; 210 std::vector<int> custom_ranges;
196 custom_ranges.push_back(0); 211 custom_ranges.push_back(0);
197 custom_ranges.push_back(9); 212 custom_ranges.push_back(9);
198 custom_ranges.push_back(10); 213 custom_ranges.push_back(10);
199 custom_ranges.push_back(11); 214 custom_ranges.push_back(11);
200 custom_ranges.push_back(300); 215 custom_ranges.push_back(300);
201 scoped_refptr<Histogram> test_custom_histogram = CustomHistogram::FactoryGet( 216 Histogram* test_custom_histogram(CustomHistogram::FactoryGet(
202 "TestCustomRangeHistogram", custom_ranges, Histogram::kNoFlags); 217 "TestCustomRangeHistogram", custom_ranges, Histogram::kNoFlags));
203 218
204 EXPECT_EQ(custom_ranges[0], test_custom_histogram->ranges(0)); 219 EXPECT_EQ(custom_ranges[0], test_custom_histogram->ranges(0));
205 EXPECT_EQ(custom_ranges[1], test_custom_histogram->ranges(1)); 220 EXPECT_EQ(custom_ranges[1], test_custom_histogram->ranges(1));
206 EXPECT_EQ(custom_ranges[2], test_custom_histogram->ranges(2)); 221 EXPECT_EQ(custom_ranges[2], test_custom_histogram->ranges(2));
207 EXPECT_EQ(custom_ranges[3], test_custom_histogram->ranges(3)); 222 EXPECT_EQ(custom_ranges[3], test_custom_histogram->ranges(3));
208 EXPECT_EQ(custom_ranges[4], test_custom_histogram->ranges(4)); 223 EXPECT_EQ(custom_ranges[4], test_custom_histogram->ranges(4));
209 224
210 recorder.GetHistograms(&histograms); 225 recorder.GetHistograms(&histograms);
211 EXPECT_EQ(6U, histograms.size()); 226 EXPECT_EQ(6U, histograms.size());
212 } 227 }
213 228
214 TEST(HistogramTest, CustomRangeTest) { 229 TEST(HistogramTest, CustomRangeTest) {
215 StatisticsRecorder recorder; 230 StatisticsRecorder recorder;
216 StatisticsRecorder::Histograms histograms; 231 StatisticsRecorder::Histograms histograms;
217 232
218 // Check that missing leading zero is handled by an auto-insertion. 233 // Check that missing leading zero is handled by an auto-insertion.
219 std::vector<int> custom_ranges; 234 std::vector<int> custom_ranges;
220 // Don't include a zero. 235 // Don't include a zero.
221 custom_ranges.push_back(9); 236 custom_ranges.push_back(9);
222 custom_ranges.push_back(10); 237 custom_ranges.push_back(10);
223 custom_ranges.push_back(11); 238 custom_ranges.push_back(11);
224 scoped_refptr<Histogram> test_custom_histogram = CustomHistogram::FactoryGet( 239 Histogram* test_custom_histogram(CustomHistogram::FactoryGet(
225 "TestCustomRangeHistogram", custom_ranges, Histogram::kNoFlags); 240 "TestCustomRangeHistogram", custom_ranges, Histogram::kNoFlags));
226 241
227 EXPECT_EQ(0, test_custom_histogram->ranges(0)); // Auto added 242 EXPECT_EQ(0, test_custom_histogram->ranges(0)); // Auto added
228 EXPECT_EQ(custom_ranges[0], test_custom_histogram->ranges(1)); 243 EXPECT_EQ(custom_ranges[0], test_custom_histogram->ranges(1));
229 EXPECT_EQ(custom_ranges[1], test_custom_histogram->ranges(2)); 244 EXPECT_EQ(custom_ranges[1], test_custom_histogram->ranges(2));
230 EXPECT_EQ(custom_ranges[2], test_custom_histogram->ranges(3)); 245 EXPECT_EQ(custom_ranges[2], test_custom_histogram->ranges(3));
231 246
232 // Check that unsorted data with dups is handled gracefully. 247 // Check that unsorted data with dups is handled gracefully.
233 const int kSmall = 7; 248 const int kSmall = 7;
234 const int kMid = 8; 249 const int kMid = 8;
235 const int kBig = 9; 250 const int kBig = 9;
236 custom_ranges.clear(); 251 custom_ranges.clear();
237 custom_ranges.push_back(kBig); 252 custom_ranges.push_back(kBig);
238 custom_ranges.push_back(kMid); 253 custom_ranges.push_back(kMid);
239 custom_ranges.push_back(kSmall); 254 custom_ranges.push_back(kSmall);
240 custom_ranges.push_back(kSmall); 255 custom_ranges.push_back(kSmall);
241 custom_ranges.push_back(kMid); 256 custom_ranges.push_back(kMid);
242 custom_ranges.push_back(0); // Push an explicit zero. 257 custom_ranges.push_back(0); // Push an explicit zero.
243 custom_ranges.push_back(kBig); 258 custom_ranges.push_back(kBig);
244 259
245 scoped_refptr<Histogram> unsorted_histogram = CustomHistogram::FactoryGet( 260 Histogram* unsorted_histogram(CustomHistogram::FactoryGet(
246 "TestCustomUnsortedDupedHistogram", custom_ranges, Histogram::kNoFlags); 261 "TestCustomUnsortedDupedHistogram", custom_ranges, Histogram::kNoFlags));
247 EXPECT_EQ(0, unsorted_histogram->ranges(0)); 262 EXPECT_EQ(0, unsorted_histogram->ranges(0));
248 EXPECT_EQ(kSmall, unsorted_histogram->ranges(1)); 263 EXPECT_EQ(kSmall, unsorted_histogram->ranges(1));
249 EXPECT_EQ(kMid, unsorted_histogram->ranges(2)); 264 EXPECT_EQ(kMid, unsorted_histogram->ranges(2));
250 EXPECT_EQ(kBig, unsorted_histogram->ranges(3)); 265 EXPECT_EQ(kBig, unsorted_histogram->ranges(3));
251 } 266 }
252 267
253 268
254 // Make sure histogram handles out-of-bounds data gracefully. 269 // Make sure histogram handles out-of-bounds data gracefully.
255 TEST(HistogramTest, BoundsTest) { 270 TEST(HistogramTest, BoundsTest) {
256 const size_t kBucketCount = 50; 271 const size_t kBucketCount = 50;
257 scoped_refptr<Histogram> histogram = Histogram::FactoryGet( 272 Histogram* histogram(Histogram::FactoryGet(
258 "Bounded", 10, 100, kBucketCount, Histogram::kNoFlags); 273 "Bounded", 10, 100, kBucketCount, Histogram::kNoFlags));
259 274
260 // Put two samples "out of bounds" above and below. 275 // Put two samples "out of bounds" above and below.
261 histogram->Add(5); 276 histogram->Add(5);
262 histogram->Add(-50); 277 histogram->Add(-50);
263 278
264 histogram->Add(100); 279 histogram->Add(100);
265 histogram->Add(10000); 280 histogram->Add(10000);
266 281
267 // Verify they landed in the underflow, and overflow buckets. 282 // Verify they landed in the underflow, and overflow buckets.
268 Histogram::SampleSet sample; 283 Histogram::SampleSet sample;
269 histogram->SnapshotSample(&sample); 284 histogram->SnapshotSample(&sample);
270 EXPECT_EQ(2, sample.counts(0)); 285 EXPECT_EQ(2, sample.counts(0));
271 EXPECT_EQ(0, sample.counts(1)); 286 EXPECT_EQ(0, sample.counts(1));
272 size_t array_size = histogram->bucket_count(); 287 size_t array_size = histogram->bucket_count();
273 EXPECT_EQ(kBucketCount, array_size); 288 EXPECT_EQ(kBucketCount, array_size);
274 EXPECT_EQ(0, sample.counts(array_size - 2)); 289 EXPECT_EQ(0, sample.counts(array_size - 2));
275 EXPECT_EQ(2, sample.counts(array_size - 1)); 290 EXPECT_EQ(2, sample.counts(array_size - 1));
276 } 291 }
277 292
278 // Check to be sure samples land as expected is "correct" buckets. 293 // Check to be sure samples land as expected is "correct" buckets.
279 TEST(HistogramTest, BucketPlacementTest) { 294 TEST(HistogramTest, BucketPlacementTest) {
280 scoped_refptr<Histogram> histogram = Histogram::FactoryGet( 295 Histogram* histogram(Histogram::FactoryGet(
281 "Histogram", 1, 64, 8, Histogram::kNoFlags); // As per header file. 296 "Histogram", 1, 64, 8, Histogram::kNoFlags)); // As per header file.
282 297
283 // Check that we got a nice exponential since there was enough rooom. 298 // Check that we got a nice exponential since there was enough rooom.
284 EXPECT_EQ(0, histogram->ranges(0)); 299 EXPECT_EQ(0, histogram->ranges(0));
285 int power_of_2 = 1; 300 int power_of_2 = 1;
286 for (int i = 1; i < 8; i++) { 301 for (int i = 1; i < 8; i++) {
287 EXPECT_EQ(power_of_2, histogram->ranges(i)); 302 EXPECT_EQ(power_of_2, histogram->ranges(i));
288 power_of_2 *= 2; 303 power_of_2 *= 2;
289 } 304 }
290 EXPECT_EQ(INT_MAX, histogram->ranges(8)); 305 EXPECT_EQ(INT_MAX, histogram->ranges(8));
291 306
(...skipping 15 matching lines...) Expand all
307 EXPECT_EQ(i + 1, sample.counts(i)); 322 EXPECT_EQ(i + 1, sample.counts(i));
308 } 323 }
309 324
310 } // namespace 325 } // namespace
311 326
312 //------------------------------------------------------------------------------ 327 //------------------------------------------------------------------------------
313 // We can't be an an anonymous namespace while being friends, so we pop back 328 // We can't be an an anonymous namespace while being friends, so we pop back
314 // out to the base namespace here. We need to be friends to corrupt the 329 // out to the base namespace here. We need to be friends to corrupt the
315 // internals of the histogram and/or sampleset. 330 // internals of the histogram and/or sampleset.
316 TEST(HistogramTest, CorruptSampleCounts) { 331 TEST(HistogramTest, CorruptSampleCounts) {
317 scoped_refptr<Histogram> histogram = Histogram::FactoryGet( 332 Histogram* histogram(Histogram::FactoryGet(
318 "Histogram", 1, 64, 8, Histogram::kNoFlags); // As per header file. 333 "Histogram", 1, 64, 8, Histogram::kNoFlags)); // As per header file.
319 334
320 EXPECT_EQ(0, histogram->sample_.redundant_count()); 335 EXPECT_EQ(0, histogram->sample_.redundant_count());
321 histogram->Add(20); // Add some samples. 336 histogram->Add(20); // Add some samples.
322 histogram->Add(40); 337 histogram->Add(40);
323 EXPECT_EQ(2, histogram->sample_.redundant_count()); 338 EXPECT_EQ(2, histogram->sample_.redundant_count());
324 339
325 Histogram::SampleSet snapshot; 340 Histogram::SampleSet snapshot;
326 histogram->SnapshotSample(&snapshot); 341 histogram->SnapshotSample(&snapshot);
327 EXPECT_EQ(Histogram::NO_INCONSISTENCIES, 0); 342 EXPECT_EQ(Histogram::NO_INCONSISTENCIES, 0);
328 EXPECT_EQ(0, histogram->FindCorruption(snapshot)); // No default corruption. 343 EXPECT_EQ(0, histogram->FindCorruption(snapshot)); // No default corruption.
329 EXPECT_EQ(2, snapshot.redundant_count()); 344 EXPECT_EQ(2, snapshot.redundant_count());
330 345
331 snapshot.counts_[3] += 100; // Sample count won't match redundant count. 346 snapshot.counts_[3] += 100; // Sample count won't match redundant count.
332 EXPECT_EQ(Histogram::COUNT_LOW_ERROR, histogram->FindCorruption(snapshot)); 347 EXPECT_EQ(Histogram::COUNT_LOW_ERROR, histogram->FindCorruption(snapshot));
333 snapshot.counts_[2] -= 200; 348 snapshot.counts_[2] -= 200;
334 EXPECT_EQ(Histogram::COUNT_HIGH_ERROR, histogram->FindCorruption(snapshot)); 349 EXPECT_EQ(Histogram::COUNT_HIGH_ERROR, histogram->FindCorruption(snapshot));
335 350
336 // But we can't spot a corruption if it is compensated for. 351 // But we can't spot a corruption if it is compensated for.
337 snapshot.counts_[1] += 100; 352 snapshot.counts_[1] += 100;
338 EXPECT_EQ(0, histogram->FindCorruption(snapshot)); 353 EXPECT_EQ(0, histogram->FindCorruption(snapshot));
339 } 354 }
340 355
341 TEST(HistogramTest, CorruptBucketBounds) { 356 TEST(HistogramTest, CorruptBucketBounds) {
342 scoped_refptr<Histogram> histogram = Histogram::FactoryGet( 357 Histogram* histogram(Histogram::FactoryGet(
343 "Histogram", 1, 64, 8, Histogram::kNoFlags); // As per header file. 358 "Histogram", 1, 64, 8, Histogram::kNoFlags)); // As per header file.
344 359
345 Histogram::SampleSet snapshot; 360 Histogram::SampleSet snapshot;
346 histogram->SnapshotSample(&snapshot); 361 histogram->SnapshotSample(&snapshot);
347 EXPECT_EQ(Histogram::NO_INCONSISTENCIES, 0); 362 EXPECT_EQ(Histogram::NO_INCONSISTENCIES, 0);
348 EXPECT_EQ(0, histogram->FindCorruption(snapshot)); // No default corruption. 363 EXPECT_EQ(0, histogram->FindCorruption(snapshot)); // No default corruption.
349 364
350 std::swap(histogram->ranges_[1], histogram->ranges_[2]); 365 std::swap(histogram->ranges_[1], histogram->ranges_[2]);
351 EXPECT_EQ(Histogram::BUCKET_ORDER_ERROR | Histogram::RANGE_CHECKSUM_ERROR, 366 EXPECT_EQ(Histogram::BUCKET_ORDER_ERROR | Histogram::RANGE_CHECKSUM_ERROR,
352 histogram->FindCorruption(snapshot)); 367 histogram->FindCorruption(snapshot));
353 368
(...skipping 24 matching lines...) Expand all
378 if (checksum & 1) 393 if (checksum & 1)
379 checksum = kReversedPolynomial ^ (checksum >> 1); 394 checksum = kReversedPolynomial ^ (checksum >> 1);
380 else 395 else
381 checksum >>= 1; 396 checksum >>= 1;
382 } 397 }
383 EXPECT_EQ(Histogram::kCrcTable[i], checksum); 398 EXPECT_EQ(Histogram::kCrcTable[i], checksum);
384 } 399 }
385 } 400 }
386 401
387 } // namespace base 402 } // namespace base
OLDNEW
« no previous file with comments | « base/metrics/histogram.cc ('k') | chrome/browser/autocomplete/autocomplete.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698