xref: /aosp_15_r20/external/libchrome/base/metrics/sample_map_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "base/metrics/sample_map.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include <memory>
8*635a8641SAndroid Build Coastguard Worker 
9*635a8641SAndroid Build Coastguard Worker #include "base/test/gtest_util.h"
10*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
11*635a8641SAndroid Build Coastguard Worker 
12*635a8641SAndroid Build Coastguard Worker namespace base {
13*635a8641SAndroid Build Coastguard Worker namespace {
14*635a8641SAndroid Build Coastguard Worker 
TEST(SampleMapTest,AccumulateTest)15*635a8641SAndroid Build Coastguard Worker TEST(SampleMapTest, AccumulateTest) {
16*635a8641SAndroid Build Coastguard Worker   SampleMap samples(1);
17*635a8641SAndroid Build Coastguard Worker 
18*635a8641SAndroid Build Coastguard Worker   samples.Accumulate(1, 100);
19*635a8641SAndroid Build Coastguard Worker   samples.Accumulate(2, 200);
20*635a8641SAndroid Build Coastguard Worker   samples.Accumulate(1, -200);
21*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(-100, samples.GetCount(1));
22*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(200, samples.GetCount(2));
23*635a8641SAndroid Build Coastguard Worker 
24*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(300, samples.sum());
25*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(100, samples.TotalCount());
26*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(samples.redundant_count(), samples.TotalCount());
27*635a8641SAndroid Build Coastguard Worker }
28*635a8641SAndroid Build Coastguard Worker 
TEST(SampleMapTest,Accumulate_LargeValuesDontOverflow)29*635a8641SAndroid Build Coastguard Worker TEST(SampleMapTest, Accumulate_LargeValuesDontOverflow) {
30*635a8641SAndroid Build Coastguard Worker   SampleMap samples(1);
31*635a8641SAndroid Build Coastguard Worker 
32*635a8641SAndroid Build Coastguard Worker   samples.Accumulate(250000000, 100);
33*635a8641SAndroid Build Coastguard Worker   samples.Accumulate(500000000, 200);
34*635a8641SAndroid Build Coastguard Worker   samples.Accumulate(250000000, -200);
35*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(-100, samples.GetCount(250000000));
36*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(200, samples.GetCount(500000000));
37*635a8641SAndroid Build Coastguard Worker 
38*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(75000000000LL, samples.sum());
39*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(100, samples.TotalCount());
40*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(samples.redundant_count(), samples.TotalCount());
41*635a8641SAndroid Build Coastguard Worker }
42*635a8641SAndroid Build Coastguard Worker 
TEST(SampleMapTest,AddSubtractTest)43*635a8641SAndroid Build Coastguard Worker TEST(SampleMapTest, AddSubtractTest) {
44*635a8641SAndroid Build Coastguard Worker   SampleMap samples1(1);
45*635a8641SAndroid Build Coastguard Worker   SampleMap samples2(2);
46*635a8641SAndroid Build Coastguard Worker 
47*635a8641SAndroid Build Coastguard Worker   samples1.Accumulate(1, 100);
48*635a8641SAndroid Build Coastguard Worker   samples1.Accumulate(2, 100);
49*635a8641SAndroid Build Coastguard Worker   samples1.Accumulate(3, 100);
50*635a8641SAndroid Build Coastguard Worker 
51*635a8641SAndroid Build Coastguard Worker   samples2.Accumulate(1, 200);
52*635a8641SAndroid Build Coastguard Worker   samples2.Accumulate(2, 200);
53*635a8641SAndroid Build Coastguard Worker   samples2.Accumulate(4, 200);
54*635a8641SAndroid Build Coastguard Worker 
55*635a8641SAndroid Build Coastguard Worker   samples1.Add(samples2);
56*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(300, samples1.GetCount(1));
57*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(300, samples1.GetCount(2));
58*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(100, samples1.GetCount(3));
59*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(200, samples1.GetCount(4));
60*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2000, samples1.sum());
61*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(900, samples1.TotalCount());
62*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(samples1.redundant_count(), samples1.TotalCount());
63*635a8641SAndroid Build Coastguard Worker 
64*635a8641SAndroid Build Coastguard Worker   samples1.Subtract(samples2);
65*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(100, samples1.GetCount(1));
66*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(100, samples1.GetCount(2));
67*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(100, samples1.GetCount(3));
68*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, samples1.GetCount(4));
69*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(600, samples1.sum());
70*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(300, samples1.TotalCount());
71*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(samples1.redundant_count(), samples1.TotalCount());
72*635a8641SAndroid Build Coastguard Worker }
73*635a8641SAndroid Build Coastguard Worker 
TEST(SampleMapIteratorTest,IterateTest)74*635a8641SAndroid Build Coastguard Worker TEST(SampleMapIteratorTest, IterateTest) {
75*635a8641SAndroid Build Coastguard Worker   SampleMap samples(1);
76*635a8641SAndroid Build Coastguard Worker   samples.Accumulate(1, 100);
77*635a8641SAndroid Build Coastguard Worker   samples.Accumulate(2, 200);
78*635a8641SAndroid Build Coastguard Worker   samples.Accumulate(4, -300);
79*635a8641SAndroid Build Coastguard Worker   samples.Accumulate(5, 0);
80*635a8641SAndroid Build Coastguard Worker 
81*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<SampleCountIterator> it = samples.Iterator();
82*635a8641SAndroid Build Coastguard Worker 
83*635a8641SAndroid Build Coastguard Worker   HistogramBase::Sample min;
84*635a8641SAndroid Build Coastguard Worker   int64_t max;
85*635a8641SAndroid Build Coastguard Worker   HistogramBase::Count count;
86*635a8641SAndroid Build Coastguard Worker 
87*635a8641SAndroid Build Coastguard Worker   it->Get(&min, &max, &count);
88*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, min);
89*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, max);
90*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(100, count);
91*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(it->GetBucketIndex(nullptr));
92*635a8641SAndroid Build Coastguard Worker 
93*635a8641SAndroid Build Coastguard Worker   it->Next();
94*635a8641SAndroid Build Coastguard Worker   it->Get(&min, &max, &count);
95*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, min);
96*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(3, max);
97*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(200, count);
98*635a8641SAndroid Build Coastguard Worker 
99*635a8641SAndroid Build Coastguard Worker   it->Next();
100*635a8641SAndroid Build Coastguard Worker   it->Get(&min, &max, &count);
101*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(4, min);
102*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(5, max);
103*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(-300, count);
104*635a8641SAndroid Build Coastguard Worker 
105*635a8641SAndroid Build Coastguard Worker   it->Next();
106*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(it->Done());
107*635a8641SAndroid Build Coastguard Worker }
108*635a8641SAndroid Build Coastguard Worker 
TEST(SampleMapIteratorTest,SkipEmptyRanges)109*635a8641SAndroid Build Coastguard Worker TEST(SampleMapIteratorTest, SkipEmptyRanges) {
110*635a8641SAndroid Build Coastguard Worker   SampleMap samples(1);
111*635a8641SAndroid Build Coastguard Worker   samples.Accumulate(5, 1);
112*635a8641SAndroid Build Coastguard Worker   samples.Accumulate(10, 2);
113*635a8641SAndroid Build Coastguard Worker   samples.Accumulate(15, 3);
114*635a8641SAndroid Build Coastguard Worker   samples.Accumulate(20, 4);
115*635a8641SAndroid Build Coastguard Worker   samples.Accumulate(25, 5);
116*635a8641SAndroid Build Coastguard Worker 
117*635a8641SAndroid Build Coastguard Worker   SampleMap samples2(2);
118*635a8641SAndroid Build Coastguard Worker   samples2.Accumulate(5, 1);
119*635a8641SAndroid Build Coastguard Worker   samples2.Accumulate(20, 4);
120*635a8641SAndroid Build Coastguard Worker   samples2.Accumulate(25, 5);
121*635a8641SAndroid Build Coastguard Worker 
122*635a8641SAndroid Build Coastguard Worker   samples.Subtract(samples2);
123*635a8641SAndroid Build Coastguard Worker 
124*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<SampleCountIterator> it = samples.Iterator();
125*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(it->Done());
126*635a8641SAndroid Build Coastguard Worker 
127*635a8641SAndroid Build Coastguard Worker   HistogramBase::Sample min;
128*635a8641SAndroid Build Coastguard Worker   int64_t max;
129*635a8641SAndroid Build Coastguard Worker   HistogramBase::Count count;
130*635a8641SAndroid Build Coastguard Worker 
131*635a8641SAndroid Build Coastguard Worker   it->Get(&min, &max, &count);
132*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(10, min);
133*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(11, max);
134*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, count);
135*635a8641SAndroid Build Coastguard Worker 
136*635a8641SAndroid Build Coastguard Worker   it->Next();
137*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(it->Done());
138*635a8641SAndroid Build Coastguard Worker 
139*635a8641SAndroid Build Coastguard Worker   it->Get(&min, &max, &count);
140*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(15, min);
141*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(16, max);
142*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(3, count);
143*635a8641SAndroid Build Coastguard Worker 
144*635a8641SAndroid Build Coastguard Worker   it->Next();
145*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(it->Done());
146*635a8641SAndroid Build Coastguard Worker }
147*635a8641SAndroid Build Coastguard Worker 
TEST(SampleMapIteratorDeathTest,IterateDoneTest)148*635a8641SAndroid Build Coastguard Worker TEST(SampleMapIteratorDeathTest, IterateDoneTest) {
149*635a8641SAndroid Build Coastguard Worker   SampleMap samples(1);
150*635a8641SAndroid Build Coastguard Worker 
151*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<SampleCountIterator> it = samples.Iterator();
152*635a8641SAndroid Build Coastguard Worker 
153*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(it->Done());
154*635a8641SAndroid Build Coastguard Worker 
155*635a8641SAndroid Build Coastguard Worker   HistogramBase::Sample min;
156*635a8641SAndroid Build Coastguard Worker   int64_t max;
157*635a8641SAndroid Build Coastguard Worker   HistogramBase::Count count;
158*635a8641SAndroid Build Coastguard Worker   EXPECT_DCHECK_DEATH(it->Get(&min, &max, &count));
159*635a8641SAndroid Build Coastguard Worker 
160*635a8641SAndroid Build Coastguard Worker   EXPECT_DCHECK_DEATH(it->Next());
161*635a8641SAndroid Build Coastguard Worker 
162*635a8641SAndroid Build Coastguard Worker   samples.Accumulate(1, 100);
163*635a8641SAndroid Build Coastguard Worker   it = samples.Iterator();
164*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(it->Done());
165*635a8641SAndroid Build Coastguard Worker }
166*635a8641SAndroid Build Coastguard Worker 
167*635a8641SAndroid Build Coastguard Worker }  // namespace
168*635a8641SAndroid Build Coastguard Worker }  // namespace base
169