Loading core/tests/bugreports/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ android_test { "android.test.base", ], static_libs: [ "android.tracing.flags-aconfig-java", "androidx.test.rules", "androidx.test.uiautomator_uiautomator", "truth", Loading core/tests/bugreports/src/com/android/os/bugreports/tests/BugreportManagerTest.java +29 −23 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; Loading Loading @@ -102,17 +103,11 @@ public class BugreportManagerTest { // associated with the bugreport). private static final String INTENT_BUGREPORT_FINISHED = "com.android.internal.intent.action.BUGREPORT_FINISHED"; private static final String EXTRA_BUGREPORT = "android.intent.extra.BUGREPORT"; private static final String EXTRA_SCREENSHOT = "android.intent.extra.SCREENSHOT"; private static final Path[] UI_TRACES_PREDUMPED = { private ArrayList<Path> mUiTracesPreDumped = new ArrayList<>(Arrays.asList( Paths.get("/data/misc/perfetto-traces/bugreport/systrace.pftrace"), Paths.get("/data/misc/wmtrace/ime_trace_clients.winscope"), Paths.get("/data/misc/wmtrace/ime_trace_managerservice.winscope"), Paths.get("/data/misc/wmtrace/ime_trace_service.winscope"), Paths.get("/data/misc/wmtrace/wm_trace.winscope"), Paths.get("/data/misc/wmtrace/wm_log.winscope"), }; Paths.get("/data/misc/wmtrace/wm_trace.winscope") )); private Handler mHandler; private Executor mExecutor; Loading @@ -124,6 +119,17 @@ public class BugreportManagerTest { @Before public void setup() throws Exception { if (!android.tracing.Flags.perfettoIme()) { mUiTracesPreDumped.add(Paths.get("/data/misc/wmtrace/ime_trace_clients.winscope")); mUiTracesPreDumped.add( Paths.get("/data/misc/wmtrace/ime_trace_managerservice.winscope")); mUiTracesPreDumped.add(Paths.get("/data/misc/wmtrace/ime_trace_service.winscope")); } if (!android.tracing.Flags.perfettoProtologTracing()) { mUiTracesPreDumped.add(Paths.get("/data/misc/wmtrace/wm_log.winscope")); } mHandler = createHandler(); mExecutor = (runnable) -> { if (mHandler != null) { Loading Loading @@ -206,7 +212,7 @@ public class BugreportManagerTest { mBrm.preDumpUiData(); waitTillDumpstateExitedOrTimeout(); List<File> expectedPreDumpedTraceFiles = copyFiles(UI_TRACES_PREDUMPED); List<File> expectedPreDumpedTraceFiles = copyFiles(mUiTracesPreDumped); BugreportCallbackImpl callback = new BugreportCallbackImpl(); mBrm.startBugreport(mBugreportFd, null, fullWithUsePreDumpFlag(), mExecutor, Loading @@ -220,9 +226,9 @@ public class BugreportManagerTest { assertThat(mBugreportFile.length()).isGreaterThan(0L); assertFdsAreClosed(mBugreportFd); assertThatBugreportContainsFiles(UI_TRACES_PREDUMPED); assertThatBugreportContainsFiles(mUiTracesPreDumped); List<File> actualPreDumpedTraceFiles = extractFilesFromBugreport(UI_TRACES_PREDUMPED); List<File> actualPreDumpedTraceFiles = extractFilesFromBugreport(mUiTracesPreDumped); assertThatAllFileContentsAreEqual(actualPreDumpedTraceFiles, expectedPreDumpedTraceFiles); } Loading @@ -235,9 +241,9 @@ public class BugreportManagerTest { // In some corner cases, data dumped as part of the full bugreport could be the same as the // pre-dumped data and this test would fail. Hence, here we create fake/artificial // pre-dumped data that we know it won't match with the full bugreport data. createFakeTraceFiles(UI_TRACES_PREDUMPED); createFakeTraceFiles(mUiTracesPreDumped); List<File> preDumpedTraceFiles = copyFiles(UI_TRACES_PREDUMPED); List<File> preDumpedTraceFiles = copyFiles(mUiTracesPreDumped); BugreportCallbackImpl callback = new BugreportCallbackImpl(); mBrm.startBugreport(mBugreportFd, null, full(), mExecutor, Loading @@ -251,9 +257,9 @@ public class BugreportManagerTest { assertThat(mBugreportFile.length()).isGreaterThan(0L); assertFdsAreClosed(mBugreportFd); assertThatBugreportContainsFiles(UI_TRACES_PREDUMPED); assertThatBugreportContainsFiles(mUiTracesPreDumped); List<File> actualTraceFiles = extractFilesFromBugreport(UI_TRACES_PREDUMPED); List<File> actualTraceFiles = extractFilesFromBugreport(mUiTracesPreDumped); assertThatAllFileContentsAreDifferent(preDumpedTraceFiles, actualTraceFiles); } Loading @@ -270,7 +276,7 @@ public class BugreportManagerTest { // 1. Pre-dump data // 2. Start bugreport + "use pre-dump" flag (USE AND REMOVE THE PRE-DUMP FROM DISK) // 3. Start bugreport + "use pre-dump" flag (NO PRE-DUMP AVAILABLE ON DISK) removeFilesIfNeeded(UI_TRACES_PREDUMPED); removeFilesIfNeeded(mUiTracesPreDumped); // Start bugreport with "use predump" flag. Because the pre-dumped data is not available // the flag will be ignored and data will be dumped as in normal flow. Loading @@ -286,7 +292,7 @@ public class BugreportManagerTest { assertThat(mBugreportFile.length()).isGreaterThan(0L); assertFdsAreClosed(mBugreportFd); assertThatBugreportContainsFiles(UI_TRACES_PREDUMPED); assertThatBugreportContainsFiles(mUiTracesPreDumped); } @Test Loading Loading @@ -555,7 +561,7 @@ public class BugreportManagerTest { ); } private void assertThatBugreportContainsFiles(Path[] paths) private void assertThatBugreportContainsFiles(List<Path> paths) throws IOException { List<Path> entries = listZipArchiveEntries(mBugreportFile); for (Path pathInDevice : paths) { Loading @@ -564,7 +570,7 @@ public class BugreportManagerTest { } } private List<File> extractFilesFromBugreport(Path[] paths) throws Exception { private List<File> extractFilesFromBugreport(List<Path> paths) throws Exception { List<File> files = new ArrayList<File>(); for (Path pathInDevice : paths) { Path pathInArchive = Paths.get("FS" + pathInDevice.toString()); Loading Loading @@ -614,7 +620,7 @@ public class BugreportManagerTest { return extractedFile; } private static void createFakeTraceFiles(Path[] paths) throws Exception { private static void createFakeTraceFiles(List<Path> paths) throws Exception { File src = createTempFile("fake", ".data"); Files.write("fake data".getBytes(StandardCharsets.UTF_8), src); Loading @@ -631,7 +637,7 @@ public class BugreportManagerTest { ); } private static List<File> copyFiles(Path[] paths) throws Exception { private static List<File> copyFiles(List<Path> paths) throws Exception { ArrayList<File> files = new ArrayList<File>(); for (Path src : paths) { File dst = createTempFile(src.getFileName().toString(), ".copy"); Loading @@ -643,7 +649,7 @@ public class BugreportManagerTest { return files; } private static void removeFilesIfNeeded(Path[] paths) throws Exception { private static void removeFilesIfNeeded(List<Path> paths) throws Exception { for (Path path : paths) { InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand( "rm -f " + path.toString() Loading Loading
core/tests/bugreports/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ android_test { "android.test.base", ], static_libs: [ "android.tracing.flags-aconfig-java", "androidx.test.rules", "androidx.test.uiautomator_uiautomator", "truth", Loading
core/tests/bugreports/src/com/android/os/bugreports/tests/BugreportManagerTest.java +29 −23 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; Loading Loading @@ -102,17 +103,11 @@ public class BugreportManagerTest { // associated with the bugreport). private static final String INTENT_BUGREPORT_FINISHED = "com.android.internal.intent.action.BUGREPORT_FINISHED"; private static final String EXTRA_BUGREPORT = "android.intent.extra.BUGREPORT"; private static final String EXTRA_SCREENSHOT = "android.intent.extra.SCREENSHOT"; private static final Path[] UI_TRACES_PREDUMPED = { private ArrayList<Path> mUiTracesPreDumped = new ArrayList<>(Arrays.asList( Paths.get("/data/misc/perfetto-traces/bugreport/systrace.pftrace"), Paths.get("/data/misc/wmtrace/ime_trace_clients.winscope"), Paths.get("/data/misc/wmtrace/ime_trace_managerservice.winscope"), Paths.get("/data/misc/wmtrace/ime_trace_service.winscope"), Paths.get("/data/misc/wmtrace/wm_trace.winscope"), Paths.get("/data/misc/wmtrace/wm_log.winscope"), }; Paths.get("/data/misc/wmtrace/wm_trace.winscope") )); private Handler mHandler; private Executor mExecutor; Loading @@ -124,6 +119,17 @@ public class BugreportManagerTest { @Before public void setup() throws Exception { if (!android.tracing.Flags.perfettoIme()) { mUiTracesPreDumped.add(Paths.get("/data/misc/wmtrace/ime_trace_clients.winscope")); mUiTracesPreDumped.add( Paths.get("/data/misc/wmtrace/ime_trace_managerservice.winscope")); mUiTracesPreDumped.add(Paths.get("/data/misc/wmtrace/ime_trace_service.winscope")); } if (!android.tracing.Flags.perfettoProtologTracing()) { mUiTracesPreDumped.add(Paths.get("/data/misc/wmtrace/wm_log.winscope")); } mHandler = createHandler(); mExecutor = (runnable) -> { if (mHandler != null) { Loading Loading @@ -206,7 +212,7 @@ public class BugreportManagerTest { mBrm.preDumpUiData(); waitTillDumpstateExitedOrTimeout(); List<File> expectedPreDumpedTraceFiles = copyFiles(UI_TRACES_PREDUMPED); List<File> expectedPreDumpedTraceFiles = copyFiles(mUiTracesPreDumped); BugreportCallbackImpl callback = new BugreportCallbackImpl(); mBrm.startBugreport(mBugreportFd, null, fullWithUsePreDumpFlag(), mExecutor, Loading @@ -220,9 +226,9 @@ public class BugreportManagerTest { assertThat(mBugreportFile.length()).isGreaterThan(0L); assertFdsAreClosed(mBugreportFd); assertThatBugreportContainsFiles(UI_TRACES_PREDUMPED); assertThatBugreportContainsFiles(mUiTracesPreDumped); List<File> actualPreDumpedTraceFiles = extractFilesFromBugreport(UI_TRACES_PREDUMPED); List<File> actualPreDumpedTraceFiles = extractFilesFromBugreport(mUiTracesPreDumped); assertThatAllFileContentsAreEqual(actualPreDumpedTraceFiles, expectedPreDumpedTraceFiles); } Loading @@ -235,9 +241,9 @@ public class BugreportManagerTest { // In some corner cases, data dumped as part of the full bugreport could be the same as the // pre-dumped data and this test would fail. Hence, here we create fake/artificial // pre-dumped data that we know it won't match with the full bugreport data. createFakeTraceFiles(UI_TRACES_PREDUMPED); createFakeTraceFiles(mUiTracesPreDumped); List<File> preDumpedTraceFiles = copyFiles(UI_TRACES_PREDUMPED); List<File> preDumpedTraceFiles = copyFiles(mUiTracesPreDumped); BugreportCallbackImpl callback = new BugreportCallbackImpl(); mBrm.startBugreport(mBugreportFd, null, full(), mExecutor, Loading @@ -251,9 +257,9 @@ public class BugreportManagerTest { assertThat(mBugreportFile.length()).isGreaterThan(0L); assertFdsAreClosed(mBugreportFd); assertThatBugreportContainsFiles(UI_TRACES_PREDUMPED); assertThatBugreportContainsFiles(mUiTracesPreDumped); List<File> actualTraceFiles = extractFilesFromBugreport(UI_TRACES_PREDUMPED); List<File> actualTraceFiles = extractFilesFromBugreport(mUiTracesPreDumped); assertThatAllFileContentsAreDifferent(preDumpedTraceFiles, actualTraceFiles); } Loading @@ -270,7 +276,7 @@ public class BugreportManagerTest { // 1. Pre-dump data // 2. Start bugreport + "use pre-dump" flag (USE AND REMOVE THE PRE-DUMP FROM DISK) // 3. Start bugreport + "use pre-dump" flag (NO PRE-DUMP AVAILABLE ON DISK) removeFilesIfNeeded(UI_TRACES_PREDUMPED); removeFilesIfNeeded(mUiTracesPreDumped); // Start bugreport with "use predump" flag. Because the pre-dumped data is not available // the flag will be ignored and data will be dumped as in normal flow. Loading @@ -286,7 +292,7 @@ public class BugreportManagerTest { assertThat(mBugreportFile.length()).isGreaterThan(0L); assertFdsAreClosed(mBugreportFd); assertThatBugreportContainsFiles(UI_TRACES_PREDUMPED); assertThatBugreportContainsFiles(mUiTracesPreDumped); } @Test Loading Loading @@ -555,7 +561,7 @@ public class BugreportManagerTest { ); } private void assertThatBugreportContainsFiles(Path[] paths) private void assertThatBugreportContainsFiles(List<Path> paths) throws IOException { List<Path> entries = listZipArchiveEntries(mBugreportFile); for (Path pathInDevice : paths) { Loading @@ -564,7 +570,7 @@ public class BugreportManagerTest { } } private List<File> extractFilesFromBugreport(Path[] paths) throws Exception { private List<File> extractFilesFromBugreport(List<Path> paths) throws Exception { List<File> files = new ArrayList<File>(); for (Path pathInDevice : paths) { Path pathInArchive = Paths.get("FS" + pathInDevice.toString()); Loading Loading @@ -614,7 +620,7 @@ public class BugreportManagerTest { return extractedFile; } private static void createFakeTraceFiles(Path[] paths) throws Exception { private static void createFakeTraceFiles(List<Path> paths) throws Exception { File src = createTempFile("fake", ".data"); Files.write("fake data".getBytes(StandardCharsets.UTF_8), src); Loading @@ -631,7 +637,7 @@ public class BugreportManagerTest { ); } private static List<File> copyFiles(Path[] paths) throws Exception { private static List<File> copyFiles(List<Path> paths) throws Exception { ArrayList<File> files = new ArrayList<File>(); for (Path src : paths) { File dst = createTempFile(src.getFileName().toString(), ".copy"); Loading @@ -643,7 +649,7 @@ public class BugreportManagerTest { return files; } private static void removeFilesIfNeeded(Path[] paths) throws Exception { private static void removeFilesIfNeeded(List<Path> paths) throws Exception { for (Path path : paths) { InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand( "rm -f " + path.toString() Loading