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