statistics_recorder_unittest.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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
3// found in the LICENSE file.
4
5#include <vector>
6
7#include "base/memory/scoped_ptr.h"
8#include "base/metrics/histogram.h"
9#include "base/metrics/statistics_recorder.h"
10#include "testing/gtest/include/gtest/gtest.h"
11
12namespace base {
13
14class StatisticsRecorderTest : public testing::Test {
15 protected:
16  virtual void SetUp() {
17    // Each test will have a clean state (no Histogram / BucketRanges
18    // registered).
19    InitializeStatisticsRecorder();
20  }
21
22  virtual void TearDown() {
23    UninitializeStatisticsRecorder();
24  }
25
26  void InitializeStatisticsRecorder() {
27    statistics_recorder_ = new StatisticsRecorder();
28  }
29
30  void UninitializeStatisticsRecorder() {
31    delete statistics_recorder_;
32    statistics_recorder_ = NULL;
33  }
34
35  Histogram* CreateHistogram(const std::string& name,
36                             HistogramBase::Sample min,
37                             HistogramBase::Sample max,
38                             size_t bucket_count) {
39    BucketRanges* ranges = new BucketRanges(bucket_count + 1);
40    Histogram::InitializeBucketRanges(min, max, ranges);
41    const BucketRanges* registered_ranges =
42        StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges);
43    return new Histogram(name, min, max, registered_ranges);
44  }
45
46  void DeleteHistogram(HistogramBase* histogram) {
47    delete histogram;
48  }
49
50  StatisticsRecorder* statistics_recorder_;
51};
52
53TEST_F(StatisticsRecorderTest, NotInitialized) {
54  UninitializeStatisticsRecorder();
55
56  ASSERT_FALSE(StatisticsRecorder::IsActive());
57
58  StatisticsRecorder::Histograms registered_histograms;
59  std::vector<const BucketRanges*> registered_ranges;
60
61  StatisticsRecorder::GetHistograms(&registered_histograms);
62  EXPECT_EQ(0u, registered_histograms.size());
63
64  Histogram* histogram = CreateHistogram("TestHistogram", 1, 1000, 10);
65
66  // When StatisticsRecorder is not initialized, register is a noop.
67  EXPECT_EQ(histogram,
68            StatisticsRecorder::RegisterOrDeleteDuplicate(histogram));
69  // Manually delete histogram that was not registered.
70  DeleteHistogram(histogram);
71
72  // RegisterOrDeleteDuplicateRanges is a no-op.
73  BucketRanges* ranges = new BucketRanges(3);;
74  ranges->ResetChecksum();
75  EXPECT_EQ(ranges,
76            StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges));
77  StatisticsRecorder::GetBucketRanges(&registered_ranges);
78  EXPECT_EQ(0u, registered_ranges.size());
79}
80
81TEST_F(StatisticsRecorderTest, RegisterBucketRanges) {
82  std::vector<const BucketRanges*> registered_ranges;
83
84  BucketRanges* ranges1 = new BucketRanges(3);;
85  ranges1->ResetChecksum();
86  BucketRanges* ranges2 = new BucketRanges(4);;
87  ranges2->ResetChecksum();
88
89  // Register new ranges.
90  EXPECT_EQ(ranges1,
91            StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges1));
92  EXPECT_EQ(ranges2,
93            StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges2));
94  StatisticsRecorder::GetBucketRanges(&registered_ranges);
95  ASSERT_EQ(2u, registered_ranges.size());
96
97  // Register some ranges again.
98  EXPECT_EQ(ranges1,
99            StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges1));
100  registered_ranges.clear();
101  StatisticsRecorder::GetBucketRanges(&registered_ranges);
102  ASSERT_EQ(2u, registered_ranges.size());
103  // Make sure the ranges is still the one we know.
104  ASSERT_EQ(3u, ranges1->size());
105  EXPECT_EQ(0, ranges1->range(0));
106  EXPECT_EQ(0, ranges1->range(1));
107  EXPECT_EQ(0, ranges1->range(2));
108
109  // Register ranges with same values.
110  BucketRanges* ranges3 = new BucketRanges(3);;
111  ranges3->ResetChecksum();
112  EXPECT_EQ(ranges1,  // returning ranges1
113            StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges3));
114  registered_ranges.clear();
115  StatisticsRecorder::GetBucketRanges(&registered_ranges);
116  ASSERT_EQ(2u, registered_ranges.size());
117}
118
119TEST_F(StatisticsRecorderTest, RegisterHistogram) {
120  // Create a Histogram that was not registered.
121  Histogram* histogram = CreateHistogram("TestHistogram", 1, 1000, 10);
122
123  StatisticsRecorder::Histograms registered_histograms;
124  StatisticsRecorder::GetHistograms(&registered_histograms);
125  EXPECT_EQ(0u, registered_histograms.size());
126
127  // Register the Histogram.
128  EXPECT_EQ(histogram,
129            StatisticsRecorder::RegisterOrDeleteDuplicate(histogram));
130  StatisticsRecorder::GetHistograms(&registered_histograms);
131  EXPECT_EQ(1u, registered_histograms.size());
132
133  // Register the same Histogram again.
134  EXPECT_EQ(histogram,
135            StatisticsRecorder::RegisterOrDeleteDuplicate(histogram));
136  registered_histograms.clear();
137  StatisticsRecorder::GetHistograms(&registered_histograms);
138  EXPECT_EQ(1u, registered_histograms.size());
139}
140
141TEST_F(StatisticsRecorderTest, FindHistogram) {
142  HistogramBase* histogram1 = Histogram::FactoryGet(
143      "TestHistogram1", 1, 1000, 10, HistogramBase::kNoFlags);
144  HistogramBase* histogram2 = Histogram::FactoryGet(
145      "TestHistogram2", 1, 1000, 10, HistogramBase::kNoFlags);
146
147  EXPECT_EQ(histogram1, StatisticsRecorder::FindHistogram("TestHistogram1"));
148  EXPECT_EQ(histogram2, StatisticsRecorder::FindHistogram("TestHistogram2"));
149  EXPECT_TRUE(StatisticsRecorder::FindHistogram("TestHistogram") == NULL);
150}
151
152TEST_F(StatisticsRecorderTest, GetSnapshot) {
153  Histogram::FactoryGet("TestHistogram1", 1, 1000, 10, Histogram::kNoFlags);
154  Histogram::FactoryGet("TestHistogram2", 1, 1000, 10, Histogram::kNoFlags);
155  Histogram::FactoryGet("TestHistogram3", 1, 1000, 10, Histogram::kNoFlags);
156
157  StatisticsRecorder::Histograms snapshot;
158  StatisticsRecorder::GetSnapshot("Test", &snapshot);
159  EXPECT_EQ(3u, snapshot.size());
160
161  snapshot.clear();
162  StatisticsRecorder::GetSnapshot("1", &snapshot);
163  EXPECT_EQ(1u, snapshot.size());
164
165  snapshot.clear();
166  StatisticsRecorder::GetSnapshot("hello", &snapshot);
167  EXPECT_EQ(0u, snapshot.size());
168}
169
170TEST_F(StatisticsRecorderTest, RegisterHistogramWithFactoryGet) {
171  StatisticsRecorder::Histograms registered_histograms;
172
173  StatisticsRecorder::GetHistograms(&registered_histograms);
174  ASSERT_EQ(0u, registered_histograms.size());
175
176  // Create a histogram.
177  HistogramBase* histogram = Histogram::FactoryGet(
178      "TestHistogram", 1, 1000, 10, HistogramBase::kNoFlags);
179  registered_histograms.clear();
180  StatisticsRecorder::GetHistograms(&registered_histograms);
181  EXPECT_EQ(1u, registered_histograms.size());
182
183  // Get an existing histogram.
184  HistogramBase* histogram2 = Histogram::FactoryGet(
185      "TestHistogram", 1, 1000, 10, HistogramBase::kNoFlags);
186  registered_histograms.clear();
187  StatisticsRecorder::GetHistograms(&registered_histograms);
188  EXPECT_EQ(1u, registered_histograms.size());
189  EXPECT_EQ(histogram, histogram2);
190
191  // Create a LinearHistogram.
192  histogram = LinearHistogram::FactoryGet(
193      "TestLinearHistogram", 1, 1000, 10, HistogramBase::kNoFlags);
194  registered_histograms.clear();
195  StatisticsRecorder::GetHistograms(&registered_histograms);
196  EXPECT_EQ(2u, registered_histograms.size());
197
198  // Create a BooleanHistogram.
199  histogram = BooleanHistogram::FactoryGet(
200      "TestBooleanHistogram", HistogramBase::kNoFlags);
201  registered_histograms.clear();
202  StatisticsRecorder::GetHistograms(&registered_histograms);
203  EXPECT_EQ(3u, registered_histograms.size());
204
205  // Create a CustomHistogram.
206  std::vector<int> custom_ranges;
207  custom_ranges.push_back(1);
208  custom_ranges.push_back(5);
209  histogram = CustomHistogram::FactoryGet(
210      "TestCustomHistogram", custom_ranges, HistogramBase::kNoFlags);
211  registered_histograms.clear();
212  StatisticsRecorder::GetHistograms(&registered_histograms);
213  EXPECT_EQ(4u, registered_histograms.size());
214}
215
216TEST_F(StatisticsRecorderTest, RegisterHistogramWithMacros) {
217  StatisticsRecorder::Histograms registered_histograms;
218
219  HistogramBase* histogram = Histogram::FactoryGet(
220      "TestHistogramCounts", 1, 1000000, 50, HistogramBase::kNoFlags);
221
222  // The histogram we got from macro is the same as from FactoryGet.
223  HISTOGRAM_COUNTS("TestHistogramCounts", 30);
224  registered_histograms.clear();
225  StatisticsRecorder::GetHistograms(&registered_histograms);
226  ASSERT_EQ(1u, registered_histograms.size());
227  EXPECT_EQ(histogram, registered_histograms[0]);
228
229  HISTOGRAM_TIMES("TestHistogramTimes", TimeDelta::FromDays(1));
230  HISTOGRAM_ENUMERATION("TestHistogramEnumeration", 20, 200);
231
232  registered_histograms.clear();
233  StatisticsRecorder::GetHistograms(&registered_histograms);
234  EXPECT_EQ(3u, registered_histograms.size());
235
236  // Debugging only macros.
237  DHISTOGRAM_TIMES("TestHistogramDebugTimes", TimeDelta::FromDays(1));
238  DHISTOGRAM_COUNTS("TestHistogramDebugCounts", 30);
239  registered_histograms.clear();
240  StatisticsRecorder::GetHistograms(&registered_histograms);
241#ifndef NDEBUG
242  EXPECT_EQ(5u, registered_histograms.size());
243#else
244  EXPECT_EQ(3u, registered_histograms.size());
245#endif
246}
247
248TEST_F(StatisticsRecorderTest, BucketRangesSharing) {
249  std::vector<const BucketRanges*> ranges;
250  StatisticsRecorder::GetBucketRanges(&ranges);
251  EXPECT_EQ(0u, ranges.size());
252
253  Histogram::FactoryGet("Histogram", 1, 64, 8, HistogramBase::kNoFlags);
254  Histogram::FactoryGet("Histogram2", 1, 64, 8, HistogramBase::kNoFlags);
255
256  StatisticsRecorder::GetBucketRanges(&ranges);
257  EXPECT_EQ(1u, ranges.size());
258
259  Histogram::FactoryGet("Histogram3", 1, 64, 16, HistogramBase::kNoFlags);
260
261  ranges.clear();
262  StatisticsRecorder::GetBucketRanges(&ranges);
263  EXPECT_EQ(2u, ranges.size());
264}
265
266}  // namespace base
267