xref: /aosp_15_r20/frameworks/native/libs/battery/MultiStateCounterTest.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2021 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  * Android BPF library - public API
4*38e8c45fSAndroid Build Coastguard Worker  *
5*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
8*38e8c45fSAndroid Build Coastguard Worker  *
9*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
10*38e8c45fSAndroid Build Coastguard Worker  *
11*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
16*38e8c45fSAndroid Build Coastguard Worker  */
17*38e8c45fSAndroid Build Coastguard Worker 
18*38e8c45fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
19*38e8c45fSAndroid Build Coastguard Worker #include "MultiStateCounter.h"
20*38e8c45fSAndroid Build Coastguard Worker 
21*38e8c45fSAndroid Build Coastguard Worker namespace android {
22*38e8c45fSAndroid Build Coastguard Worker namespace battery {
23*38e8c45fSAndroid Build Coastguard Worker 
24*38e8c45fSAndroid Build Coastguard Worker typedef MultiStateCounter<double, double> DoubleMultiStateCounter;
25*38e8c45fSAndroid Build Coastguard Worker 
26*38e8c45fSAndroid Build Coastguard Worker template <>
delta(const double & previousValue,const double & newValue,double * outValue) const27*38e8c45fSAndroid Build Coastguard Worker bool DoubleMultiStateCounter::delta(const double& previousValue, const double& newValue,
28*38e8c45fSAndroid Build Coastguard Worker                                     double* outValue) const {
29*38e8c45fSAndroid Build Coastguard Worker     *outValue = newValue - previousValue;
30*38e8c45fSAndroid Build Coastguard Worker     return *outValue >= 0;
31*38e8c45fSAndroid Build Coastguard Worker }
32*38e8c45fSAndroid Build Coastguard Worker 
33*38e8c45fSAndroid Build Coastguard Worker template <>
add(double * value1,const double & value2,const uint64_t numerator,const uint64_t denominator) const34*38e8c45fSAndroid Build Coastguard Worker void DoubleMultiStateCounter::add(double* value1, const double& value2, const uint64_t numerator,
35*38e8c45fSAndroid Build Coastguard Worker                                   const uint64_t denominator) const {
36*38e8c45fSAndroid Build Coastguard Worker     if (numerator != denominator) {
37*38e8c45fSAndroid Build Coastguard Worker         // The caller ensures that denominator != 0
38*38e8c45fSAndroid Build Coastguard Worker         *value1 += value2 * numerator / denominator;
39*38e8c45fSAndroid Build Coastguard Worker     } else {
40*38e8c45fSAndroid Build Coastguard Worker         *value1 += value2;
41*38e8c45fSAndroid Build Coastguard Worker     }
42*38e8c45fSAndroid Build Coastguard Worker }
43*38e8c45fSAndroid Build Coastguard Worker 
44*38e8c45fSAndroid Build Coastguard Worker class MultiStateCounterTest : public testing::Test {};
45*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(MultiStateCounterTest,constructor)46*38e8c45fSAndroid Build Coastguard Worker TEST_F(MultiStateCounterTest, constructor) {
47*38e8c45fSAndroid Build Coastguard Worker     DoubleMultiStateCounter testCounter(3, 0);
48*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(0, 0);
49*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(1, 0);
50*38e8c45fSAndroid Build Coastguard Worker     double delta = testCounter.updateValue(3.14, 3000);
51*38e8c45fSAndroid Build Coastguard Worker 
52*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(0, testCounter.getCount(0));
53*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(3.14, testCounter.getCount(1));
54*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(0, testCounter.getCount(2));
55*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(3.14, delta);
56*38e8c45fSAndroid Build Coastguard Worker }
57*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(MultiStateCounterTest,stateChange)58*38e8c45fSAndroid Build Coastguard Worker TEST_F(MultiStateCounterTest, stateChange) {
59*38e8c45fSAndroid Build Coastguard Worker     DoubleMultiStateCounter testCounter(3, 0);
60*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(0, 0);
61*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(1, 0);
62*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(2, 1000);
63*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(6.0, 3000);
64*38e8c45fSAndroid Build Coastguard Worker 
65*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(0, testCounter.getCount(0));
66*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(2.0, testCounter.getCount(1));
67*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(4.0, testCounter.getCount(2));
68*38e8c45fSAndroid Build Coastguard Worker }
69*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(MultiStateCounterTest,copyStatesFrom)70*38e8c45fSAndroid Build Coastguard Worker TEST_F(MultiStateCounterTest, copyStatesFrom) {
71*38e8c45fSAndroid Build Coastguard Worker     DoubleMultiStateCounter sourceCounter(3, 0);
72*38e8c45fSAndroid Build Coastguard Worker 
73*38e8c45fSAndroid Build Coastguard Worker     sourceCounter.updateValue(0, 0);
74*38e8c45fSAndroid Build Coastguard Worker     sourceCounter.setState(1, 0);
75*38e8c45fSAndroid Build Coastguard Worker     sourceCounter.setState(2, 1000);
76*38e8c45fSAndroid Build Coastguard Worker 
77*38e8c45fSAndroid Build Coastguard Worker     DoubleMultiStateCounter testCounter(3, 0);
78*38e8c45fSAndroid Build Coastguard Worker     testCounter.copyStatesFrom(sourceCounter);
79*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(6.0, 3000);
80*38e8c45fSAndroid Build Coastguard Worker 
81*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(0, testCounter.getCount(0));
82*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(2.0, testCounter.getCount(1));
83*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(4.0, testCounter.getCount(2));
84*38e8c45fSAndroid Build Coastguard Worker }
85*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(MultiStateCounterTest,setEnabled)86*38e8c45fSAndroid Build Coastguard Worker TEST_F(MultiStateCounterTest, setEnabled) {
87*38e8c45fSAndroid Build Coastguard Worker     DoubleMultiStateCounter testCounter(3, 0);
88*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(0, 0);
89*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(1, 0);
90*38e8c45fSAndroid Build Coastguard Worker     testCounter.setEnabled(false, 1000);
91*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(2, 2000);
92*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(6.0, 3000);
93*38e8c45fSAndroid Build Coastguard Worker 
94*38e8c45fSAndroid Build Coastguard Worker     // In state 1: accumulated 1000 before disabled, that's 6.0 * 1000/3000 = 2.0
95*38e8c45fSAndroid Build Coastguard Worker     // In state 2: 0, since it is still disabled
96*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(0, testCounter.getCount(0));
97*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(2.0, testCounter.getCount(1));
98*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(0, testCounter.getCount(2));
99*38e8c45fSAndroid Build Coastguard Worker 
100*38e8c45fSAndroid Build Coastguard Worker     // Should have no effect since the counter is disabled
101*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(0, 3500);
102*38e8c45fSAndroid Build Coastguard Worker 
103*38e8c45fSAndroid Build Coastguard Worker     // Should have no effect since the counter is disabled
104*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(10.0, 4000);
105*38e8c45fSAndroid Build Coastguard Worker 
106*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(0, testCounter.getCount(0));
107*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(2.0, testCounter.getCount(1));
108*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(0, testCounter.getCount(2));
109*38e8c45fSAndroid Build Coastguard Worker 
110*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(2, 4500);
111*38e8c45fSAndroid Build Coastguard Worker 
112*38e8c45fSAndroid Build Coastguard Worker     // Enable the counter to partially accumulate deltas for the current state, 2
113*38e8c45fSAndroid Build Coastguard Worker     testCounter.setEnabled(true, 5000);
114*38e8c45fSAndroid Build Coastguard Worker     testCounter.setEnabled(false, 6000);
115*38e8c45fSAndroid Build Coastguard Worker     testCounter.setEnabled(true, 7000);
116*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(20.0, 8000);
117*38e8c45fSAndroid Build Coastguard Worker 
118*38e8c45fSAndroid Build Coastguard Worker     // The delta is 10.0 over 5000-3000=2000.
119*38e8c45fSAndroid Build Coastguard Worker     // Counter has been enabled in state 2 for (6000-5000)+(8000-7000) = 2000,
120*38e8c45fSAndroid Build Coastguard Worker     // so its share is (20.0-10.0) * 2000/(8000-4000) = 5.0
121*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(0, testCounter.getCount(0));
122*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(2.0, testCounter.getCount(1));
123*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(5.0, testCounter.getCount(2));
124*38e8c45fSAndroid Build Coastguard Worker 
125*38e8c45fSAndroid Build Coastguard Worker     testCounter.reset();
126*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(0, 0);
127*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(0, 0);
128*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(1, 2000);
129*38e8c45fSAndroid Build Coastguard Worker     testCounter.setEnabled(false, 3000);
130*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(200, 5000);
131*38e8c45fSAndroid Build Coastguard Worker 
132*38e8c45fSAndroid Build Coastguard Worker     // 200 over 5000 = 40 per second
133*38e8c45fSAndroid Build Coastguard Worker     // Counter was in state 0 from 0 to 2000, so 2 sec, so the count should be 40 * 2 = 80
134*38e8c45fSAndroid Build Coastguard Worker     // It stayed in state 1 from 2000 to 3000, at which point the counter was disabled,
135*38e8c45fSAndroid Build Coastguard Worker     // so the count for state 1 should be 40 * 1 = 40.
136*38e8c45fSAndroid Build Coastguard Worker     // The remaining 2 seconds from 3000 to 5000 don't count because the counter was disabled.
137*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(80.0, testCounter.getCount(0));
138*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(40.0, testCounter.getCount(1));
139*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(0, testCounter.getCount(2));
140*38e8c45fSAndroid Build Coastguard Worker }
141*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(MultiStateCounterTest,reset)142*38e8c45fSAndroid Build Coastguard Worker TEST_F(MultiStateCounterTest, reset) {
143*38e8c45fSAndroid Build Coastguard Worker     DoubleMultiStateCounter testCounter(3, 0);
144*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(0, 0);
145*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(1, 0);
146*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(2.72, 3000);
147*38e8c45fSAndroid Build Coastguard Worker 
148*38e8c45fSAndroid Build Coastguard Worker     testCounter.reset();
149*38e8c45fSAndroid Build Coastguard Worker 
150*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(0, testCounter.getCount(0));
151*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(0, testCounter.getCount(1));
152*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(0, testCounter.getCount(2));
153*38e8c45fSAndroid Build Coastguard Worker 
154*38e8c45fSAndroid Build Coastguard Worker     // Assert that we can still continue accumulating after a reset
155*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(0, 4000);
156*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(3.14, 5000);
157*38e8c45fSAndroid Build Coastguard Worker 
158*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(0, testCounter.getCount(0));
159*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(3.14, testCounter.getCount(1));
160*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(0, testCounter.getCount(2));
161*38e8c45fSAndroid Build Coastguard Worker }
162*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(MultiStateCounterTest,timeAdjustment_setState)163*38e8c45fSAndroid Build Coastguard Worker TEST_F(MultiStateCounterTest, timeAdjustment_setState) {
164*38e8c45fSAndroid Build Coastguard Worker     DoubleMultiStateCounter testCounter(3, 0);
165*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(0, 0);
166*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(1, 0);
167*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(2, 2000);
168*38e8c45fSAndroid Build Coastguard Worker 
169*38e8c45fSAndroid Build Coastguard Worker     // Time moves back
170*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(1, 1000);
171*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(6.0, 3000);
172*38e8c45fSAndroid Build Coastguard Worker 
173*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(0, testCounter.getCount(0));
174*38e8c45fSAndroid Build Coastguard Worker 
175*38e8c45fSAndroid Build Coastguard Worker     // We were in state 1 from 0 to 2000, which was erased because the time moved back.
176*38e8c45fSAndroid Build Coastguard Worker     // Then from 1000 to 3000, so we expect the count to be 6 * (2000/3000)
177*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(4.0, testCounter.getCount(1));
178*38e8c45fSAndroid Build Coastguard Worker 
179*38e8c45fSAndroid Build Coastguard Worker     // No time was effectively accumulated for state 2, because the timestamp moved back
180*38e8c45fSAndroid Build Coastguard Worker     // while we were in state 2.
181*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(0, testCounter.getCount(2));
182*38e8c45fSAndroid Build Coastguard Worker }
183*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(MultiStateCounterTest,timeAdjustment_updateValue)184*38e8c45fSAndroid Build Coastguard Worker TEST_F(MultiStateCounterTest, timeAdjustment_updateValue) {
185*38e8c45fSAndroid Build Coastguard Worker     DoubleMultiStateCounter testCounter(1, 0);
186*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(0, 0);
187*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(0, 0);
188*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(6.0, 2000);
189*38e8c45fSAndroid Build Coastguard Worker 
190*38e8c45fSAndroid Build Coastguard Worker     // Time moves back. The delta over the negative interval from 2000 to 1000 is ignored
191*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(8.0, 1000);
192*38e8c45fSAndroid Build Coastguard Worker     double delta = testCounter.updateValue(11.0, 3000);
193*38e8c45fSAndroid Build Coastguard Worker 
194*38e8c45fSAndroid Build Coastguard Worker     // The total accumulated count is:
195*38e8c45fSAndroid Build Coastguard Worker     //  6.0          // For the period 0-2000
196*38e8c45fSAndroid Build Coastguard Worker     //  +(11.0-8.0)  // For the period 1000-3000
197*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(9.0, testCounter.getCount(0));
198*38e8c45fSAndroid Build Coastguard Worker 
199*38e8c45fSAndroid Build Coastguard Worker     //  11.0-8.0
200*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(3.0, delta);
201*38e8c45fSAndroid Build Coastguard Worker }
202*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(MultiStateCounterTest,updateValue_nonmonotonic)203*38e8c45fSAndroid Build Coastguard Worker TEST_F(MultiStateCounterTest, updateValue_nonmonotonic) {
204*38e8c45fSAndroid Build Coastguard Worker     DoubleMultiStateCounter testCounter(2, 0);
205*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(0, 0);
206*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(0, 0);
207*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(6.0, 2000);
208*38e8c45fSAndroid Build Coastguard Worker 
209*38e8c45fSAndroid Build Coastguard Worker     // Value goes down. The negative delta from 6.0 to 4.0 is ignored
210*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(4.0, 3000);
211*38e8c45fSAndroid Build Coastguard Worker 
212*38e8c45fSAndroid Build Coastguard Worker     // Value goes up again. The positive delta from 4.0 to 7.0 is accumulated.
213*38e8c45fSAndroid Build Coastguard Worker     double delta = testCounter.updateValue(7.0, 4000);
214*38e8c45fSAndroid Build Coastguard Worker 
215*38e8c45fSAndroid Build Coastguard Worker     // The total accumulated count is:
216*38e8c45fSAndroid Build Coastguard Worker     //  6.0          // For the period 0-2000
217*38e8c45fSAndroid Build Coastguard Worker     //  +(7.0-4.0)   // For the period 3000-4000
218*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(9.0, testCounter.getCount(0));
219*38e8c45fSAndroid Build Coastguard Worker 
220*38e8c45fSAndroid Build Coastguard Worker     //  7.0-4.0
221*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(3.0, delta);
222*38e8c45fSAndroid Build Coastguard Worker }
223*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(MultiStateCounterTest,incrementValue)224*38e8c45fSAndroid Build Coastguard Worker TEST_F(MultiStateCounterTest, incrementValue) {
225*38e8c45fSAndroid Build Coastguard Worker     DoubleMultiStateCounter testCounter(2, 0);
226*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(0, 0);
227*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(0, 0);
228*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(6.0, 2000);
229*38e8c45fSAndroid Build Coastguard Worker 
230*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(1, 3000);
231*38e8c45fSAndroid Build Coastguard Worker 
232*38e8c45fSAndroid Build Coastguard Worker     testCounter.incrementValue(8.0, 6000);
233*38e8c45fSAndroid Build Coastguard Worker 
234*38e8c45fSAndroid Build Coastguard Worker     // The total accumulated count is:
235*38e8c45fSAndroid Build Coastguard Worker     //  6.0             // For the period 0-2000
236*38e8c45fSAndroid Build Coastguard Worker     //  +(8.0 * 0.25)   // For the period 3000-4000
237*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(8.0, testCounter.getCount(0));
238*38e8c45fSAndroid Build Coastguard Worker 
239*38e8c45fSAndroid Build Coastguard Worker     // 0                // For the period 0-3000
240*38e8c45fSAndroid Build Coastguard Worker     // +(8.0 * 0.75)    // For the period 3000-4000
241*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(6.0, testCounter.getCount(1));
242*38e8c45fSAndroid Build Coastguard Worker }
243*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(MultiStateCounterTest,addValue)244*38e8c45fSAndroid Build Coastguard Worker TEST_F(MultiStateCounterTest, addValue) {
245*38e8c45fSAndroid Build Coastguard Worker     DoubleMultiStateCounter testCounter(1, 0);
246*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(0, 0);
247*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(0, 0);
248*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(6.0, 2000);
249*38e8c45fSAndroid Build Coastguard Worker 
250*38e8c45fSAndroid Build Coastguard Worker     testCounter.addValue(8.0);
251*38e8c45fSAndroid Build Coastguard Worker 
252*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(14.0, testCounter.getCount(0));
253*38e8c45fSAndroid Build Coastguard Worker 
254*38e8c45fSAndroid Build Coastguard Worker     testCounter.setEnabled(false, 3000);
255*38e8c45fSAndroid Build Coastguard Worker     testCounter.addValue(888.0);
256*38e8c45fSAndroid Build Coastguard Worker 
257*38e8c45fSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(14.0, testCounter.getCount(0));
258*38e8c45fSAndroid Build Coastguard Worker }
259*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(MultiStateCounterTest,toString)260*38e8c45fSAndroid Build Coastguard Worker TEST_F(MultiStateCounterTest, toString) {
261*38e8c45fSAndroid Build Coastguard Worker     DoubleMultiStateCounter testCounter(2, 0);
262*38e8c45fSAndroid Build Coastguard Worker 
263*38e8c45fSAndroid Build Coastguard Worker     EXPECT_STREQ("[0: 0.000000, 1: 0.000000] currentState: none", testCounter.toString().c_str());
264*38e8c45fSAndroid Build Coastguard Worker 
265*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(0, 0);
266*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(1, 0);
267*38e8c45fSAndroid Build Coastguard Worker     testCounter.setState(1, 2000);
268*38e8c45fSAndroid Build Coastguard Worker     EXPECT_STREQ("[0: 0.000000, 1: 0.000000 timeInStateSinceUpdate: 2000]"
269*38e8c45fSAndroid Build Coastguard Worker                  " updated: 0 currentState: 1 stateChanged: 2000",
270*38e8c45fSAndroid Build Coastguard Worker                  testCounter.toString().c_str());
271*38e8c45fSAndroid Build Coastguard Worker 
272*38e8c45fSAndroid Build Coastguard Worker     testCounter.updateValue(3.14, 3000);
273*38e8c45fSAndroid Build Coastguard Worker 
274*38e8c45fSAndroid Build Coastguard Worker     EXPECT_STREQ("[0: 0.000000, 1: 3.140000] updated: 3000 currentState: 1",
275*38e8c45fSAndroid Build Coastguard Worker                  testCounter.toString().c_str());
276*38e8c45fSAndroid Build Coastguard Worker }
277*38e8c45fSAndroid Build Coastguard Worker 
278*38e8c45fSAndroid Build Coastguard Worker } // namespace battery
279*38e8c45fSAndroid Build Coastguard Worker } // namespace android
280