• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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 com.android.server.uwb;
18 
19 import static com.android.server.uwb.UwbTestUtils.DATA_PAYLOAD;
20 import static com.android.server.uwb.UwbTestUtils.PEER_EXTENDED_UWB_ADDRESS;
21 import static com.android.server.uwb.UwbTestUtils.PEER_SHORT_MAC_ADDRESS;
22 import static com.android.server.uwb.UwbTestUtils.PERSISTABLE_BUNDLE;
23 import static com.android.server.uwb.data.UwbUciConstants.MAC_ADDRESSING_MODE_SHORT;
24 import static com.android.server.uwb.data.UwbUciConstants.RANGING_MEASUREMENT_TYPE_DL_TDOA;
25 import static com.android.server.uwb.data.UwbUciConstants.RANGING_MEASUREMENT_TYPE_OWR_AOA;
26 import static com.android.server.uwb.data.UwbUciConstants.RANGING_MEASUREMENT_TYPE_TWO_WAY;
27 import static com.android.server.uwb.data.UwbUciConstants.STATUS_CODE_FAILED;
28 
29 import static org.mockito.ArgumentMatchers.anyInt;
30 import static org.mockito.ArgumentMatchers.argThat;
31 import static org.mockito.ArgumentMatchers.eq;
32 import static org.mockito.ArgumentMatchers.isA;
33 import static org.mockito.Mockito.any;
34 import static org.mockito.Mockito.clearInvocations;
35 import static org.mockito.Mockito.never;
36 import static org.mockito.Mockito.validateMockitoUsage;
37 import static org.mockito.Mockito.verify;
38 import static org.mockito.Mockito.when;
39 
40 import android.content.AttributionSource;
41 import android.os.PersistableBundle;
42 import android.os.RemoteException;
43 import android.platform.test.annotations.Presubmit;
44 import android.test.suitebuilder.annotation.SmallTest;
45 import android.util.Pair;
46 import android.uwb.IUwbRangingCallbacks;
47 import android.uwb.RangingChangeReason;
48 import android.uwb.RangingReport;
49 import android.uwb.SessionHandle;
50 
51 import androidx.test.runner.AndroidJUnit4;
52 
53 import com.android.server.uwb.data.UwbRangingData;
54 import com.android.server.uwb.data.UwbUciConstants;
55 
56 import com.google.uwb.support.fira.FiraOpenSessionParams;
57 import com.google.uwb.support.fira.FiraParams;
58 
59 import org.junit.After;
60 import org.junit.Before;
61 import org.junit.Test;
62 import org.junit.runner.RunWith;
63 import org.mockito.Mock;
64 import org.mockito.MockitoAnnotations;
65 
66 import java.util.Set;
67 
68 /**
69  * Unit tests for {@link com.android.server.uwb.UwbSettingsStore}.
70  */
71 @RunWith(AndroidJUnit4.class)
72 @SmallTest
73 @Presubmit
74 public class UwbSessionNotificationManagerTest {
75     private static final long TEST_ELAPSED_NANOS = 100L;
76     private static final int UID = 343453;
77     private static final String PACKAGE_NAME = "com.uwb.test";
78     private static final AttributionSource ATTRIBUTION_SOURCE =
79             new AttributionSource.Builder(UID).setPackageName(PACKAGE_NAME).build();
80 
81     @Mock private UwbInjector mUwbInjector;
82     @Mock private UwbSessionManager.UwbSession mUwbSession;
83     @Mock private SessionHandle mSessionHandle;
84     @Mock private IUwbRangingCallbacks mIUwbRangingCallbacks;
85     @Mock private FiraOpenSessionParams mFiraParams;
86     @Mock private UwbServiceCore mUwbServiceCore;
87     @Mock private UwbMetrics mUwbMetrics;
88 
89     private UwbSessionNotificationManager mUwbSessionNotificationManager;
90 
91     @Before
setUp()92     public void setUp() throws Exception {
93         MockitoAnnotations.initMocks(this);
94         when(mUwbSession.getSessionHandle()).thenReturn(mSessionHandle);
95         when(mUwbSession.getIUwbRangingCallbacks()).thenReturn(mIUwbRangingCallbacks);
96         when(mUwbSession.getProtocolName()).thenReturn(FiraParams.PROTOCOL_NAME);
97         when(mUwbSession.getParams()).thenReturn(mFiraParams);
98         when(mUwbSession.getAttributionSource()).thenReturn(ATTRIBUTION_SOURCE);
99         when(mFiraParams.getAoaResultRequest()).thenReturn(
100                 FiraParams.AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS);
101         when(mFiraParams.hasRangingResultReportMessage()).thenReturn(false);
102         when(mFiraParams.hasControlMessage()).thenReturn(false);
103         when(mFiraParams.hasRangingControlPhase()).thenReturn(true);
104         when(mUwbInjector.checkUwbRangingPermissionForDataDelivery(any(), any())).thenReturn(true);
105         when(mUwbInjector.getElapsedSinceBootNanos()).thenReturn(TEST_ELAPSED_NANOS);
106         when(mUwbInjector.getUwbServiceCore()).thenReturn(mUwbServiceCore);
107         when(mUwbInjector.getUwbMetrics()).thenReturn(mUwbMetrics);
108         mUwbSessionNotificationManager = new UwbSessionNotificationManager(mUwbInjector);
109     }
110 
111     /**
112      * Called after each testGG
113      */
114     @After
cleanup()115     public void cleanup() {
116         validateMockitoUsage();
117     }
118 
119     @Test
testOnRangingResultWithoutUwbRangingPermission()120     public void testOnRangingResultWithoutUwbRangingPermission() throws Exception {
121         Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
122                 UwbTestUtils.generateRangingDataAndRangingReport(
123                         PEER_SHORT_MAC_ADDRESS, MAC_ADDRESSING_MODE_SHORT,
124                         RANGING_MEASUREMENT_TYPE_TWO_WAY,
125                         true, true, false, false, TEST_ELAPSED_NANOS);
126         when(mUwbInjector.checkUwbRangingPermissionForDataDelivery(eq(ATTRIBUTION_SOURCE), any()))
127                 .thenReturn(false);
128         mUwbSessionNotificationManager.onRangingResult(
129                 mUwbSession, testRangingDataAndRangingReport.first);
130 
131         verify(mIUwbRangingCallbacks, never()).onRangingResult(any(), any());
132         verify(mUwbMetrics, never()).logRangingResult(anyInt(), any(), any());
133     }
134 
135     @Test
testOnRangingResult_forTwoWay_WithAoa()136     public void testOnRangingResult_forTwoWay_WithAoa() throws Exception {
137         Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
138                 UwbTestUtils.generateRangingDataAndRangingReport(
139                         PEER_SHORT_MAC_ADDRESS, MAC_ADDRESSING_MODE_SHORT,
140                         RANGING_MEASUREMENT_TYPE_TWO_WAY,
141                         true, true, false, false, TEST_ELAPSED_NANOS);
142         mUwbSessionNotificationManager.onRangingResult(
143                 mUwbSession, testRangingDataAndRangingReport.first);
144         verify(mIUwbRangingCallbacks).onRangingResult(
145                 mSessionHandle, testRangingDataAndRangingReport.second);
146         verify(mUwbMetrics).logRangingResult(anyInt(), eq(testRangingDataAndRangingReport.first),
147                 eq(testRangingDataAndRangingReport.second.getMeasurements().get(0)));
148     }
149 
150     @Test
testOnRangingResult_forTwoWay_WithNoAoa()151     public void testOnRangingResult_forTwoWay_WithNoAoa() throws Exception {
152         when(mFiraParams.getAoaResultRequest()).thenReturn(
153                 FiraParams.AOA_RESULT_REQUEST_MODE_NO_AOA_REPORT);
154         Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
155                 UwbTestUtils.generateRangingDataAndRangingReport(
156                         PEER_SHORT_MAC_ADDRESS, MAC_ADDRESSING_MODE_SHORT,
157                         RANGING_MEASUREMENT_TYPE_TWO_WAY,
158                         false, false, false, false, TEST_ELAPSED_NANOS);
159         mUwbSessionNotificationManager.onRangingResult(
160                 mUwbSession, testRangingDataAndRangingReport.first);
161         verify(mIUwbRangingCallbacks).onRangingResult(
162                 mSessionHandle, testRangingDataAndRangingReport.second);
163         verify(mUwbMetrics).logRangingResult(anyInt(), eq(testRangingDataAndRangingReport.first),
164                 eq(testRangingDataAndRangingReport.second.getMeasurements().get(0)));
165     }
166 
167     @Test
testOnRangingResult_forTwoWay_WithNoAoaElevation()168     public void testOnRangingResult_forTwoWay_WithNoAoaElevation() throws Exception {
169         when(mFiraParams.getAoaResultRequest()).thenReturn(
170                 FiraParams.AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS_AZIMUTH_ONLY);
171         Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
172                 UwbTestUtils.generateRangingDataAndRangingReport(
173                         PEER_SHORT_MAC_ADDRESS, MAC_ADDRESSING_MODE_SHORT,
174                         RANGING_MEASUREMENT_TYPE_TWO_WAY,
175                         true, false, false, false, TEST_ELAPSED_NANOS);
176         mUwbSessionNotificationManager.onRangingResult(
177                 mUwbSession, testRangingDataAndRangingReport.first);
178         verify(mIUwbRangingCallbacks).onRangingResult(
179                 mSessionHandle, testRangingDataAndRangingReport.second);
180         verify(mUwbMetrics).logRangingResult(anyInt(), eq(testRangingDataAndRangingReport.first),
181                 eq(testRangingDataAndRangingReport.second.getMeasurements().get(0)));
182     }
183 
184     @Test
testOnRangingResult_forTwoWay_WithNoAoaAzimuth()185     public void testOnRangingResult_forTwoWay_WithNoAoaAzimuth() throws Exception {
186         when(mFiraParams.getAoaResultRequest()).thenReturn(
187                 FiraParams.AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS_ELEVATION_ONLY);
188         Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
189                 UwbTestUtils.generateRangingDataAndRangingReport(
190                         PEER_SHORT_MAC_ADDRESS, MAC_ADDRESSING_MODE_SHORT,
191                         RANGING_MEASUREMENT_TYPE_TWO_WAY,
192                         false, true, false, false, TEST_ELAPSED_NANOS);
193         mUwbSessionNotificationManager.onRangingResult(
194                 mUwbSession, testRangingDataAndRangingReport.first);
195         verify(mIUwbRangingCallbacks).onRangingResult(
196                 mSessionHandle, testRangingDataAndRangingReport.second);
197         verify(mUwbMetrics).logRangingResult(anyInt(), eq(testRangingDataAndRangingReport.first),
198                 eq(testRangingDataAndRangingReport.second.getMeasurements().get(0)));
199     }
200 
201     @Test
testOnRangingResult_forTwoWay_WithAoaAndDestAoa()202     public void testOnRangingResult_forTwoWay_WithAoaAndDestAoa() throws Exception {
203         when(mFiraParams.getAoaResultRequest()).thenReturn(
204                 FiraParams.AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS);
205         when(mFiraParams.hasRangingResultReportMessage()).thenReturn(true);
206         when(mFiraParams.hasControlMessage()).thenReturn(true);
207         when(mFiraParams.hasRangingControlPhase()).thenReturn(false);
208         when(mFiraParams.hasAngleOfArrivalAzimuthReport()).thenReturn(true);
209         when(mFiraParams.hasAngleOfArrivalElevationReport()).thenReturn(true);
210         Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
211                 UwbTestUtils.generateRangingDataAndRangingReport(
212                         PEER_SHORT_MAC_ADDRESS, MAC_ADDRESSING_MODE_SHORT,
213                         RANGING_MEASUREMENT_TYPE_TWO_WAY,
214                         true, true, true, true, TEST_ELAPSED_NANOS);
215         mUwbSessionNotificationManager.onRangingResult(
216                 mUwbSession, testRangingDataAndRangingReport.first);
217         verify(mIUwbRangingCallbacks).onRangingResult(
218                 mSessionHandle, testRangingDataAndRangingReport.second);
219         verify(mUwbMetrics).logRangingResult(anyInt(), eq(testRangingDataAndRangingReport.first),
220                 eq(testRangingDataAndRangingReport.second.getMeasurements().get(0)));
221     }
222 
223     @Test
testOnRangingResult_forTwoWay_WithAoaAndNoDestAzimuth()224     public void testOnRangingResult_forTwoWay_WithAoaAndNoDestAzimuth() throws Exception {
225         when(mFiraParams.getAoaResultRequest()).thenReturn(
226                 FiraParams.AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS);
227         when(mFiraParams.hasRangingResultReportMessage()).thenReturn(true);
228         when(mFiraParams.hasControlMessage()).thenReturn(true);
229         when(mFiraParams.hasRangingControlPhase()).thenReturn(false);
230         when(mFiraParams.hasAngleOfArrivalAzimuthReport()).thenReturn(false);
231         when(mFiraParams.hasAngleOfArrivalElevationReport()).thenReturn(true);
232         Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
233                 UwbTestUtils.generateRangingDataAndRangingReport(
234                         PEER_SHORT_MAC_ADDRESS, MAC_ADDRESSING_MODE_SHORT,
235                         RANGING_MEASUREMENT_TYPE_TWO_WAY,
236                         true, true, false, true, TEST_ELAPSED_NANOS);
237         mUwbSessionNotificationManager.onRangingResult(
238                 mUwbSession, testRangingDataAndRangingReport.first);
239         verify(mIUwbRangingCallbacks).onRangingResult(
240                 mSessionHandle, testRangingDataAndRangingReport.second);
241         verify(mUwbMetrics).logRangingResult(anyInt(), eq(testRangingDataAndRangingReport.first),
242                 eq(testRangingDataAndRangingReport.second.getMeasurements().get(0)));
243     }
244 
245     @Test
testOnRangingResult_forTwoWay_WithAoaAndNoDestElevation()246     public void testOnRangingResult_forTwoWay_WithAoaAndNoDestElevation() throws Exception {
247         when(mFiraParams.getAoaResultRequest()).thenReturn(
248                 FiraParams.AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS);
249         when(mFiraParams.hasRangingResultReportMessage()).thenReturn(true);
250         when(mFiraParams.hasControlMessage()).thenReturn(true);
251         when(mFiraParams.hasRangingControlPhase()).thenReturn(false);
252         when(mFiraParams.hasAngleOfArrivalAzimuthReport()).thenReturn(true);
253         when(mFiraParams.hasAngleOfArrivalElevationReport()).thenReturn(false);
254         Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
255                 UwbTestUtils.generateRangingDataAndRangingReport(
256                         PEER_SHORT_MAC_ADDRESS, MAC_ADDRESSING_MODE_SHORT,
257                         RANGING_MEASUREMENT_TYPE_TWO_WAY,
258                         true, true, true, false, TEST_ELAPSED_NANOS);
259         mUwbSessionNotificationManager.onRangingResult(
260                 mUwbSession, testRangingDataAndRangingReport.first);
261         verify(mIUwbRangingCallbacks).onRangingResult(
262                 mSessionHandle, testRangingDataAndRangingReport.second);
263         verify(mUwbMetrics).logRangingResult(anyInt(), eq(testRangingDataAndRangingReport.first),
264                 eq(testRangingDataAndRangingReport.second.getMeasurements().get(0)));
265     }
266 
267     @Test
testOnRangingResult_forTwoWay_WithNoAoaAndDestAoa()268     public void testOnRangingResult_forTwoWay_WithNoAoaAndDestAoa() throws Exception {
269         when(mFiraParams.getAoaResultRequest()).thenReturn(
270                 FiraParams.AOA_RESULT_REQUEST_MODE_NO_AOA_REPORT);
271         when(mFiraParams.hasRangingResultReportMessage()).thenReturn(true);
272         when(mFiraParams.hasControlMessage()).thenReturn(true);
273         when(mFiraParams.hasRangingControlPhase()).thenReturn(false);
274         when(mFiraParams.hasAngleOfArrivalAzimuthReport()).thenReturn(true);
275         when(mFiraParams.hasAngleOfArrivalElevationReport()).thenReturn(true);
276         Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
277                 UwbTestUtils.generateRangingDataAndRangingReport(
278                         PEER_SHORT_MAC_ADDRESS, MAC_ADDRESSING_MODE_SHORT,
279                         RANGING_MEASUREMENT_TYPE_TWO_WAY,
280                         false, false, true, true, TEST_ELAPSED_NANOS);
281         mUwbSessionNotificationManager.onRangingResult(
282                 mUwbSession, testRangingDataAndRangingReport.first);
283         verify(mIUwbRangingCallbacks).onRangingResult(
284                 mSessionHandle, testRangingDataAndRangingReport.second);
285         verify(mUwbMetrics).logRangingResult(anyInt(), eq(testRangingDataAndRangingReport.first),
286                 eq(testRangingDataAndRangingReport.second.getMeasurements().get(0)));
287     }
288 
289     @Test
testOnRangingResult_forTwoWay_WithNoAoaAzimuthAndDestAoa()290     public void testOnRangingResult_forTwoWay_WithNoAoaAzimuthAndDestAoa() throws Exception {
291         when(mFiraParams.getAoaResultRequest()).thenReturn(
292                 FiraParams.AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS_ELEVATION_ONLY);
293         when(mFiraParams.hasRangingResultReportMessage()).thenReturn(true);
294         when(mFiraParams.hasControlMessage()).thenReturn(true);
295         when(mFiraParams.hasRangingControlPhase()).thenReturn(false);
296         when(mFiraParams.hasAngleOfArrivalAzimuthReport()).thenReturn(true);
297         when(mFiraParams.hasAngleOfArrivalElevationReport()).thenReturn(true);
298         Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
299                 UwbTestUtils.generateRangingDataAndRangingReport(
300                         PEER_SHORT_MAC_ADDRESS, MAC_ADDRESSING_MODE_SHORT,
301                         RANGING_MEASUREMENT_TYPE_TWO_WAY,
302                         false, true, true, true, TEST_ELAPSED_NANOS);
303         mUwbSessionNotificationManager.onRangingResult(
304                 mUwbSession, testRangingDataAndRangingReport.first);
305         verify(mIUwbRangingCallbacks).onRangingResult(
306                 mSessionHandle, testRangingDataAndRangingReport.second);
307         verify(mUwbMetrics).logRangingResult(anyInt(), eq(testRangingDataAndRangingReport.first),
308                 eq(testRangingDataAndRangingReport.second.getMeasurements().get(0)));
309     }
310 
311     @Test
testOnRangingResult_forTwoWay_WithNoAoaElevationAndDestAoa()312     public void testOnRangingResult_forTwoWay_WithNoAoaElevationAndDestAoa() throws Exception {
313         when(mFiraParams.getAoaResultRequest()).thenReturn(
314                 FiraParams.AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS_AZIMUTH_ONLY);
315         when(mFiraParams.hasRangingResultReportMessage()).thenReturn(true);
316         when(mFiraParams.hasControlMessage()).thenReturn(true);
317         when(mFiraParams.hasRangingControlPhase()).thenReturn(false);
318         when(mFiraParams.hasAngleOfArrivalAzimuthReport()).thenReturn(true);
319         when(mFiraParams.hasAngleOfArrivalElevationReport()).thenReturn(true);
320         Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
321                 UwbTestUtils.generateRangingDataAndRangingReport(
322                         PEER_SHORT_MAC_ADDRESS, MAC_ADDRESSING_MODE_SHORT,
323                         RANGING_MEASUREMENT_TYPE_TWO_WAY,
324                         true, false, true, true, TEST_ELAPSED_NANOS);
325         mUwbSessionNotificationManager.onRangingResult(
326                 mUwbSession, testRangingDataAndRangingReport.first);
327         verify(mIUwbRangingCallbacks).onRangingResult(
328                 mSessionHandle, testRangingDataAndRangingReport.second);
329         verify(mUwbMetrics).logRangingResult(anyInt(), eq(testRangingDataAndRangingReport.first),
330                 eq(testRangingDataAndRangingReport.second.getMeasurements().get(0)));
331     }
332 
333     @Test
testOnRangingResult_forOwrAoa()334     public void testOnRangingResult_forOwrAoa() throws Exception {
335         Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
336                 UwbTestUtils.generateRangingDataAndRangingReport(
337                         PEER_SHORT_MAC_ADDRESS, MAC_ADDRESSING_MODE_SHORT,
338                         RANGING_MEASUREMENT_TYPE_OWR_AOA,
339                         true, true, false, false, TEST_ELAPSED_NANOS);
340         mUwbSessionNotificationManager.onRangingResult(
341                 mUwbSession, testRangingDataAndRangingReport.first);
342         verify(mIUwbRangingCallbacks).onRangingResult(
343                 mSessionHandle, testRangingDataAndRangingReport.second);
344         verify(mUwbMetrics).logRangingResult(anyInt(), eq(testRangingDataAndRangingReport.first),
345                 eq(testRangingDataAndRangingReport.second.getMeasurements().get(0)));
346     }
347 
348     @Test
testOnRangingResult_forDlTDoA()349     public void testOnRangingResult_forDlTDoA() throws Exception {
350         Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
351                 UwbTestUtils.generateRangingDataAndRangingReport(
352                         PEER_SHORT_MAC_ADDRESS, MAC_ADDRESSING_MODE_SHORT,
353                         RANGING_MEASUREMENT_TYPE_DL_TDOA,
354                         true, true, false, false, TEST_ELAPSED_NANOS);
355         mUwbSessionNotificationManager.onRangingResult(
356                 mUwbSession, testRangingDataAndRangingReport.first);
357         verify(mIUwbRangingCallbacks).onRangingResult(
358                 mSessionHandle, testRangingDataAndRangingReport.second);
359         verify(mUwbMetrics).logRangingResult(anyInt(), eq(testRangingDataAndRangingReport.first),
360                 eq(testRangingDataAndRangingReport.second.getMeasurements().get(0)));
361     }
362 
363     @Test
testOnRangingResult_badRangingDataForOwrAoa()364     public void testOnRangingResult_badRangingDataForOwrAoa() throws Exception {
365         UwbRangingData testRangingData = UwbTestUtils.generateBadOwrAoaMeasurementRangingData(
366                 MAC_ADDRESSING_MODE_SHORT, PEER_SHORT_MAC_ADDRESS);
367         mUwbSessionNotificationManager.onRangingResult(mUwbSession, testRangingData);
368         verify(mIUwbRangingCallbacks).onRangingResult(mSessionHandle, null);
369         verify(mUwbMetrics).logRangingResult(anyInt(), eq(testRangingData), eq(null));
370     }
371 
372     @Test
testOnRangingOpened()373     public void testOnRangingOpened() throws Exception {
374         mUwbSessionNotificationManager.onRangingOpened(mUwbSession);
375 
376         verify(mIUwbRangingCallbacks).onRangingOpened(mSessionHandle);
377     }
378 
379     @Test
testOnRangingOpenFailed()380     public void testOnRangingOpenFailed() throws Exception {
381         int status = UwbUciConstants.STATUS_CODE_ERROR_MAX_SESSIONS_EXCEEDED;
382         mUwbSessionNotificationManager.onRangingOpenFailed(mUwbSession, status);
383 
384         verify(mIUwbRangingCallbacks).onRangingOpenFailed(eq(mSessionHandle),
385                 eq(UwbSessionNotificationHelper.convertUciStatusToApiReasonCode(status)),
386                 argThat(p -> (p.getInt("status_code")) == status));
387     }
388 
389     @Test
testOnRangingStarted()390     public void testOnRangingStarted() throws Exception {
391         mUwbSessionNotificationManager.onRangingStarted(mUwbSession, mUwbSession.getParams());
392 
393         verify(mIUwbRangingCallbacks).onRangingStarted(mSessionHandle,
394                 mUwbSession.getParams().toBundle());
395     }
396 
397     @Test
testOnRangingStartFailed()398     public void testOnRangingStartFailed() throws Exception {
399         int status =  UwbUciConstants.STATUS_CODE_INVALID_PARAM;
400         mUwbSessionNotificationManager.onRangingStartFailed(mUwbSession, status);
401 
402         verify(mIUwbRangingCallbacks).onRangingStartFailed(eq(mSessionHandle),
403                 eq(UwbSessionNotificationHelper.convertUciStatusToApiReasonCode(status)),
404                 argThat(p -> (p.getInt("status_code")) == status));
405     }
406 
407     @Test
testOnRangingStoppedWithUciReasonCode_reasonLocalApi()408     public void testOnRangingStoppedWithUciReasonCode_reasonLocalApi() throws Exception {
409         int reasonCode = UwbUciConstants.REASON_STATE_CHANGE_WITH_SESSION_MANAGEMENT_COMMANDS;
410         mUwbSessionNotificationManager.onRangingStoppedWithUciReasonCode(mUwbSession, reasonCode);
411 
412         verify(mIUwbRangingCallbacks).onRangingStopped(
413                 eq(mSessionHandle), eq(RangingChangeReason.LOCAL_API),
414                 isA(PersistableBundle.class));
415     }
416     @Test
testOnRangingStoppedWithUciReasonCode_reasonMaxRRRetryReached()417     public void testOnRangingStoppedWithUciReasonCode_reasonMaxRRRetryReached() throws Exception {
418         int reasonCode = UwbUciConstants.REASON_MAX_RANGING_ROUND_RETRY_COUNT_REACHED;
419         mUwbSessionNotificationManager.onRangingStoppedWithUciReasonCode(mUwbSession, reasonCode);
420 
421         verify(mIUwbRangingCallbacks).onRangingStopped(
422                 eq(mSessionHandle), eq(RangingChangeReason.MAX_RR_RETRY_REACHED),
423                 isA(PersistableBundle.class));
424     }
425 
426     @Test
testOnRangingStoppedWithUciReasonCode_reasonRemoteRequest()427     public void testOnRangingStoppedWithUciReasonCode_reasonRemoteRequest() throws Exception {
428         int reasonCode = UwbUciConstants.REASON_MAX_NUMBER_OF_MEASUREMENTS_REACHED;
429         mUwbSessionNotificationManager.onRangingStoppedWithUciReasonCode(mUwbSession, reasonCode);
430 
431         verify(mIUwbRangingCallbacks).onRangingStopped(
432                 eq(mSessionHandle), eq(RangingChangeReason.REMOTE_REQUEST),
433                 isA(PersistableBundle.class));
434     }
435 
436     @Test
testOnRangingStoppedWithUciReasonCode_reasonBadParameters()437     public void testOnRangingStoppedWithUciReasonCode_reasonBadParameters() throws Exception {
438         Set<Integer> reasonCodes = Set.of(
439                 UwbUciConstants.REASON_ERROR_INSUFFICIENT_SLOTS_PER_RR,
440                 UwbUciConstants.REASON_ERROR_SLOT_LENGTH_NOT_SUPPORTED,
441                 UwbUciConstants.REASON_ERROR_INVALID_UL_TDOA_RANDOM_WINDOW,
442                 UwbUciConstants.REASON_ERROR_MAC_ADDRESS_MODE_NOT_SUPPORTED,
443                 UwbUciConstants.REASON_ERROR_INVALID_RANGING_INTERVAL,
444                 UwbUciConstants.REASON_ERROR_INVALID_STS_CONFIG,
445                 UwbUciConstants.REASON_ERROR_INVALID_RFRAME_CONFIG);
446         for (int reasonCode : reasonCodes) {
447             clearInvocations(mIUwbRangingCallbacks);
448             mUwbSessionNotificationManager.onRangingStoppedWithUciReasonCode(mUwbSession,
449                     reasonCode);
450             verify(mIUwbRangingCallbacks).onRangingStopped(
451                     eq(mSessionHandle), eq(RangingChangeReason.BAD_PARAMETERS),
452                     isA(PersistableBundle.class));
453         }
454     }
455 
456     @Test
testOnRangingStoppedWithUciReasonCode_reasonSystemRegulation()457     public void testOnRangingStoppedWithUciReasonCode_reasonSystemRegulation() throws Exception {
458         int reasonCode = UwbUciConstants.REASON_REGULATION_UWB_OFF;
459         mUwbSessionNotificationManager.onRangingStoppedWithUciReasonCode(mUwbSession, reasonCode);
460 
461         verify(mIUwbRangingCallbacks).onRangingStopped(
462                 eq(mSessionHandle), eq(RangingChangeReason.SYSTEM_REGULATION),
463                 isA(PersistableBundle.class));
464     }
465 
466     @Test
testOnRangingStoppedWithApiReasonCode()467     public void  testOnRangingStoppedWithApiReasonCode() throws Exception {
468         mUwbSessionNotificationManager.onRangingStoppedWithApiReasonCode(
469                 mUwbSession, RangingChangeReason.SYSTEM_POLICY);
470 
471         verify(mIUwbRangingCallbacks).onRangingStopped(
472                 eq(mSessionHandle), eq(RangingChangeReason.SYSTEM_POLICY),
473                 isA(PersistableBundle.class));
474     }
475 
476     @Test
testOnRangingStopped()477     public void testOnRangingStopped() throws Exception {
478         int status = UwbUciConstants.REASON_STATE_CHANGE_WITH_SESSION_MANAGEMENT_COMMANDS;
479         mUwbSessionNotificationManager.onRangingStopped(mUwbSession, status);
480 
481         verify(mIUwbRangingCallbacks).onRangingStopped(eq(mSessionHandle),
482                 eq(UwbSessionNotificationHelper.convertUciStatusToApiReasonCode(status)),
483                 argThat(p-> p.getInt("status_code") == status));
484     }
485 
486     @Test
testOnRangingStopFailed()487     public void testOnRangingStopFailed() throws Exception {
488         int status = UwbUciConstants.STATUS_CODE_INVALID_RANGE;
489         mUwbSessionNotificationManager.onRangingStopFailed(mUwbSession, status);
490 
491         verify(mIUwbRangingCallbacks).onRangingStopFailed(eq(mSessionHandle),
492                 eq(UwbSessionNotificationHelper.convertUciStatusToApiReasonCode(status)),
493                 argThat(p -> (p.getInt("status_code")) == status));
494     }
495 
496     @Test
testOnRangingReconfigured()497     public void testOnRangingReconfigured() throws Exception {
498         mUwbSessionNotificationManager.onRangingReconfigured(mUwbSession);
499 
500         verify(mIUwbRangingCallbacks).onRangingReconfigured(eq(mSessionHandle), any());
501     }
502 
503     @Test
testOnRangingReconfigureFailed()504     public void testOnRangingReconfigureFailed() throws Exception {
505         int status =  UwbUciConstants.STATUS_CODE_INVALID_MESSAGE_SIZE;
506         mUwbSessionNotificationManager.onRangingReconfigureFailed(mUwbSession, status);
507 
508         verify(mIUwbRangingCallbacks).onRangingReconfigureFailed(eq(mSessionHandle),
509                 eq(UwbSessionNotificationHelper.convertUciStatusToApiReasonCode(status)),
510                 argThat(p -> (p.getInt("status_code")) == status));
511     }
512 
513     @Test
testOnControleeAdded()514     public void testOnControleeAdded() throws Exception {
515         mUwbSessionNotificationManager.onControleeAdded(mUwbSession);
516 
517         verify(mIUwbRangingCallbacks).onControleeAdded(eq(mSessionHandle), any());
518     }
519 
520     @Test
testOnControleeAddFailed()521     public void testOnControleeAddFailed() throws Exception {
522         int status =  UwbUciConstants.STATUS_CODE_INVALID_MESSAGE_SIZE;
523         mUwbSessionNotificationManager.onControleeAddFailed(mUwbSession, status);
524 
525         verify(mIUwbRangingCallbacks).onControleeAddFailed(eq(mSessionHandle),
526                 eq(UwbSessionNotificationHelper.convertUciStatusToApiReasonCode(status)),
527                 argThat(p -> (p.getInt("status_code")) == status));
528     }
529 
530     @Test
testOnControleeRemoved()531     public void testOnControleeRemoved() throws Exception {
532         mUwbSessionNotificationManager.onControleeRemoved(mUwbSession);
533 
534         verify(mIUwbRangingCallbacks).onControleeRemoved(eq(mSessionHandle), any());
535     }
536 
537     @Test
testOnControleeRemoveFailed()538     public void testOnControleeRemoveFailed() throws Exception {
539         int status =  UwbUciConstants.STATUS_CODE_INVALID_MESSAGE_SIZE;
540         mUwbSessionNotificationManager.onControleeRemoveFailed(mUwbSession, status);
541 
542         verify(mIUwbRangingCallbacks).onControleeRemoveFailed(eq(mSessionHandle),
543                 eq(UwbSessionNotificationHelper.convertUciStatusToApiReasonCode(status)),
544                 argThat(p -> (p.getInt("status_code")) == status));
545     }
546 
547     @Test
testOnRangingClosed()548     public void testOnRangingClosed() throws Exception {
549         int status = UwbUciConstants.REASON_ERROR_SLOT_LENGTH_NOT_SUPPORTED;
550         mUwbSessionNotificationManager.onRangingClosed(mUwbSession, status);
551 
552         verify(mIUwbRangingCallbacks).onRangingClosed(eq(mSessionHandle),
553                 eq(UwbSessionNotificationHelper.convertUciStatusToApiReasonCode(status)),
554                 argThat(p-> p.getInt("status_code") == status));
555     }
556 
557     @Test
testOnRangingClosedWithReasonCode()558     public void testOnRangingClosedWithReasonCode() throws Exception {
559         int reasonCode = RangingChangeReason.SYSTEM_POLICY;
560         mUwbSessionNotificationManager.onRangingClosedWithApiReasonCode(mUwbSession, reasonCode);
561 
562         verify(mIUwbRangingCallbacks).onRangingClosed(eq(mSessionHandle),
563                 eq(reasonCode),
564                 argThat(p-> p.isEmpty()));
565     }
566 
567     @Test
testOnDataReceived()568     public void testOnDataReceived() throws Exception {
569         mUwbSessionNotificationManager.onDataReceived(mUwbSession, PEER_EXTENDED_UWB_ADDRESS,
570                 PERSISTABLE_BUNDLE, DATA_PAYLOAD);
571 
572         verify(mIUwbRangingCallbacks).onDataReceived(eq(mSessionHandle), eq(
573                         PEER_EXTENDED_UWB_ADDRESS),
574                 eq(PERSISTABLE_BUNDLE), eq(DATA_PAYLOAD));
575     }
576 
577     @Test
testOnDataReceiveFailed()578     public void testOnDataReceiveFailed() throws Exception {
579         mUwbSessionNotificationManager.onDataReceiveFailed(mUwbSession, PEER_EXTENDED_UWB_ADDRESS,
580                 STATUS_CODE_FAILED, PERSISTABLE_BUNDLE);
581 
582         verify(mIUwbRangingCallbacks).onDataReceiveFailed(eq(mSessionHandle), eq(
583                         PEER_EXTENDED_UWB_ADDRESS),
584                 eq(STATUS_CODE_FAILED), eq(PERSISTABLE_BUNDLE));
585     }
586 
587     @Test
testOnDataSent()588     public void testOnDataSent() throws Exception {
589         mUwbSessionNotificationManager.onDataSent(mUwbSession, PEER_EXTENDED_UWB_ADDRESS,
590                 PERSISTABLE_BUNDLE);
591 
592         verify(mIUwbRangingCallbacks).onDataSent(eq(mSessionHandle), eq(PEER_EXTENDED_UWB_ADDRESS),
593                 eq(PERSISTABLE_BUNDLE));
594     }
595 
596     @Test
testOnDataSendFailed()597     public void testOnDataSendFailed() throws Exception {
598         mUwbSessionNotificationManager.onDataSendFailed(mUwbSession, PEER_EXTENDED_UWB_ADDRESS,
599                 STATUS_CODE_FAILED, PERSISTABLE_BUNDLE);
600 
601         verify(mIUwbRangingCallbacks).onDataSendFailed(eq(mSessionHandle), eq(
602                         PEER_EXTENDED_UWB_ADDRESS),
603                 eq(STATUS_CODE_FAILED), eq(PERSISTABLE_BUNDLE));
604     }
605 
606     @Test
testOnRangingRoundsUpdateStatus()607     public void testOnRangingRoundsUpdateStatus() throws RemoteException {
608         PersistableBundle bundle = new PersistableBundle();
609         mUwbSessionNotificationManager.onRangingRoundsUpdateStatus(mUwbSession, bundle);
610 
611         verify(mIUwbRangingCallbacks).onRangingRoundsUpdateDtTagStatus(eq(mSessionHandle),
612                 eq(bundle));
613     }
614 }
615