• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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