1 // Copyright (c) 2017 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/histogram_samples.h"
6 
7 #include <limits>
8 
9 #include "base/test/gtest_util.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 
12 namespace base {
13 
14 using SingleSample = HistogramSamples::SingleSample;
15 using AtomicSingleSample = HistogramSamples::AtomicSingleSample;
16 
TEST(SingleSampleTest,Load)17 TEST(SingleSampleTest, Load) {
18   AtomicSingleSample sample;
19   ASSERT_TRUE(sample.Accumulate(9, 1));
20 
21   SingleSample s = sample.Load();
22   EXPECT_EQ(9U, s.bucket);
23   EXPECT_EQ(1U, s.count);
24 
25   s = sample.Load();
26   EXPECT_EQ(9U, s.bucket);
27   EXPECT_EQ(1U, s.count);
28 }
29 
TEST(SingleSampleTest,Extract)30 TEST(SingleSampleTest, Extract) {
31   AtomicSingleSample sample;
32   ASSERT_TRUE(sample.Accumulate(9, 1));
33 
34   SingleSample s = sample.Extract(/*disable=*/false);
35   EXPECT_EQ(9U, s.bucket);
36   EXPECT_EQ(1U, s.count);
37 
38   s = sample.Extract(/*disable=*/false);
39   EXPECT_EQ(0U, s.bucket);
40   EXPECT_EQ(0U, s.count);
41 }
42 
TEST(SingleSampleTest,Disable)43 TEST(SingleSampleTest, Disable) {
44   AtomicSingleSample sample;
45   EXPECT_EQ(0U, sample.Extract(/*disable=*/false).count);
46   EXPECT_FALSE(sample.IsDisabled());
47 
48   ASSERT_TRUE(sample.Accumulate(9, 1));
49   EXPECT_EQ(1U, sample.Extract(/*disable=*/true).count);
50   EXPECT_TRUE(sample.IsDisabled());
51 
52   ASSERT_FALSE(sample.Accumulate(9, 1));
53   EXPECT_EQ(0U, sample.Extract(/*disable=*/false).count);
54   EXPECT_FALSE(sample.IsDisabled());
55 }
56 
TEST(SingleSampleTest,Accumulate)57 TEST(SingleSampleTest, Accumulate) {
58   AtomicSingleSample sample;
59 
60   ASSERT_TRUE(sample.Accumulate(9, 1));
61   ASSERT_TRUE(sample.Accumulate(9, 2));
62   ASSERT_TRUE(sample.Accumulate(9, 4));
63   EXPECT_EQ(7U, sample.Extract(/*disable=*/false).count);
64 
65   ASSERT_TRUE(sample.Accumulate(9, 4));
66   ASSERT_TRUE(sample.Accumulate(9, -2));
67   ASSERT_TRUE(sample.Accumulate(9, 1));
68   EXPECT_EQ(3U, sample.Extract(/*disable=*/false).count);
69 }
70 
TEST(SingleSampleTest,Overflow)71 TEST(SingleSampleTest, Overflow) {
72   AtomicSingleSample sample;
73 
74   ASSERT_TRUE(sample.Accumulate(9, 1));
75   ASSERT_FALSE(sample.Accumulate(9, -2));
76   EXPECT_EQ(1U, sample.Extract(/*disable=*/false).count);
77 
78   ASSERT_TRUE(sample.Accumulate(9, std::numeric_limits<uint16_t>::max()));
79   ASSERT_FALSE(sample.Accumulate(9, 1));
80   EXPECT_EQ(std::numeric_limits<uint16_t>::max(),
81             sample.Extract(/*disable=*/false).count);
82 }
83 
84 }  // namespace base
85