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 com.android.server.uwb; 18 19 import static android.uwb.RangingMeasurement.RANGING_STATUS_SUCCESS; 20 21 import static com.google.common.truth.Truth.assertThat; 22 23 import static org.mockito.Mockito.mock; 24 import static org.mockito.Mockito.when; 25 26 import android.uwb.AngleMeasurement; 27 import android.uwb.AngleOfArrivalMeasurement; 28 import android.uwb.DistanceMeasurement; 29 import android.uwb.RangingMeasurement; 30 import android.uwb.UwbAddress; 31 32 import com.android.uwb.fusion.UwbFilterEngine; 33 34 import org.junit.After; 35 import org.junit.Before; 36 import org.junit.Test; 37 import org.mockito.Mock; 38 39 public class UwbControleeTest { 40 public static final UwbAddress UWB_ADDRESS = UwbAddress.fromBytes(new byte[] {1, 2}); 41 UwbControlee mControlee; 42 @Mock 43 UwbInjector mUwbInjector; 44 45 @Before setUp()46 public void setUp() { 47 UwbFilterEngine.Builder builder = new UwbFilterEngine.Builder(); 48 UwbFilterEngine engine = builder.build(); 49 mUwbInjector = mock(UwbInjector.class); 50 when(mUwbInjector.getElapsedSinceBootMillis()).thenReturn(10L); 51 mControlee = new UwbControlee( 52 UWB_ADDRESS, 53 engine, 54 mUwbInjector); 55 } 56 57 @After shutdown()58 public void shutdown() throws Exception { 59 mControlee.close(); 60 } 61 62 @Test testGetUwbAddress()63 public void testGetUwbAddress() { 64 assertThat(mControlee.getUwbAddress()).isEqualTo(UWB_ADDRESS); 65 } 66 67 @Test testFilterMeasurement()68 public void testFilterMeasurement() { 69 final double testRads = 0.1; 70 final double testDist = 2; 71 AngleMeasurement am = new AngleMeasurement(testRads, 0.0, 1.0); 72 AngleOfArrivalMeasurement aoam = new AngleOfArrivalMeasurement.Builder(am).build(); 73 DistanceMeasurement dm = new DistanceMeasurement.Builder() 74 .setMeters(testDist) 75 .setErrorMeters(0.0) 76 .setConfidenceLevel(1.0) 77 .build(); 78 79 RangingMeasurement.Builder rm = new RangingMeasurement.Builder() 80 .setDistanceMeasurement(dm) 81 .setAngleOfArrivalMeasurement(aoam) 82 .setStatus(RANGING_STATUS_SUCCESS) 83 .setRemoteDeviceAddress(UWB_ADDRESS) 84 .setElapsedRealtimeNanos(100); 85 86 // Filtering a single measurement value should just yield that same value. 87 mControlee.filterMeasurement(rm); 88 89 RangingMeasurement newMeasure = rm.build(); 90 assertThat(newMeasure.getAngleOfArrivalMeasurement().getAzimuth().getRadians()) 91 .isWithin(0.001).of(testRads); 92 } 93 94 @Test testNonAoaMeasurement()95 public void testNonAoaMeasurement() { 96 final double testDist = 2; 97 DistanceMeasurement dm = new DistanceMeasurement.Builder() 98 .setMeters(testDist) 99 .setErrorMeters(0.0) 100 .setConfidenceLevel(1.0) 101 .build(); 102 103 RangingMeasurement.Builder rm = new RangingMeasurement.Builder() 104 .setDistanceMeasurement(dm) 105 .setStatus(RANGING_STATUS_SUCCESS) 106 .setRemoteDeviceAddress(UWB_ADDRESS) 107 .setElapsedRealtimeNanos(100); 108 109 // Filtering a single measurement value should just yield that same value. 110 mControlee.filterMeasurement(rm); 111 112 RangingMeasurement newMeasure = rm.build(); 113 assertThat(newMeasure.getAngleOfArrivalMeasurement()).isNull(); 114 } 115 } 116