1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  * Android BPF library - public API
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #include <gtest/gtest.h>
19 #include "LongArrayMultiStateCounter.h"
20 
21 namespace android {
22 namespace battery {
23 
24 class LongArrayMultiStateCounterTest : public testing::Test {};
25 
TEST_F(LongArrayMultiStateCounterTest,stateChange)26 TEST_F(LongArrayMultiStateCounterTest, stateChange) {
27     LongArrayMultiStateCounter testCounter(2, std::vector<uint64_t>(4));
28     testCounter.updateValue(std::vector<uint64_t>({0, 0, 0, 0}), 1000);
29     testCounter.setState(0, 1000);
30     testCounter.setState(1, 2000);
31     testCounter.updateValue(std::vector<uint64_t>({100, 200, 300, 400}), 3000);
32 
33     // Time was split in half between the two states, so the counts will be split 50:50 too
34     EXPECT_EQ(std::vector<uint64_t>({50, 100, 150, 200}), testCounter.getCount(0));
35     EXPECT_EQ(std::vector<uint64_t>({50, 100, 150, 200}), testCounter.getCount(1));
36 }
37 
TEST_F(LongArrayMultiStateCounterTest,accumulation)38 TEST_F(LongArrayMultiStateCounterTest, accumulation) {
39     LongArrayMultiStateCounter testCounter(2, std::vector<uint64_t>(4));
40     testCounter.updateValue(std::vector<uint64_t>({0, 0, 0, 0}), 1000);
41     testCounter.setState(0, 1000);
42     testCounter.setState(1, 2000);
43     testCounter.updateValue(std::vector<uint64_t>({100, 200, 300, 400}), 3000);
44     testCounter.setState(0, 4000);
45     testCounter.updateValue(std::vector<uint64_t>({200, 300, 400, 500}), 8000);
46 
47     // The first delta is split 50:50:
48     //   0: {50, 100, 150, 200}
49     //   1: {50, 100, 150, 200}
50     // The second delta is split 4:1
51     //   0: {80, 80, 80, 80}
52     //   1: {20, 20, 20, 20}
53     EXPECT_EQ(std::vector<uint64_t>({130, 180, 230, 280}), testCounter.getCount(0));
54     EXPECT_EQ(std::vector<uint64_t>({70, 120, 170, 220}), testCounter.getCount(1));
55 }
56 
TEST_F(LongArrayMultiStateCounterTest,toString)57 TEST_F(LongArrayMultiStateCounterTest, toString) {
58     LongArrayMultiStateCounter testCounter(2, std::vector<uint64_t>(4));
59     testCounter.updateValue(std::vector<uint64_t>({0, 0, 0, 0}), 1000);
60     testCounter.setState(0, 1000);
61     testCounter.setState(1, 2000);
62     testCounter.updateValue(std::vector<uint64_t>({100, 200, 300, 400}), 3000);
63 
64     EXPECT_STREQ("[0: {50, 100, 150, 200}, 1: {50, 100, 150, 200}] updated: 3000 currentState: 1",
65                  testCounter.toString().c_str());
66 }
67 
68 } // namespace battery
69 } // namespace android
70