159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka/*
259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka * Copyright (C) 2017 The Android Open Source Project
359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka *
459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka * Licensed under the Apache License, Version 2.0 (the "License");
559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka * you may not use this file except in compliance with the License.
659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka * You may obtain a copy of the License at
759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka *
859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka *      http://www.apache.org/licenses/LICENSE-2.0
959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka *
1059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka * Unless required by applicable law or agreed to in writing, software
1159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka * distributed under the License is distributed on an "AS IS" BASIS,
1259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka * See the License for the specific language governing permissions and
1459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka * limitations under the License.
1559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka */
1659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
1759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankapackage com.android.internal.os;
1859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
1959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankaimport static android.os.BatteryStats.STATS_SINCE_CHARGED;
2059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
2159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankaimport static com.android.internal.os.BatteryStatsImpl.LongSamplingCounterArray;
2259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankaimport static com.android.internal.os.BatteryStatsImpl.TimeBase;
2359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
2459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankaimport static org.junit.Assert.assertTrue;
2559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankaimport static org.mockito.Mockito.verify;
2659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankaimport static org.mockito.Mockito.verifyNoMoreInteractions;
2759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankaimport static org.mockito.Mockito.verifyZeroInteractions;
2859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankaimport static org.mockito.Mockito.when;
2959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
3059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankaimport android.os.Parcel;
3159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankaimport android.support.test.filters.SmallTest;
3259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankaimport android.support.test.runner.AndroidJUnit4;
3359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
3459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankaimport org.junit.Before;
3559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankaimport org.junit.Test;
3659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankaimport org.junit.runner.RunWith;
3759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankaimport org.mockito.Mock;
3859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankaimport org.mockito.Mockito;
3959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankaimport org.mockito.MockitoAnnotations;
4059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
4159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankaimport java.util.Arrays;
4259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
4359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka/**
4459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka * Test class for {@link BatteryStatsImpl.LongSamplingCounterArray}.
4559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka *
4659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka * To run the tests, use
4759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka *
4859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka * runtest -c com.android.internal.os.LongSamplingCounterArrayTest frameworks-core
4959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka *
5059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka * or the following steps:
5159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka *
5259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka * Build: m FrameworksCoreTests
5359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka * Install: adb install -r \
5459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka *     ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
5559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka * Run: adb shell am instrument -e class com.android.internal.os.LongSamplingCounterArrayTest -w \
5659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka *     com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner
5759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka */
5859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka@SmallTest
5959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka@RunWith(AndroidJUnit4.class)
6059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shankapublic class LongSamplingCounterArrayTest {
6159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
6259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    private static final long[] COUNTS = {1111, 2222, 3333, 4444};
6359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    private static final long[] LOADED_COUNTS = {5555, 6666, 7777, 8888};
6459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    private static final long[] PLUGGED_COUNTS = {9999, 11111, 22222, 33333};
6559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    private static final long[] UNPLUGGED_COUNTS = {44444, 55555, 66666, 77777};
6659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    private static final long[] ZEROES = {0, 0, 0, 0};
6759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
6859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    @Mock private TimeBase mTimeBase;
6959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    private LongSamplingCounterArray mCounterArray;
7059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
7159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    @Before
7259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    public void setUp() {
7359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        MockitoAnnotations.initMocks(this);
7459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        mCounterArray = new LongSamplingCounterArray(mTimeBase);
7559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        Mockito.reset(mTimeBase);
7659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    }
7759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
7859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    @Test
7959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    public void testReadWriteParcel() {
8059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        final Parcel parcel = Parcel.obtain();
8159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        initializeCounterArrayWithDefaultValues();
8259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        LongSamplingCounterArray.writeToParcel(parcel, mCounterArray);
8359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        parcel.setDataPosition(0);
8459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
8559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        // Now clear counterArray and verify values are read from parcel correctly.
8659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        updateCounts(null, null, null, null);
8759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        mCounterArray = LongSamplingCounterArray.readFromParcel(parcel, mTimeBase);
8859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(COUNTS, mCounterArray.mCounts, "Unexpected counts");
8959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(LOADED_COUNTS, mCounterArray.mLoadedCounts, "Unexpected loadedCounts");
9059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(COUNTS, mCounterArray.mPluggedCounts, "Unexpected pluggedCounts");
9159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(UNPLUGGED_COUNTS, mCounterArray.mUnpluggedCounts,
9259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka                "Unexpected unpluggedCounts");
9359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        parcel.recycle();
9459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    }
9559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
9659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    @Test
9759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    public void testReadWriteSummaryParcel() {
9859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        final Parcel parcel = Parcel.obtain();
9959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        initializeCounterArrayWithDefaultValues();
10059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        LongSamplingCounterArray.writeSummaryToParcelLocked(parcel, mCounterArray);
10159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        parcel.setDataPosition(0);
10259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
10359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        // Now clear counterArray and verify values are read from parcel correctly.
10459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        updateCounts(null, null, null, null);
10559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        mCounterArray = LongSamplingCounterArray.readSummaryFromParcelLocked(parcel, mTimeBase);
10659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(COUNTS, mCounterArray.mCounts, "Unexpected counts");
10759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(COUNTS, mCounterArray.mLoadedCounts, "Unexpected loadedCounts");
10859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(COUNTS, mCounterArray.mPluggedCounts, "Unexpected pluggedCounts");
10959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(COUNTS, mCounterArray.mUnpluggedCounts, "Unexpected unpluggedCounts");
11059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        parcel.recycle();
11159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    }
11259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
11359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    @Test
11459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    public void testOnTimeStarted() {
11559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        initializeCounterArrayWithDefaultValues();
11659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        mCounterArray.onTimeStarted(0, 0, 0);
11759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(PLUGGED_COUNTS, mCounterArray.mCounts, "Unexpected counts");
11859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(LOADED_COUNTS, mCounterArray.mLoadedCounts, "Unexpected loadedCounts");
11959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(PLUGGED_COUNTS, mCounterArray.mPluggedCounts, "Unexpected pluggedCounts");
12059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(PLUGGED_COUNTS, mCounterArray.mUnpluggedCounts,
12159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka                "Unexpected unpluggedCounts");
12259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    }
12359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
12459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    @Test
12559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    public void testOnTimeStopped() {
12659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        initializeCounterArrayWithDefaultValues();
12759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        mCounterArray.onTimeStopped(0, 0, 0);
12859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(COUNTS, mCounterArray.mCounts, "Unexpected counts");
12959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(LOADED_COUNTS, mCounterArray.mLoadedCounts, "Unexpected loadedCounts");
13059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(COUNTS, mCounterArray.mPluggedCounts, "Unexpected pluggedCounts");
13159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(UNPLUGGED_COUNTS, mCounterArray.mUnpluggedCounts,
13259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka                "Unexpected unpluggedCounts");
13359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    }
13459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
13559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    @Test
13659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    public void testGetCountsLocked() {
13759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        initializeCounterArrayWithDefaultValues();
13859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
13959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        when(mTimeBase.isRunning()).thenReturn(false);
14059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        long[] actualVal = mCounterArray.getCountsLocked(STATS_SINCE_CHARGED);
14159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        long[] expectedVal = PLUGGED_COUNTS;
14259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(expectedVal, actualVal, "Unexpected values");
14359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
14459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        when(mTimeBase.isRunning()).thenReturn(true);
14559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        actualVal = mCounterArray.getCountsLocked(STATS_SINCE_CHARGED);
14659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        expectedVal = COUNTS;
14759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(expectedVal, actualVal, "Unexpected values");
14859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    }
14959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
15059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    @Test
15159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    public void testAddCountLocked() {
15259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        final long[] deltas = {123, 234, 345, 456};
15359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        mCounterArray.addCountLocked(deltas);
15459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(deltas, mCounterArray.mCounts, "Unexpected counts");
15559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(null, mCounterArray.mLoadedCounts, "Unexpected loadedCounts");
15659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(null, mCounterArray.mPluggedCounts, "Unexpected pluggedCounts");
15759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(null, mCounterArray.mUnpluggedCounts, "Unexpected unpluggedCounts");
15859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
15959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        initializeCounterArrayWithDefaultValues();
16059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        final long[] newCounts = new long[deltas.length];
16159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        for (int i = 0; i < deltas.length; ++i) {
16259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka            newCounts[i] = COUNTS[i] + deltas[i];
16359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        }
16459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        mCounterArray.addCountLocked(deltas);
16559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(newCounts, mCounterArray.mCounts, "Unexpected counts");
16659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(LOADED_COUNTS, mCounterArray.mLoadedCounts, "Unexpected loadedCounts");
16759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(PLUGGED_COUNTS, mCounterArray.mPluggedCounts, "Unexpected pluggedCounts");
16859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(UNPLUGGED_COUNTS, mCounterArray.mUnpluggedCounts,
16959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka                "Unexpected unpluggedCounts");
17059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    }
17159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
17259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    @Test
17359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    public void testReset() {
17459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        initializeCounterArrayWithDefaultValues();
17559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        // Test with detachIfReset=false
17659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        mCounterArray.reset(false /* detachIfReset */);
17759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(ZEROES, mCounterArray.mCounts, "Unexpected counts");
17859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(ZEROES, mCounterArray.mLoadedCounts, "Unexpected loadedCounts");
17959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(ZEROES, mCounterArray.mPluggedCounts, "Unexpected pluggedCounts");
18059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(ZEROES, mCounterArray.mUnpluggedCounts, "Unexpected unpluggedCounts");
18159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        verifyZeroInteractions(mTimeBase);
18259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
18359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        initializeCounterArrayWithDefaultValues();
18459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        // Test with detachIfReset=true
18559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        mCounterArray.reset(true /* detachIfReset */);
18659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(ZEROES, mCounterArray.mCounts, "Unexpected counts");
18759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(ZEROES, mCounterArray.mLoadedCounts, "Unexpected loadedCounts");
18859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(ZEROES, mCounterArray.mPluggedCounts, "Unexpected pluggedCounts");
18959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertArrayEquals(ZEROES, mCounterArray.mUnpluggedCounts, "Unexpected unpluggedCounts");
19059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        verify(mTimeBase).remove(mCounterArray);
19159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        verifyNoMoreInteractions(mTimeBase);
19259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    }
19359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
19459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    @Test
19559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    public void testDetach() {
19659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        mCounterArray.detach();
19759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        verify(mTimeBase).remove(mCounterArray);
19859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        verifyNoMoreInteractions(mTimeBase);
19959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    }
20059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
20159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    private void initializeCounterArrayWithDefaultValues() {
20259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        updateCounts(COUNTS, LOADED_COUNTS, PLUGGED_COUNTS, UNPLUGGED_COUNTS);
20359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    }
20459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
20559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    private void assertArrayEquals(long[] expected, long[] actual, String msg) {
20659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        assertTrue(msg + ", expected: " + Arrays.toString(expected)
20759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka                + ", actual: " + Arrays.toString(actual), Arrays.equals(expected, actual));
20859f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    }
20959f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka
21059f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    private void updateCounts(long[] counts, long[] loadedCounts,
21159f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka            long[] pluggedCounts, long[] unpluggedCounts) {
21259f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        mCounterArray.mCounts = counts;
21359f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        mCounterArray.mLoadedCounts = loadedCounts;
21459f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        mCounterArray.mPluggedCounts = pluggedCounts;
21559f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka        mCounterArray.mUnpluggedCounts = unpluggedCounts;
21659f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka    }
21759f5c00b41b742eefcee450365bb522b7c0e8cc6Sudheer Shanka}
218