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