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