1561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma/*
2561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma * Copyright (C) 2018 The Android Open Source Project
3561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma *
4561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma * Licensed under the Apache License, Version 2.0 (the "License");
5561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma * you may not use this file except in compliance with the License.
6561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma * You may obtain a copy of the License at
7561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma *
8561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma *      http://www.apache.org/licenses/LICENSE-2.0
9561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma *
10561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma * Unless required by applicable law or agreed to in writing, software
11561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma * distributed under the License is distributed on an "AS IS" BASIS,
12561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma * See the License for the specific language governing permissions and
14561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma * limitations under the License.
15561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma */
16561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
17561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Mapackage com.android.internal.os;
18561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
19561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Maimport static android.os.BatteryStats.STATS_SINCE_CHARGED;
20561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
21561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Maimport static com.android.internal.os.BatteryStatsImpl.LongSamplingCounter;
22561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Maimport static com.android.internal.os.BatteryStatsImpl.TimeBase;
23561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
24561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Maimport static org.junit.Assert.assertEquals;
25561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Maimport static org.mockito.Mockito.verify;
26561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Maimport static org.mockito.Mockito.verifyNoMoreInteractions;
27561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Maimport static org.mockito.Mockito.verifyZeroInteractions;
28561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Maimport static org.mockito.Mockito.when;
29561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
30561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Maimport android.os.Parcel;
31561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Maimport android.support.test.filters.SmallTest;
32561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Maimport android.support.test.runner.AndroidJUnit4;
33561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
34561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Maimport org.junit.Before;
35561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Maimport org.junit.Test;
36561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Maimport org.junit.runner.RunWith;
37561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Maimport org.mockito.Mock;
38561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Maimport org.mockito.Mockito;
39561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Maimport org.mockito.MockitoAnnotations;
40561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
41561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma/**
42561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma * Test class for {@link LongSamplingCounter}.
43561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma *
44561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma * To run the tests, use
45561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma *
46561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma * bit FrameworksCoreTests:com.android.internal.os.LongSamplingCounterTest
47561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma */
48561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma@SmallTest
49561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma@RunWith(AndroidJUnit4.class)
50561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Mapublic class LongSamplingCounterTest {
51561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
52561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    private static final long COUNT = 1111;
53561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    private static final long CURRENT_COUNT = 5555;
54561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
55561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    @Mock
56561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    private TimeBase mTimeBase;
57561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    private LongSamplingCounter mCounter;
58561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
59561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    @Before
60561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    public void setUp() {
61561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        MockitoAnnotations.initMocks(this);
62561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter = new LongSamplingCounter(mTimeBase);
63561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        Mockito.reset(mTimeBase);
64561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    }
65561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
66561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    @Test
67561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    public void testReadWriteParcel() {
68561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        final Parcel parcel = Parcel.obtain();
69561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        updateCounts(COUNT, CURRENT_COUNT);
70561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.writeToParcel(parcel);
71561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        parcel.setDataPosition(0);
72561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
73561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        // Now clear counterArray and verify values are read from parcel correctly.
74561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        updateCounts(0, 0);
75561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
76561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter = new LongSamplingCounter(mTimeBase, parcel);
77561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(COUNT, mCounter.mCount);
78561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(CURRENT_COUNT, mCounter.mCurrentCount);
79561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        parcel.recycle();
80561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    }
81561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
82561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    @Test
83561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    public void testReadWriteSummaryParcel() {
84561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        final Parcel parcel = Parcel.obtain();
85561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        updateCounts(COUNT, CURRENT_COUNT);
86561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.writeSummaryFromParcelLocked(parcel);
87561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        parcel.setDataPosition(0);
88561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
89561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        // Now clear counterArray and verify values are read from parcel correctly.
90561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        updateCounts(0, 0);
91561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
92561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.readSummaryFromParcelLocked(parcel);
93561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(COUNT, mCounter.mCount);
94561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        parcel.recycle();
95561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    }
96561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
97561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    @Test
98561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    public void testOnTimeStarted() {
99561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        updateCounts(COUNT, CURRENT_COUNT);
100561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.onTimeStarted(0, 0, 0);
101561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(COUNT, mCounter.mCount);
102561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(COUNT, mCounter.mUnpluggedCount);
103561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    }
104561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
105561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    @Test
106561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    public void testOnTimeStopped() {
107561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        updateCounts(COUNT, CURRENT_COUNT);
108561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.onTimeStopped(0, 0, 0);
109561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(COUNT, mCounter.mCount);
110561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    }
111561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
112561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    @Test
113561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    public void testAddCountLocked() {
114561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        updateCounts(0, 0);
115561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(0, mCounter.getCountLocked(0));
116561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        when(mTimeBase.isRunning()).thenReturn(true);
117561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.addCountLocked(111);
118561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(111, mCounter.getCountLocked(STATS_SINCE_CHARGED));
119561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(111, mCounter.mCurrentCount);
120561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.addCountLocked(222);
121561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED));
122561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(333, mCounter.mCurrentCount);
123561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
124561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        when(mTimeBase.isRunning()).thenReturn(false);
125561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.addCountLocked(456);
126561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED));
127561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(789, mCounter.mCurrentCount);
128561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
129561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.addCountLocked(444, true);
130561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(777, mCounter.getCountLocked(STATS_SINCE_CHARGED));
131561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(1233, mCounter.mCurrentCount);
132561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.addCountLocked(567, false);
133561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(777, mCounter.getCountLocked(STATS_SINCE_CHARGED));
134561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(1800, mCounter.mCurrentCount);
135561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    }
136561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
137561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    @Test
138561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    public void testUpdate() {
139561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        updateCounts(0, 0);
140561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(0, mCounter.getCountLocked(0));
141561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        when(mTimeBase.isRunning()).thenReturn(true);
142561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.update(111);
143561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(111, mCounter.getCountLocked(STATS_SINCE_CHARGED));
144561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(111, mCounter.mCurrentCount);
145561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.update(333);
146561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED));
147561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(333, mCounter.mCurrentCount);
148561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
149561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        when(mTimeBase.isRunning()).thenReturn(false);
150561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.update(789);
151561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED));
152561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(789, mCounter.mCurrentCount);
153561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.update(100);
154561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED));
155561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(100, mCounter.mCurrentCount);
156561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
157561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.update(544, true);
158561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(777, mCounter.getCountLocked(STATS_SINCE_CHARGED));
159561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(544, mCounter.mCurrentCount);
160561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.update(1544, false);
161561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(777, mCounter.getCountLocked(STATS_SINCE_CHARGED));
162561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(1544, mCounter.mCurrentCount);
163561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    }
164561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
165561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    @Test
166561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    public void testReset() {
167561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        updateCounts(COUNT, CURRENT_COUNT);
168561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        // Test with detachIfReset=false
169561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.reset(false /* detachIfReset */);
170561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(0, mCounter.mCount);
171561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(CURRENT_COUNT, mCounter.mCurrentCount);
172561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        verifyZeroInteractions(mTimeBase);
173561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
174561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        updateCounts(COUNT, CURRENT_COUNT);
175561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        // Test with detachIfReset=true
176561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.reset(true /* detachIfReset */);
177561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(0, mCounter.mCount);
178561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        assertEquals(CURRENT_COUNT, mCounter.mCurrentCount);
179561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        verify(mTimeBase).remove(mCounter);
180561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        verifyNoMoreInteractions(mTimeBase);
181561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    }
182561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
183561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    @Test
184561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    public void testDetach() {
185561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.detach();
186561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        verify(mTimeBase).remove(mCounter);
187561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        verifyNoMoreInteractions(mTimeBase);
188561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    }
189561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma
190561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    private void updateCounts(long total, long current) {
191561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.mCount = total;
192561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma        mCounter.mCurrentCount = current;
193561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma    }
194561a8d9d604edd609da1ed0ee2340ae68f98e7b8Mike Ma}
195