Loading core/tests/coretests/Android.bp +4 −0 Original line number Diff line number Diff line Loading @@ -99,6 +99,7 @@ android_test { "mockito-target-extended-minus-junit4", "mockito-target-minus-junit4", "mockwebserver", "perfetto_trace_android_track_event_extension_java_protos", "perfetto_trace_java_protos", "platform-compat-test-rules", "platform-parametric-runner-lib", Loading @@ -119,6 +120,7 @@ android_test { "ext", "framework", "framework-res", "libprotobuf-java-lite", "org.apache.http.legacy.stubs", ], jni_libs: [ Loading Loading @@ -256,6 +258,7 @@ android_ravenwood_test { "ext", "framework", "framework-res", "libprotobuf-java-lite", "org.apache.http.legacy.stubs", ], static_libs: [ Loading @@ -269,6 +272,7 @@ android_ravenwood_test { "core-test-rules", // for libcore.dalvik.system.CloseGuardSupport "flag-junit", "flag-junit", "perfetto_trace_android_track_event_extension_java_protos", "perfetto_trace_java_protos", "platform-compat-test-rules", "platform-test-annotations", Loading core/tests/coretests/src/android/os/PerfettoTraceTest.java +54 −65 Original line number Diff line number Diff line Loading @@ -32,12 +32,16 @@ import android.util.ArraySet; import androidx.test.InstrumentationRegistry; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.protobuf.ExtensionRegistryLite; import org.junit.Before; import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import perfetto.protos.AndroidTrackEventOuterClass; import perfetto.protos.AndroidTrackEventOuterClass.AndroidMessageQueue; import perfetto.protos.AndroidTrackEventOuterClass.AndroidTrackEvent; import perfetto.protos.ChromeLatencyInfoOuterClass.ChromeLatencyInfo; import perfetto.protos.ChromeLatencyInfoOuterClass.ChromeLatencyInfo.ComponentInfo; import perfetto.protos.DataSourceConfigOuterClass.DataSourceConfig; Loading @@ -58,6 +62,7 @@ import perfetto.protos.TrackEventOuterClass.EventCategory; import perfetto.protos.TrackEventOuterClass.EventName; import perfetto.protos.TrackEventOuterClass.TrackEvent; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.CountDownLatch; Loading @@ -83,6 +88,7 @@ public class PerfettoTraceTest { private static final Category FOO_CATEGORY = new Category(FOO); private static final int MESSAGE = 1234567; private static final int MESSAGE_DELAYED = 7654321; private static final int MESSAGE_COUNT = 3; private final Set<String> mCategoryNames = new ArraySet<>(); Loading Loading @@ -612,12 +618,9 @@ public class PerfettoTraceTest { @Test @RequiresFlagsEnabled(android.os.Flags.FLAG_PERFETTO_SDK_TRACING_V2) @Ignore("b/303199244") public void testMessageQueue() throws Exception { TraceConfig traceConfig = getTraceConfig("mq"); PerfettoTrace.MQ_CATEGORY.register(); final HandlerThread thread = new HandlerThread("test"); final HandlerThread thread = new HandlerThread("mq_test_thread"); thread.start(); final Handler handler = thread.getThreadHandler(); final CountDownLatch latch = new CountDownLatch(1); Loading @@ -626,85 +629,71 @@ public class PerfettoTraceTest { getTraceConfig("mq").toByteArray()); handler.sendEmptyMessage(MESSAGE); handler.sendEmptyMessageDelayed(MESSAGE, 10); handler.sendEmptyMessageDelayed(MESSAGE_DELAYED, 10); handler.sendEmptyMessage(MESSAGE); handler.postDelayed(() -> { latch.countDown(); }, 10); assertThat(latch.await(100, TimeUnit.MILLISECONDS)).isTrue(); byte[] traceBytes = session.close(); ExtensionRegistryLite registry = ExtensionRegistryLite.newInstance(); AndroidTrackEventOuterClass.registerAllExtensions(registry); Trace trace = Trace.parseFrom(traceBytes); Trace trace = Trace.parseFrom(session.close(), registry); boolean hasTrackEvent = false; int instantCount = 0; int counterCount = 0; int beginCount = 0; int endCount = 0; Set<Long> flowIds = new ArraySet<>(); for (TracePacket packet: trace.getPacketList()) { TrackEvent event; if (packet.hasTrackEvent()) { hasTrackEvent = true; event = packet.getTrackEvent(); } else { continue; } Long counterTrackUuid = null; ArrayList<AndroidMessageQueue> messageQueueEvents = new ArrayList<>(); List<DebugAnnotation> annotations = event.getDebugAnnotationsList(); switch (event.getType()) { case TrackEvent.Type.TYPE_INSTANT: if (annotations.get(2).getIntValue() == MESSAGE) { instantCount++; assertThat(annotations.get(0).getStringValue()).isEqualTo("test"); assertThat(event.getFlowIdsCount()).isEqualTo(1); flowIds.addAll(event.getFlowIdsList()); } break; case TrackEvent.Type.TYPE_COUNTER: // When running this test, there is a thread with name 'Time-limited test', started by // junit that also generates mq events (from Looper). // We explicitly assert only events generated by this test. for (TracePacket packet : trace.getPacketList()) { if (packet.hasTrackDescriptor()) { TrackDescriptor trackDescriptor = packet.getTrackDescriptor(); if (trackDescriptor.getName().equals("mq_test_thread") && trackDescriptor.hasCounter()) { counterTrackUuid = trackDescriptor.getUuid(); } } else if (packet.hasTrackEvent()) { TrackEvent event = packet.getTrackEvent(); if (event.getType() == TrackEvent.Type.TYPE_INSTANT) { if (event.hasExtension(AndroidTrackEvent.messageQueue)) { AndroidMessageQueue mqEvent = event.getExtension(AndroidTrackEvent.messageQueue); messageQueueEvents.add(mqEvent); } } else if (event.getType() == TrackEvent.Type.TYPE_COUNTER) { if (counterTrackUuid != null && event.getTrackUuid() == counterTrackUuid) { counterCount++; break; case TrackEvent.Type.TYPE_SLICE_BEGIN: annotations = event.getDebugAnnotationsList(); if (flowIds.containsAll(event.getTerminatingFlowIdsList())) { beginCount++; assertThat(event.getTerminatingFlowIdsCount()).isEqualTo(1); } break; case TrackEvent.Type.TYPE_SLICE_END: endCount++; break; default: break; } } } collectInternedData(packet); } assertThat(hasTrackEvent).isTrue(); assertThat(mCategoryNames).contains("mq"); assertThat(mCategoryNames).containsExactly("mq"); assertThat(mEventNames).contains("message_queue_send"); assertThat(mEventNames).contains("message_queue_receive"); assertThat(mDebugAnnotationNames).contains("what"); assertThat(mDebugAnnotationNames).contains("delay"); assertThat(instantCount).isEqualTo(MESSAGE_COUNT); assertThat(beginCount).isEqualTo(MESSAGE_COUNT); assertThat(endCount).isAtLeast(MESSAGE_COUNT); assertThat(counterTrackUuid).isNotNull(); assertThat(counterCount).isAtLeast(MESSAGE_COUNT); } assertThat(messageQueueEvents).hasSize(4); private TrackEvent getTrackEvent(Trace trace, int idx) { int curIdx = 0; for (TracePacket packet: trace.getPacketList()) { if (packet.hasTrackEvent()) { if (curIdx++ == idx) { return packet.getTrackEvent(); } } } assertThat(messageQueueEvents.get(0).getMessageCode()).isEqualTo(MESSAGE); assertThat(messageQueueEvents.get(0).getMessageDelayMs()).isEqualTo(0); assertThat(messageQueueEvents.get(0).getReceivingThreadName()).isEqualTo("mq_test_thread"); assertThat(messageQueueEvents.get(1).getMessageCode()).isEqualTo(MESSAGE_DELAYED); assertThat(messageQueueEvents.get(1).getMessageDelayMs()).isEqualTo(10); assertThat(messageQueueEvents.get(1).getReceivingThreadName()).isEqualTo("mq_test_thread"); assertThat(messageQueueEvents.get(2).getMessageCode()).isEqualTo(MESSAGE); assertThat(messageQueueEvents.get(2).getMessageDelayMs()).isEqualTo(0); assertThat(messageQueueEvents.get(2).getReceivingThreadName()).isEqualTo("mq_test_thread"); return null; assertThat(messageQueueEvents.get(3).getMessageCode()).isEqualTo(0); assertThat(messageQueueEvents.get(3).getMessageDelayMs()).isEqualTo(10); assertThat(messageQueueEvents.get(3).getReceivingThreadName()).isEqualTo("mq_test_thread"); } private TraceConfig getTraceConfig(String cat) { Loading Loading
core/tests/coretests/Android.bp +4 −0 Original line number Diff line number Diff line Loading @@ -99,6 +99,7 @@ android_test { "mockito-target-extended-minus-junit4", "mockito-target-minus-junit4", "mockwebserver", "perfetto_trace_android_track_event_extension_java_protos", "perfetto_trace_java_protos", "platform-compat-test-rules", "platform-parametric-runner-lib", Loading @@ -119,6 +120,7 @@ android_test { "ext", "framework", "framework-res", "libprotobuf-java-lite", "org.apache.http.legacy.stubs", ], jni_libs: [ Loading Loading @@ -256,6 +258,7 @@ android_ravenwood_test { "ext", "framework", "framework-res", "libprotobuf-java-lite", "org.apache.http.legacy.stubs", ], static_libs: [ Loading @@ -269,6 +272,7 @@ android_ravenwood_test { "core-test-rules", // for libcore.dalvik.system.CloseGuardSupport "flag-junit", "flag-junit", "perfetto_trace_android_track_event_extension_java_protos", "perfetto_trace_java_protos", "platform-compat-test-rules", "platform-test-annotations", Loading
core/tests/coretests/src/android/os/PerfettoTraceTest.java +54 −65 Original line number Diff line number Diff line Loading @@ -32,12 +32,16 @@ import android.util.ArraySet; import androidx.test.InstrumentationRegistry; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.protobuf.ExtensionRegistryLite; import org.junit.Before; import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import perfetto.protos.AndroidTrackEventOuterClass; import perfetto.protos.AndroidTrackEventOuterClass.AndroidMessageQueue; import perfetto.protos.AndroidTrackEventOuterClass.AndroidTrackEvent; import perfetto.protos.ChromeLatencyInfoOuterClass.ChromeLatencyInfo; import perfetto.protos.ChromeLatencyInfoOuterClass.ChromeLatencyInfo.ComponentInfo; import perfetto.protos.DataSourceConfigOuterClass.DataSourceConfig; Loading @@ -58,6 +62,7 @@ import perfetto.protos.TrackEventOuterClass.EventCategory; import perfetto.protos.TrackEventOuterClass.EventName; import perfetto.protos.TrackEventOuterClass.TrackEvent; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.CountDownLatch; Loading @@ -83,6 +88,7 @@ public class PerfettoTraceTest { private static final Category FOO_CATEGORY = new Category(FOO); private static final int MESSAGE = 1234567; private static final int MESSAGE_DELAYED = 7654321; private static final int MESSAGE_COUNT = 3; private final Set<String> mCategoryNames = new ArraySet<>(); Loading Loading @@ -612,12 +618,9 @@ public class PerfettoTraceTest { @Test @RequiresFlagsEnabled(android.os.Flags.FLAG_PERFETTO_SDK_TRACING_V2) @Ignore("b/303199244") public void testMessageQueue() throws Exception { TraceConfig traceConfig = getTraceConfig("mq"); PerfettoTrace.MQ_CATEGORY.register(); final HandlerThread thread = new HandlerThread("test"); final HandlerThread thread = new HandlerThread("mq_test_thread"); thread.start(); final Handler handler = thread.getThreadHandler(); final CountDownLatch latch = new CountDownLatch(1); Loading @@ -626,85 +629,71 @@ public class PerfettoTraceTest { getTraceConfig("mq").toByteArray()); handler.sendEmptyMessage(MESSAGE); handler.sendEmptyMessageDelayed(MESSAGE, 10); handler.sendEmptyMessageDelayed(MESSAGE_DELAYED, 10); handler.sendEmptyMessage(MESSAGE); handler.postDelayed(() -> { latch.countDown(); }, 10); assertThat(latch.await(100, TimeUnit.MILLISECONDS)).isTrue(); byte[] traceBytes = session.close(); ExtensionRegistryLite registry = ExtensionRegistryLite.newInstance(); AndroidTrackEventOuterClass.registerAllExtensions(registry); Trace trace = Trace.parseFrom(traceBytes); Trace trace = Trace.parseFrom(session.close(), registry); boolean hasTrackEvent = false; int instantCount = 0; int counterCount = 0; int beginCount = 0; int endCount = 0; Set<Long> flowIds = new ArraySet<>(); for (TracePacket packet: trace.getPacketList()) { TrackEvent event; if (packet.hasTrackEvent()) { hasTrackEvent = true; event = packet.getTrackEvent(); } else { continue; } Long counterTrackUuid = null; ArrayList<AndroidMessageQueue> messageQueueEvents = new ArrayList<>(); List<DebugAnnotation> annotations = event.getDebugAnnotationsList(); switch (event.getType()) { case TrackEvent.Type.TYPE_INSTANT: if (annotations.get(2).getIntValue() == MESSAGE) { instantCount++; assertThat(annotations.get(0).getStringValue()).isEqualTo("test"); assertThat(event.getFlowIdsCount()).isEqualTo(1); flowIds.addAll(event.getFlowIdsList()); } break; case TrackEvent.Type.TYPE_COUNTER: // When running this test, there is a thread with name 'Time-limited test', started by // junit that also generates mq events (from Looper). // We explicitly assert only events generated by this test. for (TracePacket packet : trace.getPacketList()) { if (packet.hasTrackDescriptor()) { TrackDescriptor trackDescriptor = packet.getTrackDescriptor(); if (trackDescriptor.getName().equals("mq_test_thread") && trackDescriptor.hasCounter()) { counterTrackUuid = trackDescriptor.getUuid(); } } else if (packet.hasTrackEvent()) { TrackEvent event = packet.getTrackEvent(); if (event.getType() == TrackEvent.Type.TYPE_INSTANT) { if (event.hasExtension(AndroidTrackEvent.messageQueue)) { AndroidMessageQueue mqEvent = event.getExtension(AndroidTrackEvent.messageQueue); messageQueueEvents.add(mqEvent); } } else if (event.getType() == TrackEvent.Type.TYPE_COUNTER) { if (counterTrackUuid != null && event.getTrackUuid() == counterTrackUuid) { counterCount++; break; case TrackEvent.Type.TYPE_SLICE_BEGIN: annotations = event.getDebugAnnotationsList(); if (flowIds.containsAll(event.getTerminatingFlowIdsList())) { beginCount++; assertThat(event.getTerminatingFlowIdsCount()).isEqualTo(1); } break; case TrackEvent.Type.TYPE_SLICE_END: endCount++; break; default: break; } } } collectInternedData(packet); } assertThat(hasTrackEvent).isTrue(); assertThat(mCategoryNames).contains("mq"); assertThat(mCategoryNames).containsExactly("mq"); assertThat(mEventNames).contains("message_queue_send"); assertThat(mEventNames).contains("message_queue_receive"); assertThat(mDebugAnnotationNames).contains("what"); assertThat(mDebugAnnotationNames).contains("delay"); assertThat(instantCount).isEqualTo(MESSAGE_COUNT); assertThat(beginCount).isEqualTo(MESSAGE_COUNT); assertThat(endCount).isAtLeast(MESSAGE_COUNT); assertThat(counterTrackUuid).isNotNull(); assertThat(counterCount).isAtLeast(MESSAGE_COUNT); } assertThat(messageQueueEvents).hasSize(4); private TrackEvent getTrackEvent(Trace trace, int idx) { int curIdx = 0; for (TracePacket packet: trace.getPacketList()) { if (packet.hasTrackEvent()) { if (curIdx++ == idx) { return packet.getTrackEvent(); } } } assertThat(messageQueueEvents.get(0).getMessageCode()).isEqualTo(MESSAGE); assertThat(messageQueueEvents.get(0).getMessageDelayMs()).isEqualTo(0); assertThat(messageQueueEvents.get(0).getReceivingThreadName()).isEqualTo("mq_test_thread"); assertThat(messageQueueEvents.get(1).getMessageCode()).isEqualTo(MESSAGE_DELAYED); assertThat(messageQueueEvents.get(1).getMessageDelayMs()).isEqualTo(10); assertThat(messageQueueEvents.get(1).getReceivingThreadName()).isEqualTo("mq_test_thread"); assertThat(messageQueueEvents.get(2).getMessageCode()).isEqualTo(MESSAGE); assertThat(messageQueueEvents.get(2).getMessageDelayMs()).isEqualTo(0); assertThat(messageQueueEvents.get(2).getReceivingThreadName()).isEqualTo("mq_test_thread"); return null; assertThat(messageQueueEvents.get(3).getMessageCode()).isEqualTo(0); assertThat(messageQueueEvents.get(3).getMessageDelayMs()).isEqualTo(10); assertThat(messageQueueEvents.get(3).getReceivingThreadName()).isEqualTo("mq_test_thread"); } private TraceConfig getTraceConfig(String cat) { Loading