Loading core/tests/coretests/src/android/os/PerfettoTraceTest.java +76 −28 Original line number Original line Diff line number Diff line Loading @@ -89,7 +89,6 @@ public class PerfettoTraceTest { private static final Category FOO_CATEGORY = new Category(FOO); private static final Category FOO_CATEGORY = new Category(FOO); private static final int MESSAGE = 1234567; private static final int MESSAGE = 1234567; private static final int MESSAGE_DELAYED = 7654321; private static final int MESSAGE_DELAYED = 7654321; private static final int MESSAGE_COUNT = 3; private final Set<String> mCategoryNames = new ArraySet<>(); private final Set<String> mCategoryNames = new ArraySet<>(); private final Set<String> mEventNames = new ArraySet<>(); private final Set<String> mEventNames = new ArraySet<>(); Loading Loading @@ -620,7 +619,9 @@ public class PerfettoTraceTest { @RequiresFlagsEnabled(android.os.Flags.FLAG_PERFETTO_SDK_TRACING_V2) @RequiresFlagsEnabled(android.os.Flags.FLAG_PERFETTO_SDK_TRACING_V2) public void testMessageQueue() throws Exception { public void testMessageQueue() throws Exception { PerfettoTrace.MQ_CATEGORY.register(); PerfettoTrace.MQ_CATEGORY.register(); final HandlerThread thread = new HandlerThread("mq_test_thread"); final String mqReceiverThreadName = "mq_test_thread"; final String mqSenderThreadName = Thread.currentThread().getName(); final HandlerThread thread = new HandlerThread(mqReceiverThreadName); thread.start(); thread.start(); final Handler handler = thread.getThreadHandler(); final Handler handler = thread.getThreadHandler(); final CountDownLatch latch = new CountDownLatch(1); final CountDownLatch latch = new CountDownLatch(1); Loading @@ -628,12 +629,14 @@ public class PerfettoTraceTest { PerfettoTrace.Session session = new PerfettoTrace.Session(true, PerfettoTrace.Session session = new PerfettoTrace.Session(true, getTraceConfig("mq").toByteArray()); getTraceConfig("mq").toByteArray()); final int eventsCount = 4; handler.sendEmptyMessage(MESSAGE); handler.sendEmptyMessage(MESSAGE); handler.sendEmptyMessageDelayed(MESSAGE_DELAYED, 10); handler.sendEmptyMessageDelayed(MESSAGE_DELAYED, 10); handler.sendEmptyMessage(MESSAGE); handler.sendEmptyMessage(MESSAGE); handler.postDelayed(() -> { handler.postDelayed(() -> { latch.countDown(); latch.countDown(); }, 10); }, 20); assertThat(latch.await(100, TimeUnit.MILLISECONDS)).isTrue(); assertThat(latch.await(100, TimeUnit.MILLISECONDS)).isTrue(); ExtensionRegistryLite registry = ExtensionRegistryLite.newInstance(); ExtensionRegistryLite registry = ExtensionRegistryLite.newInstance(); Loading @@ -642,17 +645,18 @@ public class PerfettoTraceTest { Trace trace = Trace.parseFrom(session.close(), registry); Trace trace = Trace.parseFrom(session.close(), registry); int counterCount = 0; int counterCount = 0; int sliceEndEventCount = 0; Long counterTrackUuid = null; Long counterTrackUuid = null; ArrayList<AndroidMessageQueue> messageQueueEvents = new ArrayList<>(); ArrayList<AndroidMessageQueue> messageQueueSendEvents = new ArrayList<>(); ArrayList<Long> messageQueueSendFlowIds = new ArrayList<>(); ArrayList<AndroidMessageQueue> messageQueueReceiveEvents = new ArrayList<>(); ArrayList<Long> messageQueueReceiveTerminateFlowIds = new ArrayList<>(); // 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()) { for (TracePacket packet : trace.getPacketList()) { if (packet.hasTrackDescriptor()) { if (packet.hasTrackDescriptor()) { TrackDescriptor trackDescriptor = packet.getTrackDescriptor(); TrackDescriptor trackDescriptor = packet.getTrackDescriptor(); if (trackDescriptor.getName().equals("mq_test_thread") if (trackDescriptor.getName().equals(mqReceiverThreadName) && trackDescriptor.hasCounter()) { && trackDescriptor.hasCounter()) { counterTrackUuid = trackDescriptor.getUuid(); counterTrackUuid = trackDescriptor.getUuid(); } } Loading @@ -662,8 +666,20 @@ public class PerfettoTraceTest { if (event.hasExtension(AndroidTrackEvent.messageQueue)) { if (event.hasExtension(AndroidTrackEvent.messageQueue)) { AndroidMessageQueue mqEvent = AndroidMessageQueue mqEvent = event.getExtension(AndroidTrackEvent.messageQueue); event.getExtension(AndroidTrackEvent.messageQueue); messageQueueEvents.add(mqEvent); messageQueueSendEvents.add(mqEvent); assertThat(event.getFlowIdsCount()).isEqualTo(1); messageQueueSendFlowIds.add(event.getFlowIds(0)); } } else if (event.getType() == TrackEvent.Type.TYPE_SLICE_BEGIN) { if (event.hasExtension(AndroidTrackEvent.messageQueue)) { AndroidMessageQueue mqEvent = event.getExtension(AndroidTrackEvent.messageQueue); messageQueueReceiveEvents.add(mqEvent); assertThat(event.getTerminatingFlowIdsCount()).isEqualTo(1); messageQueueReceiveTerminateFlowIds.add(event.getTerminatingFlowIds(0)); } } } else if (event.getType() == TrackEvent.Type.TYPE_SLICE_END) { sliceEndEventCount++; } else if (event.getType() == TrackEvent.Type.TYPE_COUNTER) { } else if (event.getType() == TrackEvent.Type.TYPE_COUNTER) { if (counterTrackUuid != null && event.getTrackUuid() == counterTrackUuid) { if (counterTrackUuid != null && event.getTrackUuid() == counterTrackUuid) { counterCount++; counterCount++; Loading @@ -674,26 +690,58 @@ public class PerfettoTraceTest { } } assertThat(mCategoryNames).containsExactly("mq"); assertThat(mCategoryNames).containsExactly("mq"); assertThat(mEventNames).contains("message_queue_send"); assertThat(mEventNames).containsExactly("message_queue_send", "message_queue_receive"); assertThat(counterTrackUuid).isNotNull(); assertThat(counterTrackUuid).isNotNull(); assertThat(counterCount).isAtLeast(MESSAGE_COUNT); assertThat(counterCount).isAtLeast(eventsCount); assertThat(messageQueueEvents).hasSize(4); assertThat(sliceEndEventCount).isEqualTo(eventsCount); assertThat(messageQueueEvents.get(0).getMessageCode()).isEqualTo(MESSAGE); assertThat(messageQueueSendEvents).hasSize(eventsCount); assertThat(messageQueueEvents.get(0).getMessageDelayMs()).isEqualTo(0); assertThat(messageQueueSendFlowIds).hasSize(eventsCount); assertThat(messageQueueEvents.get(0).getReceivingThreadName()).isEqualTo("mq_test_thread"); assertThat(messageQueueReceiveEvents).hasSize(eventsCount); assertThat(messageQueueEvents.get(1).getMessageCode()).isEqualTo(MESSAGE_DELAYED); assertThat(messageQueueReceiveTerminateFlowIds).hasSize(eventsCount); assertThat(messageQueueEvents.get(1).getMessageDelayMs()).isEqualTo(10); assertThat(messageQueueEvents.get(1).getReceivingThreadName()).isEqualTo("mq_test_thread"); assertThat(messageQueueSendEvents.get(0).getMessageCode()).isEqualTo(MESSAGE); assertThat(messageQueueSendEvents.get(0).getMessageDelayMs()).isEqualTo(0); assertThat(messageQueueEvents.get(2).getMessageCode()).isEqualTo(MESSAGE); assertThat(messageQueueSendEvents.get(0).getReceivingThreadName()).isEqualTo( assertThat(messageQueueEvents.get(2).getMessageDelayMs()).isEqualTo(0); mqReceiverThreadName); assertThat(messageQueueEvents.get(2).getReceivingThreadName()).isEqualTo("mq_test_thread"); assertThat(messageQueueSendEvents.get(1).getMessageCode()).isEqualTo(MESSAGE_DELAYED); assertThat(messageQueueEvents.get(3).getMessageCode()).isEqualTo(0); assertThat(messageQueueSendEvents.get(1).getMessageDelayMs()).isEqualTo(10); assertThat(messageQueueEvents.get(3).getMessageDelayMs()).isEqualTo(10); assertThat(messageQueueSendEvents.get(1).getReceivingThreadName()).isEqualTo( assertThat(messageQueueEvents.get(3).getReceivingThreadName()).isEqualTo("mq_test_thread"); mqReceiverThreadName); assertThat(messageQueueSendEvents.get(2).getMessageCode()).isEqualTo(MESSAGE); assertThat(messageQueueSendEvents.get(2).getMessageDelayMs()).isEqualTo(0); assertThat(messageQueueSendEvents.get(2).getReceivingThreadName()).isEqualTo( mqReceiverThreadName); assertThat(messageQueueSendEvents.get(3).getMessageCode()).isEqualTo(0); assertThat(messageQueueSendEvents.get(3).getMessageDelayMs()).isEqualTo(20); assertThat(messageQueueSendEvents.get(3).getReceivingThreadName()).isEqualTo( mqReceiverThreadName); assertThat(messageQueueReceiveEvents.get(0).getSendingThreadName()).isEqualTo( mqSenderThreadName); assertThat(messageQueueReceiveEvents.get(1).getSendingThreadName()).isEqualTo( mqSenderThreadName); assertThat(messageQueueReceiveEvents.get(2).getSendingThreadName()).isEqualTo( mqSenderThreadName); assertThat(messageQueueReceiveEvents.get(3).getSendingThreadName()).isEqualTo( mqSenderThreadName); // The second message was send with a delay, and was received after the third one, // so we assert that the terminating flow Id of the third message is equal to the flow Id // of the second and the terminating flow id of the second is equal to the flow Id of the // third. assertThat(messageQueueSendFlowIds.get(0)).isEqualTo( messageQueueReceiveTerminateFlowIds.get(0)); assertThat(messageQueueSendFlowIds.get(1)).isEqualTo( messageQueueReceiveTerminateFlowIds.get(2)); assertThat(messageQueueSendFlowIds.get(2)).isEqualTo( messageQueueReceiveTerminateFlowIds.get(1)); assertThat(messageQueueSendFlowIds.get(3)).isEqualTo( messageQueueReceiveTerminateFlowIds.get(3)); } } private TraceConfig getTraceConfig(String cat) { private TraceConfig getTraceConfig(String cat) { Loading Loading
core/tests/coretests/src/android/os/PerfettoTraceTest.java +76 −28 Original line number Original line Diff line number Diff line Loading @@ -89,7 +89,6 @@ public class PerfettoTraceTest { private static final Category FOO_CATEGORY = new Category(FOO); private static final Category FOO_CATEGORY = new Category(FOO); private static final int MESSAGE = 1234567; private static final int MESSAGE = 1234567; private static final int MESSAGE_DELAYED = 7654321; private static final int MESSAGE_DELAYED = 7654321; private static final int MESSAGE_COUNT = 3; private final Set<String> mCategoryNames = new ArraySet<>(); private final Set<String> mCategoryNames = new ArraySet<>(); private final Set<String> mEventNames = new ArraySet<>(); private final Set<String> mEventNames = new ArraySet<>(); Loading Loading @@ -620,7 +619,9 @@ public class PerfettoTraceTest { @RequiresFlagsEnabled(android.os.Flags.FLAG_PERFETTO_SDK_TRACING_V2) @RequiresFlagsEnabled(android.os.Flags.FLAG_PERFETTO_SDK_TRACING_V2) public void testMessageQueue() throws Exception { public void testMessageQueue() throws Exception { PerfettoTrace.MQ_CATEGORY.register(); PerfettoTrace.MQ_CATEGORY.register(); final HandlerThread thread = new HandlerThread("mq_test_thread"); final String mqReceiverThreadName = "mq_test_thread"; final String mqSenderThreadName = Thread.currentThread().getName(); final HandlerThread thread = new HandlerThread(mqReceiverThreadName); thread.start(); thread.start(); final Handler handler = thread.getThreadHandler(); final Handler handler = thread.getThreadHandler(); final CountDownLatch latch = new CountDownLatch(1); final CountDownLatch latch = new CountDownLatch(1); Loading @@ -628,12 +629,14 @@ public class PerfettoTraceTest { PerfettoTrace.Session session = new PerfettoTrace.Session(true, PerfettoTrace.Session session = new PerfettoTrace.Session(true, getTraceConfig("mq").toByteArray()); getTraceConfig("mq").toByteArray()); final int eventsCount = 4; handler.sendEmptyMessage(MESSAGE); handler.sendEmptyMessage(MESSAGE); handler.sendEmptyMessageDelayed(MESSAGE_DELAYED, 10); handler.sendEmptyMessageDelayed(MESSAGE_DELAYED, 10); handler.sendEmptyMessage(MESSAGE); handler.sendEmptyMessage(MESSAGE); handler.postDelayed(() -> { handler.postDelayed(() -> { latch.countDown(); latch.countDown(); }, 10); }, 20); assertThat(latch.await(100, TimeUnit.MILLISECONDS)).isTrue(); assertThat(latch.await(100, TimeUnit.MILLISECONDS)).isTrue(); ExtensionRegistryLite registry = ExtensionRegistryLite.newInstance(); ExtensionRegistryLite registry = ExtensionRegistryLite.newInstance(); Loading @@ -642,17 +645,18 @@ public class PerfettoTraceTest { Trace trace = Trace.parseFrom(session.close(), registry); Trace trace = Trace.parseFrom(session.close(), registry); int counterCount = 0; int counterCount = 0; int sliceEndEventCount = 0; Long counterTrackUuid = null; Long counterTrackUuid = null; ArrayList<AndroidMessageQueue> messageQueueEvents = new ArrayList<>(); ArrayList<AndroidMessageQueue> messageQueueSendEvents = new ArrayList<>(); ArrayList<Long> messageQueueSendFlowIds = new ArrayList<>(); ArrayList<AndroidMessageQueue> messageQueueReceiveEvents = new ArrayList<>(); ArrayList<Long> messageQueueReceiveTerminateFlowIds = new ArrayList<>(); // 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()) { for (TracePacket packet : trace.getPacketList()) { if (packet.hasTrackDescriptor()) { if (packet.hasTrackDescriptor()) { TrackDescriptor trackDescriptor = packet.getTrackDescriptor(); TrackDescriptor trackDescriptor = packet.getTrackDescriptor(); if (trackDescriptor.getName().equals("mq_test_thread") if (trackDescriptor.getName().equals(mqReceiverThreadName) && trackDescriptor.hasCounter()) { && trackDescriptor.hasCounter()) { counterTrackUuid = trackDescriptor.getUuid(); counterTrackUuid = trackDescriptor.getUuid(); } } Loading @@ -662,8 +666,20 @@ public class PerfettoTraceTest { if (event.hasExtension(AndroidTrackEvent.messageQueue)) { if (event.hasExtension(AndroidTrackEvent.messageQueue)) { AndroidMessageQueue mqEvent = AndroidMessageQueue mqEvent = event.getExtension(AndroidTrackEvent.messageQueue); event.getExtension(AndroidTrackEvent.messageQueue); messageQueueEvents.add(mqEvent); messageQueueSendEvents.add(mqEvent); assertThat(event.getFlowIdsCount()).isEqualTo(1); messageQueueSendFlowIds.add(event.getFlowIds(0)); } } else if (event.getType() == TrackEvent.Type.TYPE_SLICE_BEGIN) { if (event.hasExtension(AndroidTrackEvent.messageQueue)) { AndroidMessageQueue mqEvent = event.getExtension(AndroidTrackEvent.messageQueue); messageQueueReceiveEvents.add(mqEvent); assertThat(event.getTerminatingFlowIdsCount()).isEqualTo(1); messageQueueReceiveTerminateFlowIds.add(event.getTerminatingFlowIds(0)); } } } else if (event.getType() == TrackEvent.Type.TYPE_SLICE_END) { sliceEndEventCount++; } else if (event.getType() == TrackEvent.Type.TYPE_COUNTER) { } else if (event.getType() == TrackEvent.Type.TYPE_COUNTER) { if (counterTrackUuid != null && event.getTrackUuid() == counterTrackUuid) { if (counterTrackUuid != null && event.getTrackUuid() == counterTrackUuid) { counterCount++; counterCount++; Loading @@ -674,26 +690,58 @@ public class PerfettoTraceTest { } } assertThat(mCategoryNames).containsExactly("mq"); assertThat(mCategoryNames).containsExactly("mq"); assertThat(mEventNames).contains("message_queue_send"); assertThat(mEventNames).containsExactly("message_queue_send", "message_queue_receive"); assertThat(counterTrackUuid).isNotNull(); assertThat(counterTrackUuid).isNotNull(); assertThat(counterCount).isAtLeast(MESSAGE_COUNT); assertThat(counterCount).isAtLeast(eventsCount); assertThat(messageQueueEvents).hasSize(4); assertThat(sliceEndEventCount).isEqualTo(eventsCount); assertThat(messageQueueEvents.get(0).getMessageCode()).isEqualTo(MESSAGE); assertThat(messageQueueSendEvents).hasSize(eventsCount); assertThat(messageQueueEvents.get(0).getMessageDelayMs()).isEqualTo(0); assertThat(messageQueueSendFlowIds).hasSize(eventsCount); assertThat(messageQueueEvents.get(0).getReceivingThreadName()).isEqualTo("mq_test_thread"); assertThat(messageQueueReceiveEvents).hasSize(eventsCount); assertThat(messageQueueEvents.get(1).getMessageCode()).isEqualTo(MESSAGE_DELAYED); assertThat(messageQueueReceiveTerminateFlowIds).hasSize(eventsCount); assertThat(messageQueueEvents.get(1).getMessageDelayMs()).isEqualTo(10); assertThat(messageQueueEvents.get(1).getReceivingThreadName()).isEqualTo("mq_test_thread"); assertThat(messageQueueSendEvents.get(0).getMessageCode()).isEqualTo(MESSAGE); assertThat(messageQueueSendEvents.get(0).getMessageDelayMs()).isEqualTo(0); assertThat(messageQueueEvents.get(2).getMessageCode()).isEqualTo(MESSAGE); assertThat(messageQueueSendEvents.get(0).getReceivingThreadName()).isEqualTo( assertThat(messageQueueEvents.get(2).getMessageDelayMs()).isEqualTo(0); mqReceiverThreadName); assertThat(messageQueueEvents.get(2).getReceivingThreadName()).isEqualTo("mq_test_thread"); assertThat(messageQueueSendEvents.get(1).getMessageCode()).isEqualTo(MESSAGE_DELAYED); assertThat(messageQueueEvents.get(3).getMessageCode()).isEqualTo(0); assertThat(messageQueueSendEvents.get(1).getMessageDelayMs()).isEqualTo(10); assertThat(messageQueueEvents.get(3).getMessageDelayMs()).isEqualTo(10); assertThat(messageQueueSendEvents.get(1).getReceivingThreadName()).isEqualTo( assertThat(messageQueueEvents.get(3).getReceivingThreadName()).isEqualTo("mq_test_thread"); mqReceiverThreadName); assertThat(messageQueueSendEvents.get(2).getMessageCode()).isEqualTo(MESSAGE); assertThat(messageQueueSendEvents.get(2).getMessageDelayMs()).isEqualTo(0); assertThat(messageQueueSendEvents.get(2).getReceivingThreadName()).isEqualTo( mqReceiverThreadName); assertThat(messageQueueSendEvents.get(3).getMessageCode()).isEqualTo(0); assertThat(messageQueueSendEvents.get(3).getMessageDelayMs()).isEqualTo(20); assertThat(messageQueueSendEvents.get(3).getReceivingThreadName()).isEqualTo( mqReceiverThreadName); assertThat(messageQueueReceiveEvents.get(0).getSendingThreadName()).isEqualTo( mqSenderThreadName); assertThat(messageQueueReceiveEvents.get(1).getSendingThreadName()).isEqualTo( mqSenderThreadName); assertThat(messageQueueReceiveEvents.get(2).getSendingThreadName()).isEqualTo( mqSenderThreadName); assertThat(messageQueueReceiveEvents.get(3).getSendingThreadName()).isEqualTo( mqSenderThreadName); // The second message was send with a delay, and was received after the third one, // so we assert that the terminating flow Id of the third message is equal to the flow Id // of the second and the terminating flow id of the second is equal to the flow Id of the // third. assertThat(messageQueueSendFlowIds.get(0)).isEqualTo( messageQueueReceiveTerminateFlowIds.get(0)); assertThat(messageQueueSendFlowIds.get(1)).isEqualTo( messageQueueReceiveTerminateFlowIds.get(2)); assertThat(messageQueueSendFlowIds.get(2)).isEqualTo( messageQueueReceiveTerminateFlowIds.get(1)); assertThat(messageQueueSendFlowIds.get(3)).isEqualTo( messageQueueReceiveTerminateFlowIds.get(3)); } } private TraceConfig getTraceConfig(String cat) { private TraceConfig getTraceConfig(String cat) { Loading