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

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

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

parents 478bb1d6 6672735d
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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",
@@ -119,6 +120,7 @@ android_test {
        "ext",
        "framework",
        "framework-res",
        "libprotobuf-java-lite",
        "org.apache.http.legacy.stubs",
    ],
    jni_libs: [
@@ -256,6 +258,7 @@ android_ravenwood_test {
        "ext",
        "framework",
        "framework-res",
        "libprotobuf-java-lite",
        "org.apache.http.legacy.stubs",
    ],
    static_libs: [
@@ -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",
+54 −65
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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<>();
@@ -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);
@@ -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) {