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.server.power.stats; 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 com.android.internal.os.KernelSingleProcessCpuThreadReader; 25 26 import org.junit.Test; 27 import org.junit.runner.RunWith; 28 29 import java.io.IOException; 30 31 @SmallTest 32 @RunWith(AndroidJUnit4.class) 33 public class SystemServerCpuThreadReaderTest { 34 35 @Test testReadDelta()36 public void testReadDelta() throws IOException { 37 int pid = 42; 38 39 MockCpuTimeInStateReader mockReader = new MockCpuTimeInStateReader(4); 40 // Units are nanoseconds 41 mockReader.setAggregatedTaskCpuFreqTimes(new String[] { 42 "0:1000000000 2000000000 3000000000:4000000000", 43 "1:100000000 200000000 300000000:400000000", 44 }); 45 46 SystemServerCpuThreadReader reader = new SystemServerCpuThreadReader(pid, mockReader); 47 reader.setBinderThreadNativeTids(new int[] {1, 3}); 48 49 // The first invocation of readDelta populates the "last" snapshot 50 SystemServerCpuThreadReader.SystemServiceCpuThreadTimes systemServiceCpuThreadTimes = 51 reader.readDelta(); 52 53 assertThat(systemServiceCpuThreadTimes.threadCpuTimesUs) 54 .isEqualTo(new long[] {1100000, 2200000, 3300000, 4400000}); 55 assertThat(systemServiceCpuThreadTimes.binderThreadCpuTimesUs) 56 .isEqualTo(new long[] {100000, 200000, 300000, 400000}); 57 58 mockReader.setAggregatedTaskCpuFreqTimes(new String[] { 59 "0:1010000000 2020000000 3030000000:4040000000", 60 "1:101000000 202000000 303000000:404000000", 61 }); 62 63 // The second invocation gets the actual delta 64 systemServiceCpuThreadTimes = reader.readDelta(); 65 66 assertThat(systemServiceCpuThreadTimes.threadCpuTimesUs) 67 .isEqualTo(new long[] {11000, 22000, 33000, 44000}); 68 assertThat(systemServiceCpuThreadTimes.binderThreadCpuTimesUs) 69 .isEqualTo(new long[] {1000, 2000, 3000, 4000}); 70 } 71 72 public static class MockCpuTimeInStateReader implements 73 KernelSingleProcessCpuThreadReader.CpuTimeInStateReader { 74 private final int mCpuFrequencyCount; 75 private String[] mAggregatedTaskCpuFreqTimes; 76 MockCpuTimeInStateReader(int frequencyCount)77 MockCpuTimeInStateReader(int frequencyCount) { 78 mCpuFrequencyCount = frequencyCount; 79 } 80 81 @Override getCpuFrequencyCount()82 public int getCpuFrequencyCount() { 83 return mCpuFrequencyCount; 84 } 85 86 @Override startTrackingProcessCpuTimes(int tgid)87 public boolean startTrackingProcessCpuTimes(int tgid) { 88 return true; 89 } 90 startAggregatingTaskCpuTimes(int pid, int aggregationKey)91 public boolean startAggregatingTaskCpuTimes(int pid, int aggregationKey) { 92 return true; 93 } 94 setAggregatedTaskCpuFreqTimes(String[] mAggregatedTaskCpuFreqTimes)95 public void setAggregatedTaskCpuFreqTimes(String[] mAggregatedTaskCpuFreqTimes) { 96 this.mAggregatedTaskCpuFreqTimes = mAggregatedTaskCpuFreqTimes; 97 } 98 getAggregatedTaskCpuFreqTimes(int pid)99 public String[] getAggregatedTaskCpuFreqTimes(int pid) { 100 return mAggregatedTaskCpuFreqTimes; 101 } 102 } 103 } 104