1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.car.occupantconnection; 18 19 import static android.car.Car.CAR_INTENT_ACTION_RECEIVER_SERVICE; 20 21 import static com.google.common.truth.Truth.assertThat; 22 23 import static org.mockito.Mockito.mock; 24 import static org.mockito.Mockito.verify; 25 import static org.mockito.Mockito.when; 26 27 import android.car.CarOccupantZoneManager.OccupantZoneInfo; 28 import android.content.Intent; 29 import android.content.pm.SigningInfo; 30 import android.os.IBinder; 31 import android.os.RemoteException; 32 import android.platform.test.annotations.DisabledOnRavenwood; 33 import android.util.Pair; 34 35 import org.junit.Before; 36 import org.junit.Test; 37 import org.junit.runner.RunWith; 38 import org.mockito.Mock; 39 import org.mockito.junit.MockitoJUnitRunner; 40 41 import java.util.Set; 42 43 @RunWith(MockitoJUnitRunner.class) 44 @DisabledOnRavenwood(blockedBy = android.app.Service.class) 45 public final class AbstractReceiverServiceUnitTest { 46 private static final String RECEIVER_ENDPOINT_ID = "test_receiver_endpoint"; 47 48 private final TestReceiverService mService = new TestReceiverService(); 49 private final IBackendReceiver mBackendReceiver = 50 IBackendReceiver.Stub.asInterface( 51 mService.onBind(new Intent(CAR_INTENT_ACTION_RECEIVER_SERVICE))); 52 53 @Mock 54 private IPayloadCallback mPayloadCallback; 55 @Mock 56 private IBinder mPayloadCallbackBinder; 57 @Mock 58 OccupantZoneInfo mSenderZone; 59 @Mock 60 IBackendConnectionResponder mResponder; 61 @Mock 62 Payload mPayload; 63 64 @Before setUp()65 public void setUp() { 66 when(mPayloadCallback.asBinder()).thenReturn(mPayloadCallbackBinder); 67 } 68 69 @Test testRegisterAndUnregisterReceiver()70 public void testRegisterAndUnregisterReceiver() throws RemoteException { 71 // Register the first endpoint. 72 mBackendReceiver.registerReceiver(RECEIVER_ENDPOINT_ID, mPayloadCallback); 73 74 // TODO(b/272196149): replace assertions with Truth's expect. 75 assertThat(mService.onReceiverRegisteredInvokedRecords.contains(RECEIVER_ENDPOINT_ID)) 76 .isTrue(); 77 78 Set<String> receiverEndpoints = mService.getAllReceiverEndpoints(); 79 assertThat(receiverEndpoints.size()).isEqualTo(1); 80 assertThat(receiverEndpoints.contains(RECEIVER_ENDPOINT_ID)).isTrue(); 81 82 // Register the second endpoint. 83 String receiverEndpointId2 = "ID2"; 84 IPayloadCallback payloadCallback2 = mock(IPayloadCallback.class); 85 IBinder payloadCallbackBinder2 = mock(IBinder.class); 86 when(payloadCallback2.asBinder()).thenReturn(payloadCallbackBinder2); 87 mBackendReceiver.registerReceiver(receiverEndpointId2, payloadCallback2); 88 89 assertThat(mService.onReceiverRegisteredInvokedRecords.contains(RECEIVER_ENDPOINT_ID)) 90 .isTrue(); 91 receiverEndpoints = mService.getAllReceiverEndpoints(); 92 assertThat(receiverEndpoints.size()).isEqualTo(2); 93 assertThat(receiverEndpoints.contains(RECEIVER_ENDPOINT_ID)).isTrue(); 94 assertThat(receiverEndpoints.contains(receiverEndpointId2)).isTrue(); 95 96 // Unregister the first endpoint. 97 mBackendReceiver.unregisterReceiver(RECEIVER_ENDPOINT_ID); 98 99 receiverEndpoints = mService.getAllReceiverEndpoints(); 100 assertThat(receiverEndpoints.size()).isEqualTo(1); 101 assertThat(receiverEndpoints.contains(receiverEndpointId2)).isTrue(); 102 103 // Unregister the second endpoint. 104 mBackendReceiver.unregisterReceiver(receiverEndpointId2); 105 assertThat(receiverEndpoints.size()).isEqualTo(0); 106 } 107 108 @Test testOnPayloadReceived()109 public void testOnPayloadReceived() throws RemoteException { 110 mBackendReceiver.onPayloadReceived(mSenderZone, mPayload); 111 112 assertThat(mService.onPayloadReceivedInvokedRecords 113 .contains(new Pair(mSenderZone, mPayload))).isTrue(); 114 } 115 116 @Test testOnConnectionInitiated()117 public void testOnConnectionInitiated() throws RemoteException { 118 mBackendReceiver.onConnectionInitiated(mSenderZone, /* senderVersion= */ 0, 119 mock(SigningInfo.class)); 120 121 assertThat(mService.onConnectionInitiatedInvokedRecords.contains(mSenderZone)).isTrue(); 122 } 123 124 @Test testOnConnected()125 public void testOnConnected() throws RemoteException { 126 mBackendReceiver.onConnected(mSenderZone); 127 128 assertThat(mService.onConnectedInvokedRecords.contains(mSenderZone)).isTrue(); 129 } 130 131 @Test testOnConnectionCanceled()132 public void testOnConnectionCanceled() throws RemoteException { 133 mBackendReceiver.onConnectionCanceled(mSenderZone); 134 135 assertThat(mService.onConnectionCanceledInvokedRecords.contains(mSenderZone)).isTrue(); 136 } 137 138 @Test testDisconnected()139 public void testDisconnected() throws RemoteException { 140 mBackendReceiver.onDisconnected(mSenderZone); 141 142 assertThat(mService.onDisconnectedInvokedRecords.contains(mSenderZone)).isTrue(); 143 } 144 145 @Test testOnBind()146 public void testOnBind() { 147 assertThat(mService.onBind(new Intent(CAR_INTENT_ACTION_RECEIVER_SERVICE))) 148 .isEqualTo(mBackendReceiver.asBinder()); 149 150 assertThat(mService.onBind(new Intent("my_intent"))) 151 .isEqualTo(mService.localBinder); 152 } 153 154 @Test testAcceptConnection()155 public void testAcceptConnection() throws RemoteException { 156 mBackendReceiver.registerBackendConnectionResponder(mResponder); 157 mService.acceptConnection(mSenderZone); 158 159 verify(mResponder).acceptConnection(mSenderZone); 160 } 161 162 @Test testRejectConnection()163 public void testRejectConnection() throws RemoteException { 164 mBackendReceiver.registerBackendConnectionResponder(mResponder); 165 int rejectionReason = 123; 166 mService.rejectConnection(mSenderZone, rejectionReason); 167 168 verify(mResponder).rejectConnection(mSenderZone, rejectionReason); 169 } 170 171 @Test testForwardPayload()172 public void testForwardPayload() throws RemoteException { 173 // The receiver endpoint is not registered yet, so it should fail to forward the mPayload. 174 assertThat(mService.forwardPayload(mSenderZone, RECEIVER_ENDPOINT_ID, mPayload)).isFalse(); 175 176 // Register the receiver endpoint. 177 mBackendReceiver.registerReceiver(RECEIVER_ENDPOINT_ID, mPayloadCallback); 178 179 assertThat(mService.forwardPayload(mSenderZone, RECEIVER_ENDPOINT_ID, mPayload)).isTrue(); 180 verify(mPayloadCallback).onPayloadReceived(mSenderZone, RECEIVER_ENDPOINT_ID, mPayload); 181 } 182 } 183