• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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