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 "base/metrics/sample_map.h"
6
7 #include <memory>
8
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 namespace base {
12 namespace {
13
TEST(SampleMapTest,AccumulateTest)14 TEST(SampleMapTest, AccumulateTest) {
15 SampleMap samples(1);
16
17 samples.Accumulate(1, 100);
18 samples.Accumulate(2, 200);
19 samples.Accumulate(1, -200);
20 EXPECT_EQ(-100, samples.GetCount(1));
21 EXPECT_EQ(200, samples.GetCount(2));
22
23 EXPECT_EQ(300, samples.sum());
24 EXPECT_EQ(100, samples.TotalCount());
25 EXPECT_EQ(samples.redundant_count(), samples.TotalCount());
26 }
27
TEST(SampleMapTest,Accumulate_LargeValuesDontOverflow)28 TEST(SampleMapTest, Accumulate_LargeValuesDontOverflow) {
29 SampleMap samples(1);
30
31 samples.Accumulate(250000000, 100);
32 samples.Accumulate(500000000, 200);
33 samples.Accumulate(250000000, -200);
34 EXPECT_EQ(-100, samples.GetCount(250000000));
35 EXPECT_EQ(200, samples.GetCount(500000000));
36
37 EXPECT_EQ(75000000000LL, samples.sum());
38 EXPECT_EQ(100, samples.TotalCount());
39 EXPECT_EQ(samples.redundant_count(), samples.TotalCount());
40 }
41
TEST(SampleMapTest,AddSubtractTest)42 TEST(SampleMapTest, AddSubtractTest) {
43 SampleMap samples1(1);
44 SampleMap samples2(2);
45
46 samples1.Accumulate(1, 100);
47 samples1.Accumulate(2, 100);
48 samples1.Accumulate(3, 100);
49
50 samples2.Accumulate(1, 200);
51 samples2.Accumulate(2, 200);
52 samples2.Accumulate(4, 200);
53
54 samples1.Add(samples2);
55 EXPECT_EQ(300, samples1.GetCount(1));
56 EXPECT_EQ(300, samples1.GetCount(2));
57 EXPECT_EQ(100, samples1.GetCount(3));
58 EXPECT_EQ(200, samples1.GetCount(4));
59 EXPECT_EQ(2000, samples1.sum());
60 EXPECT_EQ(900, samples1.TotalCount());
61 EXPECT_EQ(samples1.redundant_count(), samples1.TotalCount());
62
63 samples1.Subtract(samples2);
64 EXPECT_EQ(100, samples1.GetCount(1));
65 EXPECT_EQ(100, samples1.GetCount(2));
66 EXPECT_EQ(100, samples1.GetCount(3));
67 EXPECT_EQ(0, samples1.GetCount(4));
68 EXPECT_EQ(600, samples1.sum());
69 EXPECT_EQ(300, samples1.TotalCount());
70 EXPECT_EQ(samples1.redundant_count(), samples1.TotalCount());
71 }
72
TEST(SampleMapIteratorTest,IterateTest)73 TEST(SampleMapIteratorTest, IterateTest) {
74 SampleMap samples(1);
75 samples.Accumulate(1, 100);
76 samples.Accumulate(2, 200);
77 samples.Accumulate(4, -300);
78 samples.Accumulate(5, 0);
79
80 std::unique_ptr<SampleCountIterator> it = samples.Iterator();
81
82 HistogramBase::Sample min;
83 HistogramBase::Sample max;
84 HistogramBase::Count count;
85
86 it->Get(&min, &max, &count);
87 EXPECT_EQ(1, min);
88 EXPECT_EQ(2, max);
89 EXPECT_EQ(100, count);
90 EXPECT_FALSE(it->GetBucketIndex(NULL));
91
92 it->Next();
93 it->Get(&min, &max, &count);
94 EXPECT_EQ(2, min);
95 EXPECT_EQ(3, max);
96 EXPECT_EQ(200, count);
97
98 it->Next();
99 it->Get(&min, &max, &count);
100 EXPECT_EQ(4, min);
101 EXPECT_EQ(5, max);
102 EXPECT_EQ(-300, count);
103
104 it->Next();
105 EXPECT_TRUE(it->Done());
106 }
107
TEST(SampleMapIteratorTest,SkipEmptyRanges)108 TEST(SampleMapIteratorTest, SkipEmptyRanges) {
109 SampleMap samples(1);
110 samples.Accumulate(5, 1);
111 samples.Accumulate(10, 2);
112 samples.Accumulate(15, 3);
113 samples.Accumulate(20, 4);
114 samples.Accumulate(25, 5);
115
116 SampleMap samples2(2);
117 samples2.Accumulate(5, 1);
118 samples2.Accumulate(20, 4);
119 samples2.Accumulate(25, 5);
120
121 samples.Subtract(samples2);
122
123 std::unique_ptr<SampleCountIterator> it = samples.Iterator();
124 EXPECT_FALSE(it->Done());
125
126 HistogramBase::Sample min;
127 HistogramBase::Sample max;
128 HistogramBase::Count count;
129
130 it->Get(&min, &max, &count);
131 EXPECT_EQ(10, min);
132 EXPECT_EQ(11, max);
133 EXPECT_EQ(2, count);
134
135 it->Next();
136 EXPECT_FALSE(it->Done());
137
138 it->Get(&min, &max, &count);
139 EXPECT_EQ(15, min);
140 EXPECT_EQ(16, max);
141 EXPECT_EQ(3, count);
142
143 it->Next();
144 EXPECT_TRUE(it->Done());
145 }
146
147 #if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) && GTEST_HAS_DEATH_TEST
148
TEST(SampleMapIteratorDeathTest,IterateDoneTest)149 TEST(SampleMapIteratorDeathTest, IterateDoneTest) {
150 SampleMap samples(1);
151
152 std::unique_ptr<SampleCountIterator> it = samples.Iterator();
153
154 EXPECT_TRUE(it->Done());
155
156 HistogramBase::Sample min;
157 HistogramBase::Sample max;
158 HistogramBase::Count count;
159 EXPECT_DEATH(it->Get(&min, &max, &count), "");
160
161 EXPECT_DEATH(it->Next(), "");
162
163 samples.Accumulate(1, 100);
164 it = samples.Iterator();
165 EXPECT_FALSE(it->Done());
166 }
167
168 #endif
169 // (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) && GTEST_HAS_DEATH_TEST
170
171 } // namespace
172 } // namespace base
173