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