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

Commit 0a61376e authored by Arthur Ishiguro's avatar Arthur Ishiguro
Browse files

Handle onMessageReceived calls to invalid sessions

Bug: 385221353
Flag: android.chre.flags.offload_implementation
Test: atest FrameworksServicesTests_contexthub_postsubmit pass
Change-Id: I96a6684f98bcc82c94a91e8d335d6a4edbb9e89c
parent 93a9c9f2
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -19,12 +19,14 @@ package com.android.server.location.contexthub;
import android.content.Context;
import android.hardware.contexthub.ContextHubInfo;
import android.hardware.contexthub.EndpointInfo;
import android.hardware.contexthub.ErrorCode;
import android.hardware.contexthub.HubEndpointInfo;
import android.hardware.contexthub.HubInfo;
import android.hardware.contexthub.HubMessage;
import android.hardware.contexthub.IContextHubEndpoint;
import android.hardware.contexthub.IContextHubEndpointCallback;
import android.hardware.contexthub.IEndpointCommunication;
import android.hardware.contexthub.MessageDeliveryStatus;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.util.Log;
@@ -339,6 +341,12 @@ import java.util.function.Consumer;
                        sessionId, (broker) -> broker.onMessageReceived(sessionId, message));
        if (!callbackInvoked) {
            Log.w(TAG, "onMessageReceived: unknown session ID " + sessionId);
            if (message.isResponseRequired()) {
                sendMessageDeliveryStatus(
                        sessionId,
                        message.getMessageSequenceNumber(),
                        ErrorCode.DESTINATION_NOT_FOUND);
            }
        }
    }

@@ -402,6 +410,21 @@ import java.util.function.Consumer;
        return (minId <= maxId) && (minId >= 0) && (maxId >= 0);
    }

    private void sendMessageDeliveryStatus(
            int sessionId, int messageSequenceNumber, byte errorCode) {
        MessageDeliveryStatus status = new MessageDeliveryStatus();
        status.messageSequenceNumber = messageSequenceNumber;
        status.errorCode = errorCode;
        try {
            mHubInterface.sendMessageDeliveryStatusToEndpoint(sessionId, status);
        } catch (RemoteException e) {
            Log.w(
                    TAG,
                    "Exception while sending message delivery status on session " + sessionId,
                    e);
        }
    }

    @VisibleForTesting
    /* package */ int getNumAvailableSessions() {
        synchronized (mSessionIdLock) {
+26 −0
Original line number Diff line number Diff line
@@ -19,14 +19,19 @@ package com.android.server.location.contexthub;
import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.Context;
import android.hardware.contexthub.ErrorCode;
import android.hardware.contexthub.HubEndpointInfo;
import android.hardware.contexthub.HubEndpointInfo.HubEndpointIdentifier;
import android.hardware.contexthub.HubMessage;
import android.hardware.contexthub.IContextHubEndpoint;
import android.hardware.contexthub.IContextHubEndpointCallback;
import android.hardware.contexthub.IEndpointCommunication;
import android.hardware.contexthub.MessageDeliveryStatus;
import android.os.Binder;
import android.os.RemoteException;
import android.platform.test.annotations.Postsubmit;
@@ -38,6 +43,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.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
@@ -121,4 +127,24 @@ public class ContextHubEndpointTest {
        mEndpointManager.returnSessionId(sessionId);
        assertThat(mEndpointManager.getNumAvailableSessions()).isEqualTo(SESSION_ID_RANGE);
    }

    @Test
    public void testInvalidMessageReceivedCallback() throws RemoteException {
        // Send an invalid call to onMessageReceived (no sessions created)
        final int messageType = 1234;
        final int sessionId = 4321;
        final int sequenceNumber = 5678;
        HubMessage message =
                new HubMessage.Builder(messageType, new byte[0]).setResponseRequired(true).build();
        message.setMessageSequenceNumber(sequenceNumber);
        mEndpointManager.onMessageReceived(sessionId, message);

        // Confirm that we can get a delivery status with DESTINATION_NOT_FOUND error
        ArgumentCaptor<MessageDeliveryStatus> statusCaptor =
                ArgumentCaptor.forClass(MessageDeliveryStatus.class);
        verify(mMockEndpointCommunications)
                .sendMessageDeliveryStatusToEndpoint(eq(sessionId), statusCaptor.capture());
        assertThat(statusCaptor.getValue().messageSequenceNumber).isEqualTo(sequenceNumber);
        assertThat(statusCaptor.getValue().errorCode).isEqualTo(ErrorCode.DESTINATION_NOT_FOUND);
    }
}