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