1 /*
2  * Copyright 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "metrics/counter_metrics.h"
18 
19 #include <unordered_map>
20 
21 #include "gtest/gtest.h"
22 
23 namespace bluetooth {
24 namespace metrics {
25 namespace {
26 
27 class CounterMetricsTest : public ::testing::Test {
28  public:
29   class TestableCounterMetrics : public CounterMetrics {
30    public:
DrainBuffer()31     void DrainBuffer() {
32       DrainBufferedCounters();
33     }
34     std::unordered_map<int32_t, int64_t> test_counters_;
35    private:
Count(int32_t key,int64_t count)36     bool Count(int32_t key, int64_t count) override {
37       test_counters_[key] = count;
38       return true;
39     }
IsInitialized()40     bool IsInitialized() override {
41       return true;
42     }
43   };
44   TestableCounterMetrics testable_counter_metrics_;
45 };
46 
TEST_F(CounterMetricsTest,normal_case)47 TEST_F(CounterMetricsTest, normal_case) {
48   ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 2));
49   ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 3));
50   ASSERT_TRUE(testable_counter_metrics_.CacheCount(2, 4));
51   testable_counter_metrics_.DrainBuffer();
52   ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 5);
53   ASSERT_EQ(testable_counter_metrics_.test_counters_[2], 4);
54 }
55 
TEST_F(CounterMetricsTest,multiple_drain)56 TEST_F(CounterMetricsTest, multiple_drain) {
57   ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 2));
58   ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 3));
59   ASSERT_TRUE(testable_counter_metrics_.CacheCount(2, 4));
60   testable_counter_metrics_.DrainBuffer();
61   ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 5);
62   ASSERT_EQ(testable_counter_metrics_.test_counters_[2], 4);
63   testable_counter_metrics_.test_counters_.clear();
64   ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 20));
65   ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 30));
66   ASSERT_TRUE(testable_counter_metrics_.CacheCount(2, 40));
67   ASSERT_TRUE(testable_counter_metrics_.CacheCount(3, 100));
68   testable_counter_metrics_.DrainBuffer();
69   ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 50);
70   ASSERT_EQ(testable_counter_metrics_.test_counters_[2], 40);
71   ASSERT_EQ(testable_counter_metrics_.test_counters_[3], 100);
72 }
73 
TEST_F(CounterMetricsTest,overflow)74 TEST_F(CounterMetricsTest, overflow) {
75   ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, LLONG_MAX));
76   ASSERT_FALSE(testable_counter_metrics_.CacheCount(1, 1));
77   ASSERT_FALSE(testable_counter_metrics_.CacheCount(1, 2));
78   testable_counter_metrics_.DrainBuffer();
79   ASSERT_EQ(testable_counter_metrics_.test_counters_[1], LLONG_MAX);
80 }
81 
TEST_F(CounterMetricsTest,non_positive)82 TEST_F(CounterMetricsTest, non_positive) {
83   ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 5));
84   ASSERT_FALSE(testable_counter_metrics_.CacheCount(1, 0));
85   ASSERT_FALSE(testable_counter_metrics_.CacheCount(1, -1));
86   testable_counter_metrics_.DrainBuffer();
87   ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 5);
88 }
89 
90 }  // namespace
91 }  // namespace metrics
92 }  // namespace bluetooth
93