1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/metrics/histogram_samples.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <limits>
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #include "base/test/gtest_util.h"
10*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
11*6777b538SAndroid Build Coastguard Worker
12*6777b538SAndroid Build Coastguard Worker namespace base {
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Worker using SingleSample = HistogramSamples::SingleSample;
15*6777b538SAndroid Build Coastguard Worker using AtomicSingleSample = HistogramSamples::AtomicSingleSample;
16*6777b538SAndroid Build Coastguard Worker
TEST(SingleSampleTest,Load)17*6777b538SAndroid Build Coastguard Worker TEST(SingleSampleTest, Load) {
18*6777b538SAndroid Build Coastguard Worker AtomicSingleSample sample;
19*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(sample.Accumulate(9, 1));
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Worker SingleSample s = sample.Load();
22*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(9U, s.bucket);
23*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, s.count);
24*6777b538SAndroid Build Coastguard Worker
25*6777b538SAndroid Build Coastguard Worker s = sample.Load();
26*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(9U, s.bucket);
27*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, s.count);
28*6777b538SAndroid Build Coastguard Worker
29*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(sample.Accumulate(9, 1));
30*6777b538SAndroid Build Coastguard Worker s = sample.Load();
31*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(9U, s.bucket);
32*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2U, s.count);
33*6777b538SAndroid Build Coastguard Worker }
34*6777b538SAndroid Build Coastguard Worker
TEST(SingleSampleTest,Extract)35*6777b538SAndroid Build Coastguard Worker TEST(SingleSampleTest, Extract) {
36*6777b538SAndroid Build Coastguard Worker AtomicSingleSample sample;
37*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(sample.Accumulate(9, 1));
38*6777b538SAndroid Build Coastguard Worker
39*6777b538SAndroid Build Coastguard Worker SingleSample s = sample.Extract();
40*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(9U, s.bucket);
41*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, s.count);
42*6777b538SAndroid Build Coastguard Worker
43*6777b538SAndroid Build Coastguard Worker s = sample.Extract();
44*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0U, s.bucket);
45*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0U, s.count);
46*6777b538SAndroid Build Coastguard Worker
47*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(sample.Accumulate(1, 2));
48*6777b538SAndroid Build Coastguard Worker s = sample.Extract();
49*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, s.bucket);
50*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2U, s.count);
51*6777b538SAndroid Build Coastguard Worker }
52*6777b538SAndroid Build Coastguard Worker
TEST(SingleSampleTest,Disable)53*6777b538SAndroid Build Coastguard Worker TEST(SingleSampleTest, Disable) {
54*6777b538SAndroid Build Coastguard Worker AtomicSingleSample sample;
55*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0U, sample.Extract().count);
56*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(sample.IsDisabled());
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(sample.Accumulate(9, 1));
59*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, sample.ExtractAndDisable().count);
60*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(sample.IsDisabled());
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(sample.Accumulate(9, 1));
63*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0U, sample.Extract().count);
64*6777b538SAndroid Build Coastguard Worker // The sample should still be disabled.
65*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(sample.IsDisabled());
66*6777b538SAndroid Build Coastguard Worker }
67*6777b538SAndroid Build Coastguard Worker
TEST(SingleSampleTest,Accumulate)68*6777b538SAndroid Build Coastguard Worker TEST(SingleSampleTest, Accumulate) {
69*6777b538SAndroid Build Coastguard Worker AtomicSingleSample sample;
70*6777b538SAndroid Build Coastguard Worker
71*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(sample.Accumulate(9, 1));
72*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(sample.Accumulate(9, 2));
73*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(sample.Accumulate(9, 4));
74*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(sample.Accumulate(10, 1));
75*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(7U, sample.Extract().count);
76*6777b538SAndroid Build Coastguard Worker
77*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(sample.Accumulate(9, 4));
78*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(sample.Accumulate(9, -2));
79*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(sample.Accumulate(9, 1));
80*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(sample.Accumulate(10, 1));
81*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3U, sample.Extract().count);
82*6777b538SAndroid Build Coastguard Worker }
83*6777b538SAndroid Build Coastguard Worker
TEST(SingleSampleTest,Overflow)84*6777b538SAndroid Build Coastguard Worker TEST(SingleSampleTest, Overflow) {
85*6777b538SAndroid Build Coastguard Worker AtomicSingleSample sample;
86*6777b538SAndroid Build Coastguard Worker
87*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(sample.Accumulate(9, 1));
88*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(sample.Accumulate(9, -2));
89*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, sample.Extract().count);
90*6777b538SAndroid Build Coastguard Worker
91*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(sample.Accumulate(9, std::numeric_limits<uint16_t>::max()));
92*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(sample.Accumulate(9, 1));
93*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::numeric_limits<uint16_t>::max(), sample.Extract().count);
94*6777b538SAndroid Build Coastguard Worker }
95*6777b538SAndroid Build Coastguard Worker
TEST(HistogramSamplesTest,WriteAsciiBucketGraph)96*6777b538SAndroid Build Coastguard Worker TEST(HistogramSamplesTest, WriteAsciiBucketGraph) {
97*6777b538SAndroid Build Coastguard Worker constexpr int kLineLength = 72;
98*6777b538SAndroid Build Coastguard Worker constexpr size_t kOutputSize = kLineLength + 1;
99*6777b538SAndroid Build Coastguard Worker
100*6777b538SAndroid Build Coastguard Worker std::string output;
101*6777b538SAndroid Build Coastguard Worker
102*6777b538SAndroid Build Coastguard Worker HistogramSamples::WriteAsciiBucketGraph(0.0, kLineLength, &output);
103*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(output.size(), kOutputSize);
104*6777b538SAndroid Build Coastguard Worker output.clear();
105*6777b538SAndroid Build Coastguard Worker
106*6777b538SAndroid Build Coastguard Worker HistogramSamples::WriteAsciiBucketGraph(-1.0, kLineLength, &output);
107*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(output.size(), kOutputSize);
108*6777b538SAndroid Build Coastguard Worker output.clear();
109*6777b538SAndroid Build Coastguard Worker
110*6777b538SAndroid Build Coastguard Worker HistogramSamples::WriteAsciiBucketGraph(kLineLength - 1, kLineLength,
111*6777b538SAndroid Build Coastguard Worker &output);
112*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(output.size(), kOutputSize);
113*6777b538SAndroid Build Coastguard Worker output.clear();
114*6777b538SAndroid Build Coastguard Worker
115*6777b538SAndroid Build Coastguard Worker HistogramSamples::WriteAsciiBucketGraph(kLineLength, kLineLength, &output);
116*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(output.size(), kOutputSize);
117*6777b538SAndroid Build Coastguard Worker output.clear();
118*6777b538SAndroid Build Coastguard Worker
119*6777b538SAndroid Build Coastguard Worker HistogramSamples::WriteAsciiBucketGraph(kLineLength + 1, kLineLength,
120*6777b538SAndroid Build Coastguard Worker &output);
121*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(output.size(), kOutputSize + 1);
122*6777b538SAndroid Build Coastguard Worker }
123*6777b538SAndroid Build Coastguard Worker
124*6777b538SAndroid Build Coastguard Worker } // namespace base
125