1 /* 2 * Copyright (C) 2020 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.internal.os; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import androidx.test.filters.SmallTest; 22 import androidx.test.runner.AndroidJUnit4; 23 24 import org.junit.Test; 25 import org.junit.runner.RunWith; 26 27 import java.io.IOException; 28 29 @SmallTest 30 @RunWith(AndroidJUnit4.class) 31 public class SystemServerCpuThreadReaderTest { 32 33 @Test testReadDelta()34 public void testReadDelta() throws IOException { 35 int pid = 42; 36 37 MockCpuTimeInStateReader mockReader = new MockCpuTimeInStateReader(4); 38 // Units are nanoseconds 39 mockReader.setAggregatedTaskCpuFreqTimes(new String[] { 40 "0:1000000000 2000000000 3000000000:4000000000", 41 "1:100000000 200000000 300000000:400000000", 42 }); 43 44 SystemServerCpuThreadReader reader = new SystemServerCpuThreadReader(pid, mockReader); 45 reader.setBinderThreadNativeTids(new int[] {1, 3}); 46 47 // The first invocation of readDelta populates the "last" snapshot 48 SystemServerCpuThreadReader.SystemServiceCpuThreadTimes systemServiceCpuThreadTimes = 49 reader.readDelta(); 50 51 assertThat(systemServiceCpuThreadTimes.threadCpuTimesUs) 52 .isEqualTo(new long[] {1100000, 2200000, 3300000, 4400000}); 53 assertThat(systemServiceCpuThreadTimes.binderThreadCpuTimesUs) 54 .isEqualTo(new long[] {100000, 200000, 300000, 400000}); 55 56 mockReader.setAggregatedTaskCpuFreqTimes(new String[] { 57 "0:1010000000 2020000000 3030000000:4040000000", 58 "1:101000000 202000000 303000000:404000000", 59 }); 60 61 // The second invocation gets the actual delta 62 systemServiceCpuThreadTimes = reader.readDelta(); 63 64 assertThat(systemServiceCpuThreadTimes.threadCpuTimesUs) 65 .isEqualTo(new long[] {11000, 22000, 33000, 44000}); 66 assertThat(systemServiceCpuThreadTimes.binderThreadCpuTimesUs) 67 .isEqualTo(new long[] {1000, 2000, 3000, 4000}); 68 } 69 70 public static class MockCpuTimeInStateReader implements 71 KernelSingleProcessCpuThreadReader.CpuTimeInStateReader { 72 private final int mCpuFrequencyCount; 73 private String[] mAggregatedTaskCpuFreqTimes; 74 MockCpuTimeInStateReader(int frequencyCount)75 MockCpuTimeInStateReader(int frequencyCount) { 76 mCpuFrequencyCount = frequencyCount; 77 } 78 79 @Override getCpuFrequencyCount()80 public int getCpuFrequencyCount() { 81 return mCpuFrequencyCount; 82 } 83 84 @Override startTrackingProcessCpuTimes(int tgid)85 public boolean startTrackingProcessCpuTimes(int tgid) { 86 return true; 87 } 88 startAggregatingTaskCpuTimes(int pid, int aggregationKey)89 public boolean startAggregatingTaskCpuTimes(int pid, int aggregationKey) { 90 return true; 91 } 92 setAggregatedTaskCpuFreqTimes(String[] mAggregatedTaskCpuFreqTimes)93 public void setAggregatedTaskCpuFreqTimes(String[] mAggregatedTaskCpuFreqTimes) { 94 this.mAggregatedTaskCpuFreqTimes = mAggregatedTaskCpuFreqTimes; 95 } 96 getAggregatedTaskCpuFreqTimes(int pid)97 public String[] getAggregatedTaskCpuFreqTimes(int pid) { 98 return mAggregatedTaskCpuFreqTimes; 99 } 100 } 101 } 102