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