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