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/metrics/histogram.h"
8 #include "base/metrics/histogram_base.h"
9 #include "base/metrics/sparse_histogram.h"
10 #include "base/metrics/statistics_recorder.h"
11 #include "base/pickle.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace base {
15
16 class HistogramBaseTest : public testing::Test {
17 protected:
HistogramBaseTest()18 HistogramBaseTest() {
19 // Each test will have a clean state (no Histogram / BucketRanges
20 // registered).
21 statistics_recorder_ = NULL;
22 ResetStatisticsRecorder();
23 }
24
~HistogramBaseTest()25 ~HistogramBaseTest() override { delete statistics_recorder_; }
26
ResetStatisticsRecorder()27 void ResetStatisticsRecorder() {
28 delete statistics_recorder_;
29 statistics_recorder_ = new StatisticsRecorder();
30 }
31
32 private:
33 StatisticsRecorder* statistics_recorder_;
34 };
35
TEST_F(HistogramBaseTest,DeserializeHistogram)36 TEST_F(HistogramBaseTest, DeserializeHistogram) {
37 HistogramBase* histogram = Histogram::FactoryGet(
38 "TestHistogram", 1, 1000, 10,
39 (HistogramBase::kUmaTargetedHistogramFlag |
40 HistogramBase::kIPCSerializationSourceFlag));
41
42 Pickle pickle;
43 ASSERT_TRUE(histogram->SerializeInfo(&pickle));
44
45 PickleIterator iter(pickle);
46 HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
47 EXPECT_EQ(histogram, deserialized);
48
49 ResetStatisticsRecorder();
50
51 PickleIterator iter2(pickle);
52 deserialized = DeserializeHistogramInfo(&iter2);
53 EXPECT_TRUE(deserialized);
54 EXPECT_NE(histogram, deserialized);
55 EXPECT_EQ("TestHistogram", deserialized->histogram_name());
56 EXPECT_TRUE(deserialized->HasConstructionArguments(1, 1000, 10));
57
58 // kIPCSerializationSourceFlag will be cleared.
59 EXPECT_EQ(HistogramBase::kUmaTargetedHistogramFlag, deserialized->flags());
60 }
61
TEST_F(HistogramBaseTest,DeserializeLinearHistogram)62 TEST_F(HistogramBaseTest, DeserializeLinearHistogram) {
63 HistogramBase* histogram = LinearHistogram::FactoryGet(
64 "TestHistogram", 1, 1000, 10,
65 HistogramBase::kIPCSerializationSourceFlag);
66
67 Pickle pickle;
68 ASSERT_TRUE(histogram->SerializeInfo(&pickle));
69
70 PickleIterator iter(pickle);
71 HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
72 EXPECT_EQ(histogram, deserialized);
73
74 ResetStatisticsRecorder();
75
76 PickleIterator iter2(pickle);
77 deserialized = DeserializeHistogramInfo(&iter2);
78 EXPECT_TRUE(deserialized);
79 EXPECT_NE(histogram, deserialized);
80 EXPECT_EQ("TestHistogram", deserialized->histogram_name());
81 EXPECT_TRUE(deserialized->HasConstructionArguments(1, 1000, 10));
82 EXPECT_EQ(0, deserialized->flags());
83 }
84
TEST_F(HistogramBaseTest,DeserializeBooleanHistogram)85 TEST_F(HistogramBaseTest, DeserializeBooleanHistogram) {
86 HistogramBase* histogram = BooleanHistogram::FactoryGet(
87 "TestHistogram", HistogramBase::kIPCSerializationSourceFlag);
88
89 Pickle pickle;
90 ASSERT_TRUE(histogram->SerializeInfo(&pickle));
91
92 PickleIterator iter(pickle);
93 HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
94 EXPECT_EQ(histogram, deserialized);
95
96 ResetStatisticsRecorder();
97
98 PickleIterator iter2(pickle);
99 deserialized = DeserializeHistogramInfo(&iter2);
100 EXPECT_TRUE(deserialized);
101 EXPECT_NE(histogram, deserialized);
102 EXPECT_EQ("TestHistogram", deserialized->histogram_name());
103 EXPECT_TRUE(deserialized->HasConstructionArguments(1, 2, 3));
104 EXPECT_EQ(0, deserialized->flags());
105 }
106
TEST_F(HistogramBaseTest,DeserializeCustomHistogram)107 TEST_F(HistogramBaseTest, DeserializeCustomHistogram) {
108 std::vector<HistogramBase::Sample> ranges;
109 ranges.push_back(13);
110 ranges.push_back(5);
111 ranges.push_back(9);
112
113 HistogramBase* histogram = CustomHistogram::FactoryGet(
114 "TestHistogram", ranges, HistogramBase::kIPCSerializationSourceFlag);
115
116 Pickle pickle;
117 ASSERT_TRUE(histogram->SerializeInfo(&pickle));
118
119 PickleIterator iter(pickle);
120 HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
121 EXPECT_EQ(histogram, deserialized);
122
123 ResetStatisticsRecorder();
124
125 PickleIterator iter2(pickle);
126 deserialized = DeserializeHistogramInfo(&iter2);
127 EXPECT_TRUE(deserialized);
128 EXPECT_NE(histogram, deserialized);
129 EXPECT_EQ("TestHistogram", deserialized->histogram_name());
130 EXPECT_TRUE(deserialized->HasConstructionArguments(5, 13, 4));
131 EXPECT_EQ(0, deserialized->flags());
132 }
133
TEST_F(HistogramBaseTest,DeserializeSparseHistogram)134 TEST_F(HistogramBaseTest, DeserializeSparseHistogram) {
135 HistogramBase* histogram = SparseHistogram::FactoryGet(
136 "TestHistogram", HistogramBase::kIPCSerializationSourceFlag);
137
138 Pickle pickle;
139 ASSERT_TRUE(histogram->SerializeInfo(&pickle));
140
141 PickleIterator iter(pickle);
142 HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
143 EXPECT_EQ(histogram, deserialized);
144
145 ResetStatisticsRecorder();
146
147 PickleIterator iter2(pickle);
148 deserialized = DeserializeHistogramInfo(&iter2);
149 EXPECT_TRUE(deserialized);
150 EXPECT_NE(histogram, deserialized);
151 EXPECT_EQ("TestHistogram", deserialized->histogram_name());
152 EXPECT_EQ(0, deserialized->flags());
153 }
154
155 } // namespace base
156