1b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka/*
2b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka * Copyright (C) 2017 The Android Open Source Project
3b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka *
4b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka * Licensed under the Apache License, Version 2.0 (the "License");
5b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka * you may not use this file except in compliance with the License.
6b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka * You may obtain a copy of the License at
7b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka *
8b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka *      http://www.apache.org/licenses/LICENSE-2.0
9b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka *
10b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka * Unless required by applicable law or agreed to in writing, software
11b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka * distributed under the License is distributed on an "AS IS" BASIS,
12b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka * See the License for the specific language governing permissions and
14b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka * limitations under the License.
15b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka */
16b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
17b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shankapackage com.android.internal.os;
18b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
19b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shankaimport static org.junit.Assert.assertArrayEquals;
20b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shankaimport static org.junit.Assert.assertEquals;
21b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shankaimport static org.junit.Assert.assertFalse;
22b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shankaimport static org.junit.Assert.assertTrue;
23b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
24b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shankaimport android.support.test.filters.SmallTest;
25b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shankaimport android.support.test.runner.AndroidJUnit4;
26b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shankaimport android.util.SparseArray;
27b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
28b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shankaimport com.android.internal.os.KernelSingleUidTimeReader.Injector;
29b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
30b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shankaimport org.junit.Before;
31b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shankaimport org.junit.Test;
32b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shankaimport org.junit.runner.RunWith;
33b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
34b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shankaimport java.io.IOException;
35b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shankaimport java.nio.ByteBuffer;
36b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shankaimport java.nio.ByteOrder;
37b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shankaimport java.util.Arrays;
38b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
39b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka@SmallTest
40b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka@RunWith(AndroidJUnit4.class)
41b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shankapublic class KernelSingleUidTimeReaderTest {
42b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    private final static int TEST_UID = 2222;
43b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    private final static int TEST_FREQ_COUNT = 5;
44b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
45b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    private KernelSingleUidTimeReader mReader;
46b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    private TestInjector mInjector;
47b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
48b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    @Before
49b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    public void setUp() {
50b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        mInjector = new TestInjector();
51b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        mReader = new KernelSingleUidTimeReader(TEST_FREQ_COUNT, mInjector);
52b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    }
53b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
54b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    @Test
55b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    public void readDelta() {
56b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        final SparseArray<long[]> allLastCpuTimes = mReader.getLastUidCpuTimeMs();
57b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        long[] latestCpuTimes = new long[] {120, 130, 140, 150, 160};
58b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        mInjector.setData(latestCpuTimes);
59b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        long[] deltaCpuTimes = mReader.readDeltaMs(TEST_UID);
60b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(latestCpuTimes, deltaCpuTimes);
61b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(latestCpuTimes, allLastCpuTimes.get(TEST_UID));
62b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
63b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        long[] expectedDeltaTimes = new long[] {200, 340, 1230, 490, 4890};
64b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        for (int i = 0; i < latestCpuTimes.length; ++i) {
65b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            latestCpuTimes[i] += expectedDeltaTimes[i];
66b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        }
67b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        mInjector.setData(latestCpuTimes);
68b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        deltaCpuTimes = mReader.readDeltaMs(TEST_UID);
69b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(expectedDeltaTimes, deltaCpuTimes);
70b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(latestCpuTimes, allLastCpuTimes.get(TEST_UID));
71b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
72b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        // delta should be null if cpu times haven't changed
73b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        deltaCpuTimes = mReader.readDeltaMs(TEST_UID);
74b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(null, deltaCpuTimes);
75b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(latestCpuTimes, allLastCpuTimes.get(TEST_UID));
76b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
77b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        // Malformed data (-ve)
78b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        long[] malformedLatestTimes = new long[latestCpuTimes.length];
79b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        for (int i = 0; i < latestCpuTimes.length; ++i) {
80b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            if (i == 1) {
81b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka                malformedLatestTimes[i] = -4;
82b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            } else {
83b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka                malformedLatestTimes[i] = latestCpuTimes[i] + i * 42;
84b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            }
85b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        }
86b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        mInjector.setData(malformedLatestTimes);
87b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        deltaCpuTimes = mReader.readDeltaMs(TEST_UID);
88b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(null, deltaCpuTimes);
89b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(latestCpuTimes, allLastCpuTimes.get(TEST_UID));
90b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
91b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        // Malformed data (decreased)
92b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        malformedLatestTimes = new long[latestCpuTimes.length];
93b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        for (int i = 0; i < latestCpuTimes.length; ++i) {
94b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            if (i == 1) {
95b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka                malformedLatestTimes[i] = latestCpuTimes[i] - 4;
96b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            } else {
97b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka                malformedLatestTimes[i] = latestCpuTimes[i] + i * 42;
98b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            }
99b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        }
100b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        mInjector.setData(malformedLatestTimes);
101b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        deltaCpuTimes = mReader.readDeltaMs(TEST_UID);
102b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(null, deltaCpuTimes);
103b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(latestCpuTimes, allLastCpuTimes.get(TEST_UID));
104b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    }
105b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
106b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    @Test
107b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    public void readDelta_fileNotAvailable() {
108b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        mInjector.letReadDataThrowException(true);
109b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
110b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        for (int i = 0; i < KernelSingleUidTimeReader.TOTAL_READ_ERROR_COUNT; ++i) {
111b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            assertTrue(mReader.singleUidCpuTimesAvailable());
112b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            mReader.readDeltaMs(TEST_UID);
113b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        }
114b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertFalse(mReader.singleUidCpuTimesAvailable());
115b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    }
116b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
117b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    @Test
118a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka    public void readDelta_incorrectCount() {
119a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka        assertTrue(mReader.singleUidCpuTimesAvailable());
120a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka
121a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka        long[] cpuTimes = new long[TEST_FREQ_COUNT - 1];
122a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka        for (int i = 0; i < cpuTimes.length; ++i) {
123a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka            cpuTimes[i] = 111 + i;
124a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka        }
125a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka        mInjector.setData(cpuTimes);
126a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka        assertCpuTimesEqual(null, mReader.readDeltaMs(TEST_UID));
127a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka        assertFalse(mReader.singleUidCpuTimesAvailable());
128a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka
129a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka        // Reset
130a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka        mReader.setSingleUidCpuTimesAvailable(true);
131a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka
132a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka        cpuTimes = new long[TEST_FREQ_COUNT + 1];
133a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka        for (int i = 0; i < cpuTimes.length; ++i) {
134a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka            cpuTimes[i] = 222 + i;
135a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka        }
136a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka        mInjector.setData(cpuTimes);
137a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka        assertCpuTimesEqual(null, mReader.readDeltaMs(TEST_UID));
138a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka        assertFalse(mReader.singleUidCpuTimesAvailable());
139a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka    }
140a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka
141a5bca091d8d6c5e4868835d9a641164084561b20Sudheer Shanka    @Test
142b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    public void testComputeDelta() {
143b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        // proc file not available
144b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        mReader.setSingleUidCpuTimesAvailable(false);
145b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        long[] latestCpuTimes = new long[] {12, 13, 14, 15, 16};
146b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        long[] deltaCpuTimes = mReader.computeDelta(TEST_UID, latestCpuTimes);
147b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(null, deltaCpuTimes);
148b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
149b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        // cpu times have changed
150b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        mReader.setSingleUidCpuTimesAvailable(true);
151b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        SparseArray<long[]> allLastCpuTimes = mReader.getLastUidCpuTimeMs();
152b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        long[] lastCpuTimes = new long[] {12, 13, 14, 15, 16};
153b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        allLastCpuTimes.put(TEST_UID, lastCpuTimes);
154b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        long[] expectedDeltaTimes = new long[] {123, 324, 43, 989, 80};
155b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        for (int i = 0; i < latestCpuTimes.length; ++i) {
156b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            latestCpuTimes[i] = lastCpuTimes[i] + expectedDeltaTimes[i];
157b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        }
158b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        deltaCpuTimes = mReader.computeDelta(TEST_UID, latestCpuTimes);
159b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(expectedDeltaTimes, deltaCpuTimes);
160b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(latestCpuTimes, allLastCpuTimes.get(TEST_UID));
161b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
162b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        // no change in cpu times
163b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        deltaCpuTimes = mReader.computeDelta(TEST_UID, latestCpuTimes);
164b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(null, deltaCpuTimes);
165b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(latestCpuTimes, allLastCpuTimes.get(TEST_UID));
166b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
167b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        // Malformed cpu times (-ve)
168b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        long[] malformedLatestTimes = new long[latestCpuTimes.length];
169b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        for (int i = 0; i < latestCpuTimes.length; ++i) {
170b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            if (i == 1) {
171b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka                malformedLatestTimes[i] = -4;
172b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            } else {
173b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka                malformedLatestTimes[i] = latestCpuTimes[i] + i * 42;
174b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            }
175b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        }
176b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        deltaCpuTimes = mReader.computeDelta(TEST_UID, malformedLatestTimes);
177b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(null, deltaCpuTimes);
178b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(latestCpuTimes, allLastCpuTimes.get(TEST_UID));
179b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
180b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        // Malformed cpu times (decreased)
181b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        for (int i = 0; i < latestCpuTimes.length; ++i) {
182b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            if (i == 1) {
183b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka                malformedLatestTimes[i] = latestCpuTimes[i] - 4;
184b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            } else {
185b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka                malformedLatestTimes[i] = latestCpuTimes[i] + i * 42;
186b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            }
187b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        }
188b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        deltaCpuTimes = mReader.computeDelta(TEST_UID, malformedLatestTimes);
189b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(null, deltaCpuTimes);
190b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(latestCpuTimes, allLastCpuTimes.get(TEST_UID));
191b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    }
192b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
193b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    @Test
194b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    public void testGetDelta() {
195b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        // No last cpu times
196b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        long[] lastCpuTimes = null;
197b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        long[] latestCpuTimes = new long[] {12, 13, 14, 15, 16};
198b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        long[] deltaCpuTimes = mReader.getDeltaLocked(lastCpuTimes, latestCpuTimes);
199b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(latestCpuTimes, deltaCpuTimes);
200b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
201b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        // Latest cpu times are -ve
202b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        lastCpuTimes = new long[] {12, 13, 14, 15, 16};
203b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        latestCpuTimes = new long[] {15, -10, 19, 21, 23};
204b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        deltaCpuTimes = mReader.getDeltaLocked(lastCpuTimes, latestCpuTimes);
205b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(null, deltaCpuTimes);
206b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
207b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        // Latest cpu times are less than last cpu times
208b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        lastCpuTimes = new long[] {12, 13, 14, 15, 16};
209b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        latestCpuTimes = new long[] {15, 11, 21, 34, 171};
210b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        deltaCpuTimes = mReader.getDeltaLocked(lastCpuTimes, latestCpuTimes);
211b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(null, deltaCpuTimes);
212b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
213b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        lastCpuTimes = new long[] {12, 13, 14, 15, 16};
214b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        latestCpuTimes = new long[] {112, 213, 314, 415, 516};
215b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        deltaCpuTimes = mReader.getDeltaLocked(lastCpuTimes, latestCpuTimes);
216b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertCpuTimesEqual(new long[] {100, 200, 300, 400, 500}, deltaCpuTimes);
217b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    }
218b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
219b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    @Test
220b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    public void testRemoveUid() {
221b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        final SparseArray<long[]> lastUidCpuTimes = mReader.getLastUidCpuTimeMs();
222b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        lastUidCpuTimes.put(12, new long[] {});
223b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        lastUidCpuTimes.put(16, new long[] {});
224b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
225b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        mReader.removeUid(12);
226b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertFalse("Removal failed, cpuTimes=" + lastUidCpuTimes,
227b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka                lastUidCpuTimes.indexOfKey(12) >= 0);
228b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        mReader.removeUid(16);
229b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertFalse("Removal failed, cpuTimes=" + lastUidCpuTimes,
230b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka                lastUidCpuTimes.indexOfKey(16) >= 0);
231b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    }
232b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
233b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    @Test
234b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    public void testRemoveUidsRange() {
235b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        final SparseArray<long[]> lastUidCpuTimes = mReader.getLastUidCpuTimeMs();
236b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        final int startUid = 12;
237b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        final int endUid = 24;
238b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
239b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        for (int i = startUid; i <= endUid; ++i) {
240b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            lastUidCpuTimes.put(startUid, new long[] {});
241b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        }
242b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        mReader.removeUidsInRange(startUid, endUid);
243b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertEquals("There shouldn't be any items left, cpuTimes=" + lastUidCpuTimes,
244b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka                0, lastUidCpuTimes.size());
245b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
246b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        for (int i = startUid; i <= endUid; ++i) {
247b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            lastUidCpuTimes.put(startUid, new long[] {});
248b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        }
249b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        mReader.removeUidsInRange(startUid - 1, endUid);
250b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertEquals("There shouldn't be any items left, cpuTimes=" + lastUidCpuTimes,
251b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka                0, lastUidCpuTimes.size());
252b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
253b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        for (int i = startUid; i <= endUid; ++i) {
254b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            lastUidCpuTimes.put(startUid, new long[] {});
255b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        }
256b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        mReader.removeUidsInRange(startUid, endUid + 1);
257b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertEquals("There shouldn't be any items left, cpuTimes=" + lastUidCpuTimes,
258b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka                0, lastUidCpuTimes.size());
259b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
260b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        for (int i = startUid; i <= endUid; ++i) {
261b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            lastUidCpuTimes.put(startUid, new long[] {});
262b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        }
263b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        mReader.removeUidsInRange(startUid - 1, endUid + 1);
264b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertEquals("There shouldn't be any items left, cpuTimes=" + lastUidCpuTimes,
265b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka                0, lastUidCpuTimes.size());
266b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    }
267b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
268b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    private void assertCpuTimesEqual(long[] expected, long[] actual) {
269b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        assertArrayEquals("Expected=" + Arrays.toString(expected)
270b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka                + ", Actual=" + Arrays.toString(actual), expected, actual);
271b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    }
272b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
273b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    class TestInjector extends Injector {
274b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        private byte[] mData;
275b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        private boolean mThrowExcpetion;
276b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
277b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        @Override
278b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        public byte[] readData(String procFile) throws IOException {
279b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            if (mThrowExcpetion) {
280b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka                throw new IOException("In the test");
281b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            } else {
282b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka                return mData;
283b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            }
284b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        }
285b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
286b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        public void setData(long[] cpuTimes) {
287b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            final ByteBuffer buffer = ByteBuffer.allocate(cpuTimes.length * Long.BYTES);
288b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            buffer.order(ByteOrder.nativeOrder());
289b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            for (long time : cpuTimes) {
290b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka                buffer.putLong(time / 10);
291b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            }
292b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            mData = buffer.array();
293b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        }
294b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
295b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        public void letReadDataThrowException(boolean throwException) {
296b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            mThrowExcpetion = throwException;
297b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        }
298b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    }
299b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka}
300