Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9c9026ee authored by Kirill Timofeev's avatar Kirill Timofeev Committed by Android (Google) Code Review
Browse files

Merge "Improve 'PerfettoTraceTest#testMessageQueue' test." into main

parents 34d778ef e966b002
Loading
Loading
Loading
Loading
+76 −28
Original line number Original line Diff line number Diff line
@@ -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<>();
@@ -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);
@@ -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();
@@ -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();
                }
                }
@@ -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++;
@@ -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) {