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

Commit 89ac1232 authored by tanaykhemani's avatar tanaykhemani
Browse files

Add unit tests for routing change metric logging

Bug: 428699927
Test: atest MediaRouterMetricLoggerTest
Flag: EXEMPT Adding unit tests
Change-Id: Ie12f37bbeee43eecc4b44d6421a411e02913a276
parent fc0658ab
Loading
Loading
Loading
Loading
+17 −3
Original line number Diff line number Diff line
@@ -232,7 +232,7 @@ final class MediaRouterMetricLogger {
                        routingSessionInfo.isSystemSession(),
                        routingSessionInfo.getTransferReason(),
                        routingChangeInfo.isSuggested(),
                        SystemClock.elapsedRealtime());
                        getElapsedRealTime());
        mOngoingRoutingChangeCache.put(routingSessionInfo.getOriginalId(), ongoingRoutingChange);
        mRoutingChangeInfoCache.remove(uniqueRequestId);
    }
@@ -248,8 +248,7 @@ final class MediaRouterMetricLogger {
            Slog.e(TAG, "Unable to get routing change logging info for the specified sessionId.");
            return;
        }
        long sessionLengthInMillis =
                SystemClock.elapsedRealtime() - ongoingRoutingChange.startTimeInMillis;
        long sessionLengthInMillis = getElapsedRealTime() - ongoingRoutingChange.startTimeInMillis;

        if (DEBUG) {
            Slog.d(
@@ -339,6 +338,21 @@ final class MediaRouterMetricLogger {
        return mRequestInfoCache.size();
    }

    @VisibleForTesting
    /* package */ int getRoutingChangeInfoCacheSize() {
        return mRoutingChangeInfoCache.size();
    }

    @VisibleForTesting
    /* package */ int getOngoingRoutingChangeCacheSize() {
        return mOngoingRoutingChangeCache.size();
    }

    @VisibleForTesting
    /* package */ long getElapsedRealTime() {
        return SystemClock.elapsedRealtime();
    }

    private void logMediaRouterEvent(int eventType, int result) {
        MediaRouterStatsLog.write(
                MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED, eventType, result);
+253 −0
Original line number Diff line number Diff line
@@ -23,6 +23,9 @@ import static android.media.MediaRoute2ProviderService.REASON_REJECTED;
import static android.media.MediaRoute2ProviderService.REASON_ROUTE_NOT_AVAILABLE;
import static android.media.MediaRoute2ProviderService.REASON_UNIMPLEMENTED;
import static android.media.MediaRoute2ProviderService.REASON_UNKNOWN_ERROR;
import static android.media.RoutingSessionInfo.TRANSFER_REASON_APP;
import static android.media.RoutingSessionInfo.TRANSFER_REASON_FALLBACK;
import static android.media.RoutingSessionInfo.TRANSFER_REASON_SYSTEM_REQUEST;

import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED;
@@ -36,9 +39,32 @@ import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_RE
import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_UNIMPLEMENTED;
import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_UNKNOWN_ERROR;
import static com.android.server.media.MediaRouterStatsLog.MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_UNSPECIFIED;
import static com.android.server.media.MediaRouterStatsLog.ROUTING_CHANGE_REPORTED;
import static com.android.server.media.MediaRouterStatsLog.ROUTING_CHANGE_REPORTED__ENTRY_POINT__ENTRY_POINT_LOCAL_ROUTER;
import static com.android.server.media.MediaRouterStatsLog.ROUTING_CHANGE_REPORTED__ENTRY_POINT__ENTRY_POINT_PROXY_ROUTER;
import static com.android.server.media.MediaRouterStatsLog.ROUTING_CHANGE_REPORTED__ENTRY_POINT__ENTRY_POINT_SYSTEM_MEDIA_CONTROLS;
import static com.android.server.media.MediaRouterStatsLog.ROUTING_CHANGE_REPORTED__ENTRY_POINT__ENTRY_POINT_SYSTEM_OUTPUT_SWITCHER;
import static com.android.server.media.MediaRouterStatsLog.ROUTING_CHANGE_REPORTED__ENTRY_POINT__ENTRY_POINT_TV_OUTPUT_SWITCHER;
import static com.android.server.media.MediaRouterStatsLog.ROUTING_CHANGE_REPORTED__TRANSFER_REASON__TRANSFER_REASON_APP;
import static com.android.server.media.MediaRouterStatsLog.ROUTING_CHANGE_REPORTED__TRANSFER_REASON__TRANSFER_REASON_FALLBACK;
import static com.android.server.media.MediaRouterStatsLog.ROUTING_CHANGE_REPORTED__TRANSFER_REASON__TRANSFER_REASON_SYSTEM_REQUEST;
import static com.android.server.media.MediaRouterStatsLog.ROUTING_CHANGE_REPORTED__TRANSFER_REASON__TRANSFER_REASON_UNSPECIFIED;

import static com.google.common.truth.Truth.assertThat;

import static org.junit.Assert.assertThrows;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;

import android.media.RoutingChangeInfo;
import android.media.RoutingSessionInfo;
import android.os.SystemClock;

import androidx.test.runner.AndroidJUnit4;

import com.android.modules.utils.testing.ExtendedMockitoRule;
@@ -47,6 +73,7 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.MockitoAnnotations;

@RunWith(AndroidJUnit4.class)
@@ -168,4 +195,230 @@ public class MediaRouterMetricLoggerTest {
                                MEDIA_ROUTER_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_CREATE_SESSION,
                                MEDIA_ROUTER_EVENT_REPORTED__RESULT__RESULT_UNSPECIFIED));
    }

    // Routing change tests.
    @Test
    public void convertEntryPointForLogging_returnsExpectedResults() {
        assertThat(
                        MediaRouterMetricLogger.convertEntryPointForLogging(
                                RoutingChangeInfo.ENTRY_POINT_SYSTEM_OUTPUT_SWITCHER))
                .isEqualTo(
                        ROUTING_CHANGE_REPORTED__ENTRY_POINT__ENTRY_POINT_SYSTEM_OUTPUT_SWITCHER);
        assertThat(
                        MediaRouterMetricLogger.convertEntryPointForLogging(
                                RoutingChangeInfo.ENTRY_POINT_SYSTEM_MEDIA_CONTROLS))
                .isEqualTo(ROUTING_CHANGE_REPORTED__ENTRY_POINT__ENTRY_POINT_SYSTEM_MEDIA_CONTROLS);
        assertThat(
                        MediaRouterMetricLogger.convertEntryPointForLogging(
                                RoutingChangeInfo.ENTRY_POINT_LOCAL_ROUTER_UNSPECIFIED))
                .isEqualTo(ROUTING_CHANGE_REPORTED__ENTRY_POINT__ENTRY_POINT_LOCAL_ROUTER);
        assertThat(
                        MediaRouterMetricLogger.convertEntryPointForLogging(
                                RoutingChangeInfo.ENTRY_POINT_PROXY_ROUTER_UNSPECIFIED))
                .isEqualTo(ROUTING_CHANGE_REPORTED__ENTRY_POINT__ENTRY_POINT_PROXY_ROUTER);
        assertThat(
                        MediaRouterMetricLogger.convertEntryPointForLogging(
                                RoutingChangeInfo.ENTRY_POINT_TV_OUTPUT_SWITCHER))
                .isEqualTo(ROUTING_CHANGE_REPORTED__ENTRY_POINT__ENTRY_POINT_TV_OUTPUT_SWITCHER);
    }

    @Test
    public void convertEntryPointForLogging_invalidEntryPoint_throwsException() {
        // Testing below the lower limit of accepted values.
        assertThrows(
                IllegalArgumentException.class,
                () ->
                        MediaRouterMetricLogger.convertEntryPointForLogging(
                                RoutingChangeInfo.ENTRY_POINT_SYSTEM_OUTPUT_SWITCHER - 1));
        // Testing above the upper limit of accepted values.
        assertThrows(
                IllegalArgumentException.class,
                () ->
                        MediaRouterMetricLogger.convertEntryPointForLogging(
                                RoutingChangeInfo.ENTRY_POINT_TV_OUTPUT_SWITCHER + 1));
    }

    @Test
    public void convertTransferReasonForLogging_returnsExpectedResults() {
        assertThat(
                        MediaRouterMetricLogger.convertTransferReasonForLogging(
                                TRANSFER_REASON_FALLBACK))
                .isEqualTo(ROUTING_CHANGE_REPORTED__TRANSFER_REASON__TRANSFER_REASON_FALLBACK);
        assertThat(
                        MediaRouterMetricLogger.convertTransferReasonForLogging(
                                TRANSFER_REASON_SYSTEM_REQUEST))
                .isEqualTo(
                        ROUTING_CHANGE_REPORTED__TRANSFER_REASON__TRANSFER_REASON_SYSTEM_REQUEST);
        assertThat(MediaRouterMetricLogger.convertTransferReasonForLogging(TRANSFER_REASON_APP))
                .isEqualTo(ROUTING_CHANGE_REPORTED__TRANSFER_REASON__TRANSFER_REASON_APP);
        // Testing below the lower limit of accepted values.
        assertThat(
                        MediaRouterMetricLogger.convertTransferReasonForLogging(
                                TRANSFER_REASON_FALLBACK - 1))
                .isEqualTo(ROUTING_CHANGE_REPORTED__TRANSFER_REASON__TRANSFER_REASON_UNSPECIFIED);
        // Testing above the upper limit of accepted values.
        assertThat(MediaRouterMetricLogger.convertTransferReasonForLogging(TRANSFER_REASON_APP + 1))
                .isEqualTo(ROUTING_CHANGE_REPORTED__TRANSFER_REASON__TRANSFER_REASON_UNSPECIFIED);
    }

    @Test
    public void convertTransferReasonForLogging_invalidEntryPoint_throwsException() {
        // Testing below the lower limit of accepted values.
        assertThrows(
                IllegalArgumentException.class,
                () ->
                        MediaRouterMetricLogger.convertEntryPointForLogging(
                                RoutingChangeInfo.ENTRY_POINT_SYSTEM_OUTPUT_SWITCHER - 1));
        // Testing above the upper limit of accepted values.
        assertThrows(
                IllegalArgumentException.class,
                () ->
                        MediaRouterMetricLogger.convertEntryPointForLogging(
                                RoutingChangeInfo.ENTRY_POINT_TV_OUTPUT_SWITCHER + 1));
    }

    @Test
    public void notifyRoutingChangeRequested_addsRoutingChangeInfoToCache() {
        assertThat(mLogger.getRoutingChangeInfoCacheSize()).isEqualTo(0);
        RoutingChangeInfo routingChangeInfo =
                new RoutingChangeInfo(
                        RoutingChangeInfo.ENTRY_POINT_SYSTEM_OUTPUT_SWITCHER,
                        /* isSuggested= */ false);

        mLogger.notifyRoutingChangeRequested(/* uniqueRequestId= */ 0, routingChangeInfo);

        assertThat(mLogger.getRoutingChangeInfoCacheSize()).isEqualTo(1);
    }

    @Test
    public void notifyRoutingChange_addsOngoingRoutingChangeToCache() {
        assertThat(mLogger.getRoutingChangeInfoCacheSize()).isEqualTo(0);
        String originalSessionId = "originalSessionId";
        String clientPackageName = "clientPackageName";
        int clientPackageUid = 123;
        long uniqueRequestId = 0;
        RoutingChangeInfo routingChangeInfo =
                new RoutingChangeInfo(
                        RoutingChangeInfo.ENTRY_POINT_SYSTEM_OUTPUT_SWITCHER,
                        /* isSuggested= */ false);
        RoutingSessionInfo routingSessionInfo =
                new RoutingSessionInfo.Builder(originalSessionId, clientPackageName)
                        .addSelectedRoute(/* routeId= */ "_")
                        .setTransferReason(TRANSFER_REASON_SYSTEM_REQUEST)
                        .build();

        mLogger.notifyRoutingChangeRequested(uniqueRequestId, routingChangeInfo);
        mLogger.notifyRoutingChange(uniqueRequestId, routingSessionInfo, clientPackageUid);

        assertThat(mLogger.getOngoingRoutingChangeCacheSize()).isEqualTo(1);
        assertThat(mLogger.getRoutingChangeInfoCacheSize()).isEqualTo(0);
    }

    @Test
    public void notifyRoutingChange_withIncorrectRequestId_isNoOp() {
        assertThat(mLogger.getRoutingChangeInfoCacheSize()).isEqualTo(0);
        String originalSessionId = "originalSessionId";
        String clientPackageName = "clientPackageName";
        int clientPackageUid = 123;
        long uniqueRequestId = 0;
        RoutingSessionInfo routingSessionInfo =
                new RoutingSessionInfo.Builder(originalSessionId, clientPackageName)
                        .addSelectedRoute(/* routeId= */ "_")
                        .setTransferReason(TRANSFER_REASON_SYSTEM_REQUEST)
                        .build();
        RoutingChangeInfo routingChangeInfo =
                new RoutingChangeInfo(
                        RoutingChangeInfo.ENTRY_POINT_SYSTEM_OUTPUT_SWITCHER,
                        /* isSuggested= */ false);

        mLogger.notifyRoutingChangeRequested(uniqueRequestId, routingChangeInfo);
        mLogger.notifyRoutingChange(uniqueRequestId + 1, routingSessionInfo, clientPackageUid);

        // No entry should be added to the ongoingRoutingChange cache.
        assertThat(mLogger.getOngoingRoutingChangeCacheSize()).isEqualTo(0);
        // Existing entry should not be removed from routingChangeInfo cache.
        assertThat(mLogger.getRoutingChangeInfoCacheSize()).isEqualTo(1);
    }

    @Test
    public void notifySessionEnd_withIncorrectSessionId_isNoOp() {
        assertThat(mLogger.getRoutingChangeInfoCacheSize()).isEqualTo(0);
        String originalSessionId = "originalSessionId";
        String clientPackageName = "clientPackageName";
        int clientPackageUid = 123;
        long uniqueRequestId = 0;
        RoutingSessionInfo routingSessionInfo =
                new RoutingSessionInfo.Builder(originalSessionId, clientPackageName)
                        .addSelectedRoute(/* routeId= */ "_")
                        .setTransferReason(TRANSFER_REASON_SYSTEM_REQUEST)
                        .build();
        RoutingChangeInfo routingChangeInfo =
                new RoutingChangeInfo(
                        RoutingChangeInfo.ENTRY_POINT_SYSTEM_OUTPUT_SWITCHER,
                        /* isSuggested= */ false);

        mLogger.notifyRoutingChangeRequested(uniqueRequestId, routingChangeInfo);
        mLogger.notifyRoutingChange(uniqueRequestId, routingSessionInfo, clientPackageUid);
        mLogger.notifySessionEnd("someOtherSessionId");

        assertThat(mLogger.getOngoingRoutingChangeCacheSize()).isEqualTo(1);
        verify(
                () ->
                        MediaRouterStatsLog.write(
                                anyInt(),
                                anyInt(),
                                anyInt(),
                                anyBoolean(),
                                anyInt(),
                                anyBoolean(),
                                anyLong()),
                never());
    }

    @Test
    public void notifySessionEnd_logsRoutingChangeMetric() {
        MediaRouterMetricLogger spyLogger = spy(mLogger);
        assertThat(spyLogger.getOngoingRoutingChangeCacheSize()).isEqualTo(0);
        String originalSessionId = "originalSessionId";
        String clientPackageName = "clientPackageName";
        int clientPackageUid = 123;
        int sessionTimeInMillis = 3_000;
        long uniqueRequestId = 0;
        long sessionStartTimeInMillis = SystemClock.elapsedRealtime();
        RoutingChangeInfo routingChangeInfo =
                new RoutingChangeInfo(
                        RoutingChangeInfo.ENTRY_POINT_SYSTEM_OUTPUT_SWITCHER,
                        /* isSuggested= */ false);
        RoutingSessionInfo routingSessionInfo =
                new RoutingSessionInfo.Builder(originalSessionId, clientPackageName)
                        .addSelectedRoute(/* routeId= */ "_")
                        .setTransferReason(TRANSFER_REASON_SYSTEM_REQUEST)
                        .build();
        // Returns the start time of the session when called the first time and the session end time
        // the second time.
        doReturn(sessionStartTimeInMillis)
                .doReturn(sessionStartTimeInMillis + sessionTimeInMillis)
                .when(spyLogger)
                .getElapsedRealTime();

        spyLogger.notifyRoutingChangeRequested(uniqueRequestId, routingChangeInfo);
        spyLogger.notifyRoutingChange(uniqueRequestId, routingSessionInfo, clientPackageUid);
        spyLogger.notifySessionEnd(originalSessionId);

        assertThat(spyLogger.getOngoingRoutingChangeCacheSize()).isEqualTo(0);
        ArgumentCaptor<Long> sessionLengthCaptor = ArgumentCaptor.forClass(Long.class);
        verify(
                () ->
                        MediaRouterStatsLog.write(
                                eq(ROUTING_CHANGE_REPORTED),
                                eq(
                                        ROUTING_CHANGE_REPORTED__ENTRY_POINT__ENTRY_POINT_SYSTEM_OUTPUT_SWITCHER),
                                eq(clientPackageUid),
                                eq(/* isSystemRoute= */ false),
                                eq(
                                        ROUTING_CHANGE_REPORTED__TRANSFER_REASON__TRANSFER_REASON_SYSTEM_REQUEST),
                                eq(/* isSuggested= */ false),
                                sessionLengthCaptor.capture()));
        assertThat(sessionLengthCaptor.getValue()).isEqualTo(sessionTimeInMillis);
    }
}