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() { DrainBufferedCounters(); }
32     std::unordered_map<int32_t, int64_t> test_counters_;
33 
34   private:
Count(int32_t key,int64_t count)35     bool Count(int32_t key, int64_t count) override {
36       test_counters_[key] = count;
37       return true;
38     }
IsInitialized()39     bool IsInitialized() override { return true; }
40   };
41   TestableCounterMetrics testable_counter_metrics_;
42 };
43 
TEST_F(CounterMetricsTest,normal_case)44 TEST_F(CounterMetricsTest, normal_case) {
45   ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 2));
46   ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 3));
47   ASSERT_TRUE(testable_counter_metrics_.CacheCount(2, 4));
48   testable_counter_metrics_.DrainBuffer();
49   ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 5);
50   ASSERT_EQ(testable_counter_metrics_.test_counters_[2], 4);
51 }
52 
TEST_F(CounterMetricsTest,multiple_drain)53 TEST_F(CounterMetricsTest, multiple_drain) {
54   ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 2));
55   ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 3));
56   ASSERT_TRUE(testable_counter_metrics_.CacheCount(2, 4));
57   testable_counter_metrics_.DrainBuffer();
58   ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 5);
59   ASSERT_EQ(testable_counter_metrics_.test_counters_[2], 4);
60   testable_counter_metrics_.test_counters_.clear();
61   ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 20));
62   ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 30));
63   ASSERT_TRUE(testable_counter_metrics_.CacheCount(2, 40));
64   ASSERT_TRUE(testable_counter_metrics_.CacheCount(3, 100));
65   testable_counter_metrics_.DrainBuffer();
66   ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 50);
67   ASSERT_EQ(testable_counter_metrics_.test_counters_[2], 40);
68   ASSERT_EQ(testable_counter_metrics_.test_counters_[3], 100);
69 }
70 
TEST_F(CounterMetricsTest,overflow)71 TEST_F(CounterMetricsTest, overflow) {
72   ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, LLONG_MAX));
73   ASSERT_FALSE(testable_counter_metrics_.CacheCount(1, 1));
74   ASSERT_FALSE(testable_counter_metrics_.CacheCount(1, 2));
75   testable_counter_metrics_.DrainBuffer();
76   ASSERT_EQ(testable_counter_metrics_.test_counters_[1], LLONG_MAX);
77 }
78 
TEST_F(CounterMetricsTest,non_positive)79 TEST_F(CounterMetricsTest, non_positive) {
80   ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 5));
81   ASSERT_FALSE(testable_counter_metrics_.CacheCount(1, 0));
82   ASSERT_FALSE(testable_counter_metrics_.CacheCount(1, -1));
83   testable_counter_metrics_.DrainBuffer();
84   ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 5);
85 }
86 
87 }  // namespace
88 }  // namespace metrics
89 }  // namespace bluetooth
90