Add settings for KernelCpuThreadReader
Settings include:
- Number of buckets
- UID predicate for which threads to collect data for
Test: to test UID selection: `atest KernelCpuThreadReaderTest`
Test: to test settings application: `adb shell cmd settings put ...` and
manual inspection of `pull-source`
Bug: 123562450
Change-Id: I9d97dfc1c120fcf1b04dadb6ce24863afeff053c
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index bd7f852..d670208 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -293,6 +293,7 @@
Settings.Global.INTENT_FIREWALL_UPDATE_METADATA_URL,
Settings.Global.JOB_SCHEDULER_CONSTANTS,
Settings.Global.KEEP_PROFILE_IN_BACKGROUND,
+ Settings.Global.KERNEL_CPU_THREAD_READER,
Settings.Global.LANG_ID_UPDATE_CONTENT_URL,
Settings.Global.LANG_ID_UPDATE_METADATA_URL,
Settings.Global.LAST_ACTIVE_USER_ID,
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderEndToEndTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderEndToEndTest.java
index c03d1f3..3ddd8aa 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderEndToEndTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderEndToEndTest.java
@@ -20,6 +20,7 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import android.os.Process;
import android.os.SystemClock;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
@@ -121,7 +122,8 @@
workFinishedLatch.await();
// Get thread data from KernelCpuThreadReader
- final KernelCpuThreadReader kernelCpuThreadReader = KernelCpuThreadReader.create();
+ final KernelCpuThreadReader kernelCpuThreadReader =
+ KernelCpuThreadReader.create(8, uid -> uid == Process.myUid());
assertNotNull(kernelCpuThreadReader);
final ProcessCpuUsage currentProcessCpuUsage =
kernelCpuThreadReader.getCurrentProcessCpuUsage();
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java
index 0c56b8a..b9744f5 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java
@@ -18,8 +18,10 @@
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import static org.testng.Assert.assertThrows;
import android.content.Context;
import android.os.FileUtils;
@@ -99,6 +101,8 @@
THREAD_NAMES, THREAD_CPU_FREQUENCIES, THREAD_CPU_TIMES);
final KernelCpuThreadReader kernelCpuThreadReader = new KernelCpuThreadReader(
+ 8,
+ uid -> 1000 <= uid && uid < 2000,
mProcDirectory.toPath(),
mProcDirectory.toPath().resolve("self/task/" + THREAD_IDS[0] + "/time_in_state"),
processUtils);
@@ -138,11 +142,13 @@
new int[][]{{uid}});
}
final KernelCpuThreadReader kernelCpuThreadReader = new KernelCpuThreadReader(
+ 8,
+ uidPredicate,
mProcDirectory.toPath(),
mProcDirectory.toPath().resolve(uids[0] + "/task/" + uids[0] + "/time_in_state"),
processUtils);
ArrayList<KernelCpuThreadReader.ProcessCpuUsage> processCpuUsageByUids =
- kernelCpuThreadReader.getProcessCpuUsageByUids(uidPredicate);
+ kernelCpuThreadReader.getProcessCpuUsageByUids();
processCpuUsageByUids.sort(Comparator.comparing(usage -> usage.processId));
assertEquals(expectedUids.length, processCpuUsageByUids.size());
@@ -350,4 +356,106 @@
4, KernelCpuThreadReader.FrequencyBucketCreator.getBigFrequenciesStartIndex(
new long[]{1, 2, 3, 4}));
}
+
+ @Test
+ public void testUidPredicate_singleRange() {
+ KernelCpuThreadReaderSettingsObserver.UidPredicate uidPredicate =
+ KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString("1000-1999");
+ assertTrue(uidPredicate.test(1000));
+ assertTrue(uidPredicate.test(1050));
+ assertTrue(uidPredicate.test(1999));
+ assertFalse(uidPredicate.test(2000));
+ assertFalse(uidPredicate.test(0));
+ assertFalse(uidPredicate.test(10000));
+ assertFalse(uidPredicate.test(-100));
+ }
+
+ @Test
+ public void testUidPredicate_singleUid() {
+ KernelCpuThreadReaderSettingsObserver.UidPredicate uidPredicate =
+ KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString("1234-1234");
+ assertTrue(uidPredicate.test(1234));
+ assertFalse(uidPredicate.test(1235));
+ assertFalse(uidPredicate.test(1232));
+ assertFalse(uidPredicate.test(0));
+ assertFalse(uidPredicate.test(-1234));
+ }
+
+ @Test
+ public void testUidPredicate_uidAndRange() {
+ KernelCpuThreadReaderSettingsObserver.UidPredicate uidPredicate =
+ KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString(
+ "1000-1000;1050-1060");
+ assertTrue(uidPredicate.test(1000));
+ assertTrue(uidPredicate.test(1050));
+ assertTrue(uidPredicate.test(1054));
+ assertTrue(uidPredicate.test(1060));
+ assertFalse(uidPredicate.test(1040));
+ assertFalse(uidPredicate.test(1001));
+ assertFalse(uidPredicate.test(0));
+ assertFalse(uidPredicate.test(-1000));
+ }
+
+ @Test
+ public void testUidPredicate_multiple() {
+ KernelCpuThreadReaderSettingsObserver.UidPredicate uidPredicate =
+ KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString(
+ "1000-1000;1050-1060;1001-1001;2000-3000");
+ assertTrue(uidPredicate.test(1000));
+ assertTrue(uidPredicate.test(1001));
+ assertTrue(uidPredicate.test(1050));
+ assertTrue(uidPredicate.test(1054));
+ assertTrue(uidPredicate.test(1060));
+ assertTrue(uidPredicate.test(1001));
+ assertTrue(uidPredicate.test(2000));
+ assertTrue(uidPredicate.test(2444));
+ assertTrue(uidPredicate.test(3000));
+ assertFalse(uidPredicate.test(0));
+ assertFalse(uidPredicate.test(1040));
+ assertFalse(uidPredicate.test(3001));
+ assertFalse(uidPredicate.test(1999));
+ }
+
+ @Test
+ public void testUidPredicate_emptyRangeString() {
+ assertThrows(
+ NumberFormatException.class,
+ () -> KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString(""));
+ }
+
+ @Test
+ public void testUidPredicate_singleNumber() {
+ assertThrows(
+ NumberFormatException.class,
+ () -> KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString("1000"));
+ }
+
+ @Test
+ public void testUidPredicate_lettersInRange() {
+ assertThrows(
+ NumberFormatException.class,
+ () -> KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString(
+ "0-0;1-1;a;3-3"));
+ }
+
+ @Test
+ public void testUidPredicate_onlyLetters() {
+ assertThrows(
+ NumberFormatException.class,
+ () -> KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString("abc"));
+ }
+
+ @Test
+ public void testUidPredicate_backwardsRange() {
+ assertThrows(
+ IllegalArgumentException.class,
+ () -> KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString("20-10"));
+ }
+
+ @Test
+ public void testUidPredicate_comma() {
+ assertThrows(
+ NumberFormatException.class,
+ () -> KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString("1-1,2-2,3-3"));
+ }
}