1 /*
2  *  Copyright 2018 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "rtc_base/numerics/sample_counter.h"
12 
13 #include <initializer_list>
14 
15 #include "test/gmock.h"
16 #include "test/gtest.h"
17 
18 using ::testing::Eq;
19 
20 namespace rtc {
21 
TEST(SampleCounterTest,ProcessesNoSamples)22 TEST(SampleCounterTest, ProcessesNoSamples) {
23   constexpr int kMinSamples = 1;
24   SampleCounter counter;
25   EXPECT_THAT(counter.Avg(kMinSamples), Eq(absl::nullopt));
26   EXPECT_THAT(counter.Max(), Eq(absl::nullopt));
27 }
28 
TEST(SampleCounterTest,NotEnoughSamples)29 TEST(SampleCounterTest, NotEnoughSamples) {
30   constexpr int kMinSamples = 6;
31   SampleCounter counter;
32   for (int value : {1, 2, 3, 4, 5}) {
33     counter.Add(value);
34   }
35   EXPECT_THAT(counter.Avg(kMinSamples), Eq(absl::nullopt));
36   EXPECT_THAT(counter.Sum(kMinSamples), Eq(absl::nullopt));
37   EXPECT_THAT(counter.Max(), Eq(5));
38 }
39 
TEST(SampleCounterTest,EnoughSamples)40 TEST(SampleCounterTest, EnoughSamples) {
41   constexpr int kMinSamples = 5;
42   SampleCounter counter;
43   for (int value : {1, 2, 3, 4, 5}) {
44     counter.Add(value);
45   }
46   EXPECT_THAT(counter.Avg(kMinSamples), Eq(3));
47   EXPECT_THAT(counter.Sum(kMinSamples), Eq(15));
48   EXPECT_THAT(counter.Max(), Eq(5));
49 }
50 
TEST(SampleCounterTest,ComputesVariance)51 TEST(SampleCounterTest, ComputesVariance) {
52   constexpr int kMinSamples = 5;
53   SampleCounterWithVariance counter;
54   for (int value : {1, 2, 3, 4, 5}) {
55     counter.Add(value);
56   }
57   EXPECT_THAT(counter.Variance(kMinSamples), Eq(2));
58 }
59 
TEST(SampleCounterTest,AggregatesTwoCounters)60 TEST(SampleCounterTest, AggregatesTwoCounters) {
61   constexpr int kMinSamples = 5;
62   SampleCounterWithVariance counter1;
63   for (int value : {1, 2, 3}) {
64     counter1.Add(value);
65   }
66   SampleCounterWithVariance counter2;
67   for (int value : {4, 5}) {
68     counter2.Add(value);
69   }
70   // Before aggregation there is not enough samples.
71   EXPECT_THAT(counter1.Avg(kMinSamples), Eq(absl::nullopt));
72   EXPECT_THAT(counter1.Variance(kMinSamples), Eq(absl::nullopt));
73   // Aggregate counter2 in counter1.
74   counter1.Add(counter2);
75   EXPECT_THAT(counter1.Avg(kMinSamples), Eq(3));
76   EXPECT_THAT(counter1.Max(), Eq(5));
77   EXPECT_THAT(counter1.Variance(kMinSamples), Eq(2));
78 }
79 
80 }  // namespace rtc
81