• 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.google.uwb.support;
18 
19 import static com.google.uwb.support.fira.FiraParams.AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS_INTERLEAVED;
20 import static com.google.uwb.support.fira.FiraParams.AOA_TYPE_AZIMUTH_AND_ELEVATION;
21 import static com.google.uwb.support.fira.FiraParams.BPRF_PHR_DATA_RATE_6M81;
22 import static com.google.uwb.support.fira.FiraParams.MAC_ADDRESS_MODE_8_BYTES;
23 import static com.google.uwb.support.fira.FiraParams.MAC_FCS_TYPE_CRC_32;
24 import static com.google.uwb.support.fira.FiraParams.MEASUREMENT_REPORT_TYPE_INITIATOR_TO_RESPONDER;
25 import static com.google.uwb.support.fira.FiraParams.MULTICAST_LIST_UPDATE_ACTION_DELETE;
26 import static com.google.uwb.support.fira.FiraParams.MULTICAST_LIST_UPDATE_STATUS_ERROR_MULTICAST_LIST_FULL;
27 import static com.google.uwb.support.fira.FiraParams.MULTI_NODE_MODE_MANY_TO_MANY;
28 import static com.google.uwb.support.fira.FiraParams.PREAMBLE_DURATION_T32_SYMBOLS;
29 import static com.google.uwb.support.fira.FiraParams.PRF_MODE_HPRF;
30 import static com.google.uwb.support.fira.FiraParams.PSDU_DATA_RATE_7M80;
31 import static com.google.uwb.support.fira.FiraParams.RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_EDGE_TRIG;
32 import static com.google.uwb.support.fira.FiraParams.RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG;
33 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_ROLE_INITIATOR;
34 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_TYPE_CONTROLEE;
35 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_TYPE_CONTROLLER;
36 import static com.google.uwb.support.fira.FiraParams.RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE;
37 import static com.google.uwb.support.fira.FiraParams.RFRAME_CONFIG_SP1;
38 import static com.google.uwb.support.fira.FiraParams.SESSION_TYPE_RANGING;
39 import static com.google.uwb.support.fira.FiraParams.SFD_ID_VALUE_3;
40 import static com.google.uwb.support.fira.FiraParams.STATE_CHANGE_REASON_CODE_ERROR_INVALID_RANGING_INTERVAL;
41 import static com.google.uwb.support.fira.FiraParams.STATUS_CODE_ERROR_ADDRESS_ALREADY_PRESENT;
42 import static com.google.uwb.support.fira.FiraParams.STS_CONFIG_DYNAMIC_FOR_CONTROLEE_INDIVIDUAL_KEY;
43 import static com.google.uwb.support.fira.FiraParams.STS_LENGTH_128_SYMBOLS;
44 import static com.google.uwb.support.fira.FiraParams.STS_SEGMENT_COUNT_VALUE_2;
45 import static com.google.uwb.support.fira.FiraParams.TX_TIMESTAMP_40_BIT;
46 import static com.google.uwb.support.fira.FiraParams.UL_TDOA_DEVICE_ID_16_BIT;
47 
48 import static org.junit.Assert.assertArrayEquals;
49 import static org.junit.Assert.assertEquals;
50 import static org.junit.Assert.assertTrue;
51 
52 import android.os.PersistableBundle;
53 import android.uwb.UwbAddress;
54 
55 import androidx.test.ext.junit.runners.AndroidJUnit4;
56 import androidx.test.filters.SmallTest;
57 
58 import com.google.uwb.support.base.Params;
59 import com.google.uwb.support.fira.FiraControleeParams;
60 import com.google.uwb.support.fira.FiraMulticastListUpdateStatusCode;
61 import com.google.uwb.support.fira.FiraOpenSessionParams;
62 import com.google.uwb.support.fira.FiraParams;
63 import com.google.uwb.support.fira.FiraProtocolVersion;
64 import com.google.uwb.support.fira.FiraRangingReconfigureParams;
65 import com.google.uwb.support.fira.FiraSpecificationParams;
66 import com.google.uwb.support.fira.FiraStateChangeReasonCode;
67 import com.google.uwb.support.fira.FiraStatusCode;
68 
69 import org.junit.Test;
70 import org.junit.runner.RunWith;
71 
72 import java.util.ArrayList;
73 import java.util.EnumSet;
74 import java.util.List;
75 
76 @SmallTest
77 @RunWith(AndroidJUnit4.class)
78 public class FiraTests {
79     @Test
testOpenSessionParams()80     public void testOpenSessionParams() {
81         FiraProtocolVersion protocolVersion = FiraParams.PROTOCOL_VERSION_1_1;
82         int sessionId = 10;
83         int sessionType = SESSION_TYPE_RANGING;
84         int deviceType = RANGING_DEVICE_TYPE_CONTROLEE;
85         int deviceRole = RANGING_DEVICE_ROLE_INITIATOR;
86         int rangingRoundUsage = RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE;
87         int multiNodeMode = MULTI_NODE_MODE_MANY_TO_MANY;
88         int addressMode = MAC_ADDRESS_MODE_8_BYTES;
89         UwbAddress deviceAddress = UwbAddress.fromBytes(new byte[] {1, 2, 3, 4, 5, 6, 7, 8});
90         UwbAddress destAddress1 = UwbAddress.fromBytes(new byte[] {1, 2, 3, 4, 5, 6, 7, 8});
91         UwbAddress destAddress2 =
92                 UwbAddress.fromBytes(new byte[] {(byte) 0xFF, (byte) 0xFE, 3, 4, 5, 6, 7, 8});
93         List<UwbAddress> destAddressList = new ArrayList<>();
94         destAddressList.add(destAddress1);
95         destAddressList.add(destAddress2);
96         int initiationTime = 100;
97         int slotDurationRstu = 2400;
98         int slotsPerRangingRound = 10;
99         int rangingIntervalMs = 100;
100         int blockStrideLength = 2;
101         int maxRangingRoundRetries = 3;
102         int sessionPriority = 100;
103         boolean hasRangingResultReportMessage = true;
104         boolean hasControlMessage = true;
105         boolean hasRangingControlPhase = false;
106         int measurementReportType = MEASUREMENT_REPORT_TYPE_INITIATOR_TO_RESPONDER;
107         int inBandTerminationAttemptCount = 8;
108         int channelNumber = 10;
109         int preambleCodeIndex = 12;
110         int rframeConfig = RFRAME_CONFIG_SP1;
111         int prfMode = PRF_MODE_HPRF;
112         int preambleDuration = PREAMBLE_DURATION_T32_SYMBOLS;
113         int sfdId = SFD_ID_VALUE_3;
114         int stsSegmentCount = STS_SEGMENT_COUNT_VALUE_2;
115         int stsLength = STS_LENGTH_128_SYMBOLS;
116         byte[] sessionKey = new byte[] {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
117                 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
118         byte[] subsessionKey = new byte[] {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
119                 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
120         int psduDataRate = PSDU_DATA_RATE_7M80;
121         int bprfPhrDataRate = BPRF_PHR_DATA_RATE_6M81;
122         int fcsType = MAC_FCS_TYPE_CRC_32;
123         boolean isTxAdaptivePayloadPowerEnabled = true;
124         int stsConfig = STS_CONFIG_DYNAMIC_FOR_CONTROLEE_INDIVIDUAL_KEY;
125         int subSessionId = 24;
126         byte[] vendorId = new byte[] {(byte) 0xFE, (byte) 0xDC};
127         byte[] staticStsIV = new byte[] {(byte) 0xDF, (byte) 0xCE, (byte) 0xAB, 0x12, 0x34, 0x56};
128         boolean isKeyRotationEnabled = true;
129         int keyRotationRate = 15;
130         int aoaResultRequest = AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS_INTERLEAVED;
131         int rangeDataNtfConfig = RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG;
132         int rangeDataNtfProximityNear = 50;
133         int rangeDataNtfProximityFar = 200;
134         double rangeDataNtfAoaAzimuthLower = -0.5;
135         double rangeDataNtfAoaAzimuthUpper = +1.5;
136         double rangeDataNtfAoaElevationLower = -1.5;
137         double rangeDataNtfAoaElevationUpper = +1.2;
138         boolean hasTimeOfFlightReport = true;
139         boolean hasAngleOfArrivalAzimuthReport = true;
140         boolean hasAngleOfArrivalElevationReport = true;
141         boolean hasAngleOfArrivalFigureOfMeritReport = true;
142         int aoaType = AOA_TYPE_AZIMUTH_AND_ELEVATION;
143         int numOfMsrmtFocusOnRange = 1;
144         int numOfMsrmtFocusOnAoaAzimuth = 2;
145         int numOfMsrmtFocusOnAoaElevation = 3;
146         int ulTdoaTxIntervalMs = 1_000;
147         int ulTdoaRandomWindowMS = 100;
148         int ulTdoaDeviceIdType = UL_TDOA_DEVICE_ID_16_BIT;
149         byte[] ulTdoaDeviceId = new byte[] {(byte) 0x0C, (byte) 0x0B};
150         int ulTdoaTxTimestampType = TX_TIMESTAMP_40_BIT;
151         int maxNumberOfMeasurements = 1;
152 
153         FiraOpenSessionParams params =
154                 new FiraOpenSessionParams.Builder()
155                         .setProtocolVersion(protocolVersion)
156                         .setSessionId(sessionId)
157                         .setSessionType(sessionType)
158                         .setDeviceType(deviceType)
159                         .setDeviceRole(deviceRole)
160                         .setRangingRoundUsage(rangingRoundUsage)
161                         .setMultiNodeMode(multiNodeMode)
162                         .setDeviceAddress(deviceAddress)
163                         .setDestAddressList(destAddressList)
164                         .setInitiationTime(initiationTime)
165                         .setSlotDurationRstu(slotDurationRstu)
166                         .setSlotsPerRangingRound(slotsPerRangingRound)
167                         .setRangingIntervalMs(rangingIntervalMs)
168                         .setBlockStrideLength(blockStrideLength)
169                         .setMaxRangingRoundRetries(maxRangingRoundRetries)
170                         .setSessionPriority(sessionPriority)
171                         .setMacAddressMode(addressMode)
172                         .setHasRangingResultReportMessage(hasRangingResultReportMessage)
173                         .setHasControlMessage(hasControlMessage)
174                         .setHasRangingControlPhase(hasRangingControlPhase)
175                         .setMeasurementReportType(measurementReportType)
176                         .setInBandTerminationAttemptCount(inBandTerminationAttemptCount)
177                         .setChannelNumber(channelNumber)
178                         .setPreambleCodeIndex(preambleCodeIndex)
179                         .setRframeConfig(rframeConfig)
180                         .setPrfMode(prfMode)
181                         .setPreambleDuration(preambleDuration)
182                         .setSfdId(sfdId)
183                         .setStsSegmentCount(stsSegmentCount)
184                         .setStsLength(stsLength)
185                         .setSessionKey(sessionKey)
186                         .setSubsessionKey(subsessionKey)
187                         .setPsduDataRate(psduDataRate)
188                         .setBprfPhrDataRate(bprfPhrDataRate)
189                         .setFcsType(fcsType)
190                         .setIsTxAdaptivePayloadPowerEnabled(isTxAdaptivePayloadPowerEnabled)
191                         .setStsConfig(stsConfig)
192                         .setSubSessionId(subSessionId)
193                         .setVendorId(vendorId)
194                         .setStaticStsIV(staticStsIV)
195                         .setIsKeyRotationEnabled(isKeyRotationEnabled)
196                         .setKeyRotationRate(keyRotationRate)
197                         .setAoaResultRequest(aoaResultRequest)
198                         .setRangeDataNtfConfig(rangeDataNtfConfig)
199                         .setRangeDataNtfProximityNear(rangeDataNtfProximityNear)
200                         .setRangeDataNtfProximityFar(rangeDataNtfProximityFar)
201                         .setRangeDataNtfAoaAzimuthLower(rangeDataNtfAoaAzimuthLower)
202                         .setRangeDataNtfAoaAzimuthUpper(rangeDataNtfAoaAzimuthUpper)
203                         .setRangeDataNtfAoaElevationLower(rangeDataNtfAoaElevationLower)
204                         .setRangeDataNtfAoaElevationUpper(rangeDataNtfAoaElevationUpper)
205                         .setHasTimeOfFlightReport(hasTimeOfFlightReport)
206                         .setHasAngleOfArrivalAzimuthReport(hasAngleOfArrivalAzimuthReport)
207                         .setHasAngleOfArrivalElevationReport(hasAngleOfArrivalElevationReport)
208                         .setHasAngleOfArrivalFigureOfMeritReport(
209                                 hasAngleOfArrivalFigureOfMeritReport)
210                         .setAoaType(aoaType)
211                         .setMeasurementFocusRatio(
212                                 numOfMsrmtFocusOnRange,
213                                 numOfMsrmtFocusOnAoaAzimuth,
214                                 numOfMsrmtFocusOnAoaElevation)
215                         .setUlTdoaTxIntervalMs(ulTdoaTxIntervalMs)
216                         .setUlTdoaRandomWindowMs(ulTdoaRandomWindowMS)
217                         .setUlTdoaDeviceIdType(ulTdoaDeviceIdType)
218                         .setUlTdoaDeviceId(ulTdoaDeviceId)
219                         .setUlTdoaTxTimestampType(ulTdoaTxTimestampType)
220                         .setMaxNumberOfMeasurements(maxNumberOfMeasurements)
221                         .build();
222 
223         assertEquals(params.getProtocolVersion(), protocolVersion);
224         assertEquals(params.getSessionId(), sessionId);
225         assertEquals(params.getSessionType(), sessionType);
226         assertEquals(params.getDeviceType(), deviceType);
227         assertEquals(params.getDeviceRole(), deviceRole);
228         assertEquals(params.getRangingRoundUsage(), rangingRoundUsage);
229         assertEquals(params.getMultiNodeMode(), multiNodeMode);
230         assertEquals(params.getDeviceAddress(), deviceAddress);
231         assertEquals(params.getDestAddressList().size(), destAddressList.size());
232         for (int i = 0; i < destAddressList.size(); i++) {
233             assertEquals(params.getDestAddressList().get(i), destAddressList.get(i));
234         }
235 
236         assertEquals(params.getInitiationTime(), initiationTime);
237         assertEquals(params.getSlotDurationRstu(), slotDurationRstu);
238         assertEquals(params.getSlotsPerRangingRound(), slotsPerRangingRound);
239         assertEquals(params.getRangingIntervalMs(), rangingIntervalMs);
240         assertEquals(params.getBlockStrideLength(), blockStrideLength);
241         assertEquals(params.getMaxRangingRoundRetries(), maxRangingRoundRetries);
242         assertEquals(params.getSessionPriority(), sessionPriority);
243         assertEquals(params.getMacAddressMode(), addressMode);
244         assertEquals(params.hasRangingResultReportMessage(), hasRangingResultReportMessage);
245         assertEquals(params.hasControlMessage(), hasControlMessage);
246         assertEquals(params.hasRangingControlPhase(), hasRangingControlPhase);
247         assertEquals(params.getMeasurementReportType(), measurementReportType);
248         assertEquals(params.getInBandTerminationAttemptCount(), inBandTerminationAttemptCount);
249         assertEquals(params.getChannelNumber(), channelNumber);
250         assertEquals(params.getPreambleCodeIndex(), preambleCodeIndex);
251         assertEquals(params.getRframeConfig(), rframeConfig);
252         assertEquals(params.getPrfMode(), prfMode);
253         assertEquals(params.getPreambleDuration(), preambleDuration);
254         assertEquals(params.getSfdId(), sfdId);
255         assertEquals(params.getStsSegmentCount(), stsSegmentCount);
256         assertEquals(params.getStsLength(), stsLength);
257         assertArrayEquals(params.getSessionKey(), sessionKey);
258         assertArrayEquals(params.getSubsessionKey(), subsessionKey);
259         assertEquals(params.getPsduDataRate(), psduDataRate);
260         assertEquals(params.getBprfPhrDataRate(), bprfPhrDataRate);
261         assertEquals(params.getFcsType(), fcsType);
262         assertEquals(params.isTxAdaptivePayloadPowerEnabled(), isTxAdaptivePayloadPowerEnabled);
263         assertEquals(params.getStsConfig(), stsConfig);
264         assertEquals(params.getSubSessionId(), subSessionId);
265         assertArrayEquals(params.getVendorId(), vendorId);
266         assertArrayEquals(params.getStaticStsIV(), staticStsIV);
267         assertEquals(params.isKeyRotationEnabled(), isKeyRotationEnabled);
268         assertEquals(params.getKeyRotationRate(), keyRotationRate);
269         assertEquals(params.getAoaResultRequest(), aoaResultRequest);
270         assertEquals(params.getRangeDataNtfConfig(), rangeDataNtfConfig);
271         assertEquals(params.getRangeDataNtfProximityNear(), rangeDataNtfProximityNear);
272         assertEquals(params.getRangeDataNtfProximityFar(), rangeDataNtfProximityFar);
273         assertEquals(params.getRangeDataNtfAoaAzimuthLower(), rangeDataNtfAoaAzimuthLower, 0.0d);
274         assertEquals(params.getRangeDataNtfAoaAzimuthUpper(), rangeDataNtfAoaAzimuthUpper, 0.0d);
275         assertEquals(params.getRangeDataNtfAoaElevationLower(), rangeDataNtfAoaElevationLower,
276                 0.0d);
277         assertEquals(params.getRangeDataNtfAoaElevationUpper(), rangeDataNtfAoaElevationUpper,
278                 0.0d);
279         assertEquals(params.hasTimeOfFlightReport(), hasTimeOfFlightReport);
280         assertEquals(params.hasAngleOfArrivalAzimuthReport(), hasAngleOfArrivalAzimuthReport);
281         assertEquals(params.hasAngleOfArrivalElevationReport(), hasAngleOfArrivalElevationReport);
282         assertEquals(
283                 params.hasAngleOfArrivalFigureOfMeritReport(),
284                 hasAngleOfArrivalFigureOfMeritReport);
285         assertEquals(params.getAoaType(), aoaType);
286         assertEquals(params.getNumOfMsrmtFocusOnRange(), numOfMsrmtFocusOnRange);
287         assertEquals(params.getNumOfMsrmtFocusOnAoaAzimuth(), numOfMsrmtFocusOnAoaAzimuth);
288         assertEquals(params.getNumOfMsrmtFocusOnAoaElevation(), numOfMsrmtFocusOnAoaElevation);
289         assertEquals(params.getUlTdoaTxIntervalMs(), ulTdoaTxIntervalMs);
290         assertEquals(params.getUlTdoaRandomWindowMs(), ulTdoaRandomWindowMS);
291         assertEquals(params.getUlTdoaDeviceIdType(), ulTdoaDeviceIdType);
292         assertArrayEquals(params.getUlTdoaDeviceId(), ulTdoaDeviceId);
293         assertEquals(params.getUlTdoaTxTimestampType(), ulTdoaTxTimestampType);
294         assertEquals(params.getMaxNumberOfMeasurements(), maxNumberOfMeasurements);
295 
296         FiraOpenSessionParams fromBundle = FiraOpenSessionParams.fromBundle(params.toBundle());
297 
298         assertEquals(fromBundle.getRangingRoundUsage(), rangingRoundUsage);
299         assertEquals(fromBundle.getMultiNodeMode(), multiNodeMode);
300 
301         assertEquals(fromBundle.getDeviceAddress(), deviceAddress);
302         assertEquals(fromBundle.getDestAddressList().size(), destAddressList.size());
303         for (int i = 0; i < destAddressList.size(); i++) {
304             assertEquals(fromBundle.getDestAddressList().get(i), destAddressList.get(i));
305         }
306 
307         assertEquals(fromBundle.getInitiationTime(), initiationTime);
308         assertEquals(fromBundle.getSlotDurationRstu(), slotDurationRstu);
309         assertEquals(fromBundle.getSlotsPerRangingRound(), slotsPerRangingRound);
310         assertEquals(fromBundle.getRangingIntervalMs(), rangingIntervalMs);
311         assertEquals(fromBundle.getBlockStrideLength(), blockStrideLength);
312         assertEquals(fromBundle.getMaxRangingRoundRetries(), maxRangingRoundRetries);
313         assertEquals(fromBundle.getSessionPriority(), sessionPriority);
314         assertEquals(fromBundle.getMacAddressMode(), addressMode);
315         assertEquals(fromBundle.hasRangingResultReportMessage(), hasRangingResultReportMessage);
316         assertEquals(fromBundle.hasControlMessage(), hasControlMessage);
317         assertEquals(fromBundle.hasRangingControlPhase(), hasRangingControlPhase);
318         assertEquals(fromBundle.getMeasurementReportType(), measurementReportType);
319         assertEquals(fromBundle.getInBandTerminationAttemptCount(), inBandTerminationAttemptCount);
320         assertEquals(fromBundle.getChannelNumber(), channelNumber);
321         assertEquals(fromBundle.getPreambleCodeIndex(), preambleCodeIndex);
322         assertEquals(fromBundle.getRframeConfig(), rframeConfig);
323         assertEquals(fromBundle.getPrfMode(), prfMode);
324         assertEquals(fromBundle.getPreambleDuration(), preambleDuration);
325         assertEquals(fromBundle.getSfdId(), sfdId);
326         assertEquals(fromBundle.getStsSegmentCount(), stsSegmentCount);
327         assertEquals(fromBundle.getStsLength(), stsLength);
328         assertArrayEquals(fromBundle.getSessionKey(), sessionKey);
329         assertArrayEquals(fromBundle.getSubsessionKey(), subsessionKey);
330         assertEquals(fromBundle.getPsduDataRate(), psduDataRate);
331         assertEquals(fromBundle.getBprfPhrDataRate(), bprfPhrDataRate);
332         assertEquals(fromBundle.getFcsType(), fcsType);
333         assertEquals(fromBundle.isTxAdaptivePayloadPowerEnabled(), isTxAdaptivePayloadPowerEnabled);
334         assertEquals(fromBundle.getStsConfig(), stsConfig);
335         assertEquals(fromBundle.getSubSessionId(), subSessionId);
336         assertArrayEquals(fromBundle.getVendorId(), vendorId);
337         assertArrayEquals(fromBundle.getStaticStsIV(), staticStsIV);
338         assertEquals(fromBundle.isKeyRotationEnabled(), isKeyRotationEnabled);
339         assertEquals(fromBundle.getKeyRotationRate(), keyRotationRate);
340         assertEquals(fromBundle.getAoaResultRequest(), aoaResultRequest);
341         assertEquals(fromBundle.getRangeDataNtfConfig(), rangeDataNtfConfig);
342         assertEquals(fromBundle.getRangeDataNtfProximityNear(), rangeDataNtfProximityNear, 0.0d);
343         assertEquals(fromBundle.getRangeDataNtfProximityFar(), rangeDataNtfProximityFar, 0.0d);
344         assertEquals(fromBundle.getRangeDataNtfAoaAzimuthLower(), rangeDataNtfAoaAzimuthLower,
345                 0.0d);
346         assertEquals(fromBundle.getRangeDataNtfAoaAzimuthUpper(), rangeDataNtfAoaAzimuthUpper,
347                 0.0d);
348         assertEquals(fromBundle.getRangeDataNtfAoaElevationLower(), rangeDataNtfAoaElevationLower,
349                 0.0d);
350         assertEquals(fromBundle.getRangeDataNtfAoaElevationUpper(), rangeDataNtfAoaElevationUpper,
351                 0.0d);
352         assertEquals(fromBundle.hasTimeOfFlightReport(), hasTimeOfFlightReport);
353         assertEquals(fromBundle.hasAngleOfArrivalAzimuthReport(), hasAngleOfArrivalAzimuthReport);
354         assertEquals(
355                 fromBundle.hasAngleOfArrivalElevationReport(), hasAngleOfArrivalElevationReport);
356         assertEquals(
357                 fromBundle.hasAngleOfArrivalFigureOfMeritReport(),
358                 hasAngleOfArrivalFigureOfMeritReport);
359         assertEquals(fromBundle.getAoaType(), aoaType);
360         assertEquals(fromBundle.getNumOfMsrmtFocusOnRange(), numOfMsrmtFocusOnRange);
361         assertEquals(fromBundle.getNumOfMsrmtFocusOnAoaAzimuth(), numOfMsrmtFocusOnAoaAzimuth);
362         assertEquals(fromBundle.getNumOfMsrmtFocusOnAoaElevation(), numOfMsrmtFocusOnAoaElevation);
363         assertEquals(fromBundle.getUlTdoaTxIntervalMs(), ulTdoaTxIntervalMs);
364         assertEquals(fromBundle.getUlTdoaRandomWindowMs(), ulTdoaRandomWindowMS);
365         assertEquals(fromBundle.getUlTdoaDeviceIdType(), ulTdoaDeviceIdType);
366         assertArrayEquals(fromBundle.getUlTdoaDeviceId(), ulTdoaDeviceId);
367         assertEquals(fromBundle.getUlTdoaTxTimestampType(), ulTdoaTxTimestampType);
368         assertEquals(fromBundle.getMaxNumberOfMeasurements(), maxNumberOfMeasurements);
369 
370         verifyProtocolPresent(fromBundle);
371         verifyBundlesEqual(params, fromBundle);
372 
373         FiraOpenSessionParams fromCopy = new FiraOpenSessionParams.Builder(params).build();
374 
375         assertEquals(fromCopy.getRangingRoundUsage(), rangingRoundUsage);
376         assertEquals(fromCopy.getMultiNodeMode(), multiNodeMode);
377 
378         assertEquals(fromCopy.getDeviceAddress(), deviceAddress);
379         assertEquals(fromCopy.getDestAddressList().size(), destAddressList.size());
380         for (int i = 0; i < destAddressList.size(); i++) {
381             assertEquals(fromCopy.getDestAddressList().get(i), destAddressList.get(i));
382         }
383 
384         assertEquals(fromCopy.getInitiationTime(), initiationTime);
385         assertEquals(fromCopy.getSlotDurationRstu(), slotDurationRstu);
386         assertEquals(fromCopy.getSlotsPerRangingRound(), slotsPerRangingRound);
387         assertEquals(fromCopy.getRangingIntervalMs(), rangingIntervalMs);
388         assertEquals(fromCopy.getBlockStrideLength(), blockStrideLength);
389         assertEquals(fromCopy.getMaxRangingRoundRetries(), maxRangingRoundRetries);
390         assertEquals(fromCopy.getSessionPriority(), sessionPriority);
391         assertEquals(fromCopy.getMacAddressMode(), addressMode);
392         assertEquals(fromCopy.hasRangingResultReportMessage(), hasRangingResultReportMessage);
393         assertEquals(fromCopy.hasControlMessage(), hasControlMessage);
394         assertEquals(fromCopy.hasRangingControlPhase(), hasRangingControlPhase);
395         assertEquals(fromCopy.getMeasurementReportType(), measurementReportType);
396         assertEquals(fromCopy.getInBandTerminationAttemptCount(), inBandTerminationAttemptCount);
397         assertEquals(fromCopy.getChannelNumber(), channelNumber);
398         assertEquals(fromCopy.getPreambleCodeIndex(), preambleCodeIndex);
399         assertEquals(fromCopy.getRframeConfig(), rframeConfig);
400         assertEquals(fromCopy.getPrfMode(), prfMode);
401         assertEquals(fromCopy.getPreambleDuration(), preambleDuration);
402         assertEquals(fromCopy.getSfdId(), sfdId);
403         assertEquals(fromCopy.getStsSegmentCount(), stsSegmentCount);
404         assertEquals(fromCopy.getStsLength(), stsLength);
405         assertArrayEquals(fromCopy.getSessionKey(), sessionKey);
406         assertArrayEquals(fromCopy.getSubsessionKey(), subsessionKey);
407         assertEquals(fromCopy.getPsduDataRate(), psduDataRate);
408         assertEquals(fromCopy.getBprfPhrDataRate(), bprfPhrDataRate);
409         assertEquals(fromCopy.getFcsType(), fcsType);
410         assertEquals(fromCopy.isTxAdaptivePayloadPowerEnabled(), isTxAdaptivePayloadPowerEnabled);
411         assertEquals(fromCopy.getStsConfig(), stsConfig);
412         assertEquals(fromCopy.getSubSessionId(), subSessionId);
413         assertArrayEquals(fromCopy.getVendorId(), vendorId);
414         assertArrayEquals(fromCopy.getStaticStsIV(), staticStsIV);
415         assertEquals(fromCopy.isKeyRotationEnabled(), isKeyRotationEnabled);
416         assertEquals(fromCopy.getKeyRotationRate(), keyRotationRate);
417         assertEquals(fromCopy.getAoaResultRequest(), aoaResultRequest);
418         assertEquals(fromCopy.getRangeDataNtfConfig(), rangeDataNtfConfig);
419         assertEquals(fromCopy.getRangeDataNtfProximityNear(), rangeDataNtfProximityNear, 0.0d);
420         assertEquals(fromCopy.getRangeDataNtfProximityFar(), rangeDataNtfProximityFar, 0.0d);
421         assertEquals(fromCopy.getRangeDataNtfAoaAzimuthLower(), rangeDataNtfAoaAzimuthLower,
422                 0.0d);
423         assertEquals(fromCopy.getRangeDataNtfAoaAzimuthUpper(), rangeDataNtfAoaAzimuthUpper,
424                 0.0d);
425         assertEquals(fromCopy.getRangeDataNtfAoaElevationLower(), rangeDataNtfAoaElevationLower,
426                 0.0d);
427         assertEquals(fromCopy.getRangeDataNtfAoaElevationUpper(), rangeDataNtfAoaElevationUpper,
428                 0.0d);
429         assertEquals(fromCopy.hasTimeOfFlightReport(), hasTimeOfFlightReport);
430         assertEquals(fromCopy.hasAngleOfArrivalAzimuthReport(), hasAngleOfArrivalAzimuthReport);
431         assertEquals(
432                 fromCopy.hasAngleOfArrivalElevationReport(), hasAngleOfArrivalElevationReport);
433         assertEquals(
434                 fromCopy.hasAngleOfArrivalFigureOfMeritReport(),
435                 hasAngleOfArrivalFigureOfMeritReport);
436         assertEquals(fromCopy.getAoaType(), aoaType);
437         assertEquals(fromCopy.getNumOfMsrmtFocusOnRange(), numOfMsrmtFocusOnRange);
438         assertEquals(fromCopy.getNumOfMsrmtFocusOnAoaAzimuth(), numOfMsrmtFocusOnAoaAzimuth);
439         assertEquals(fromCopy.getNumOfMsrmtFocusOnAoaElevation(), numOfMsrmtFocusOnAoaElevation);
440         assertEquals(fromCopy.getUlTdoaTxIntervalMs(), ulTdoaTxIntervalMs);
441         assertEquals(fromCopy.getUlTdoaRandomWindowMs(), ulTdoaRandomWindowMS);
442         assertEquals(fromCopy.getUlTdoaDeviceIdType(), ulTdoaDeviceIdType);
443         assertArrayEquals(fromCopy.getUlTdoaDeviceId(), ulTdoaDeviceId);
444         assertEquals(fromCopy.getUlTdoaTxTimestampType(), ulTdoaTxTimestampType);
445         assertEquals(fromCopy.getMaxNumberOfMeasurements(), maxNumberOfMeasurements);
446 
447         verifyProtocolPresent(fromCopy);
448         verifyBundlesEqual(params, fromCopy);
449     }
450 
451     @Test
testRangingReconfigureParams()452     public void testRangingReconfigureParams() {
453         int action = MULTICAST_LIST_UPDATE_ACTION_DELETE;
454         UwbAddress uwbAddress1 = UwbAddress.fromBytes(new byte[] {1, 2});
455         UwbAddress uwbAddress2 = UwbAddress.fromBytes(new byte[] {4, 5});
456         UwbAddress[] addressList = new UwbAddress[] {uwbAddress1, uwbAddress2};
457         int blockStrideLength = 5;
458         int rangeDataNtfConfig = RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_EDGE_TRIG;
459         int rangeDataProximityNear = 100;
460         int rangeDataProximityFar = 500;
461         double rangeDataAoaAzimuthLower = -0.5;
462         double rangeDataAoaAzimuthUpper = +1.5;
463         double rangeDataAoaElevationLower = -1.5;
464         double rangeDataAoaElevationUpper = +1.2;
465 
466         int[] subSessionIdList = new int[] {3, 4};
467         FiraRangingReconfigureParams params =
468                 new FiraRangingReconfigureParams.Builder()
469                         .setAction(action)
470                         .setAddressList(addressList)
471                         .setSubSessionIdList(subSessionIdList)
472                         .build();
473 
474         assertEquals((int) params.getAction(), action);
475         assertArrayEquals(params.getAddressList(), addressList);
476         assertArrayEquals(params.getSubSessionIdList(), subSessionIdList);
477         FiraRangingReconfigureParams fromBundle =
478                 FiraRangingReconfigureParams.fromBundle(params.toBundle());
479         assertEquals((int) fromBundle.getAction(), action);
480         assertArrayEquals(fromBundle.getAddressList(), addressList);
481         assertArrayEquals(fromBundle.getSubSessionIdList(), subSessionIdList);
482         verifyProtocolPresent(params);
483         verifyBundlesEqual(params, fromBundle);
484 
485         params =
486                 new FiraRangingReconfigureParams.Builder()
487                         .setBlockStrideLength(blockStrideLength)
488                         .setRangeDataNtfConfig(rangeDataNtfConfig)
489                         .setRangeDataProximityNear(rangeDataProximityNear)
490                         .setRangeDataProximityFar(rangeDataProximityFar)
491                         .setRangeDataAoaAzimuthLower(rangeDataAoaAzimuthLower)
492                         .setRangeDataAoaAzimuthUpper(rangeDataAoaAzimuthUpper)
493                         .setRangeDataAoaElevationLower(rangeDataAoaElevationLower)
494                         .setRangeDataAoaElevationUpper(rangeDataAoaElevationUpper)
495                         .build();
496         assertEquals((int) params.getBlockStrideLength(), blockStrideLength);
497         assertEquals((int) params.getRangeDataNtfConfig(), rangeDataNtfConfig);
498         assertEquals((int) params.getRangeDataProximityNear(), rangeDataProximityNear);
499         assertEquals((int) params.getRangeDataProximityFar(), rangeDataProximityFar);
500         assertEquals((double) params.getRangeDataAoaAzimuthLower(), rangeDataAoaAzimuthLower,
501                 0.0d);
502         assertEquals((double) params.getRangeDataAoaAzimuthUpper(), rangeDataAoaAzimuthUpper,
503                 0.0d);
504         assertEquals((double) params.getRangeDataAoaElevationLower(), rangeDataAoaElevationLower,
505                 0.0d);
506         assertEquals((double) params.getRangeDataAoaElevationUpper(), rangeDataAoaElevationUpper,
507                 0.0d);
508 
509         fromBundle = FiraRangingReconfigureParams.fromBundle(params.toBundle());
510         assertEquals((int) fromBundle.getBlockStrideLength(), blockStrideLength);
511         assertEquals((int) fromBundle.getRangeDataNtfConfig(), rangeDataNtfConfig);
512         assertEquals((int) fromBundle.getRangeDataProximityNear(), rangeDataProximityNear);
513         assertEquals((int) fromBundle.getRangeDataProximityFar(), rangeDataProximityFar);
514         assertEquals((double) fromBundle.getRangeDataAoaAzimuthLower(), rangeDataAoaAzimuthLower,
515                 0.0d);
516         assertEquals((double) fromBundle.getRangeDataAoaAzimuthUpper(), rangeDataAoaAzimuthUpper,
517                 0.0d);
518         assertEquals((double) fromBundle.getRangeDataAoaElevationLower(),
519                 rangeDataAoaElevationLower, 0.0d);
520         assertEquals((double) fromBundle.getRangeDataAoaElevationUpper(),
521                 rangeDataAoaElevationUpper, 0.0d);
522 
523         verifyProtocolPresent(params);
524         verifyBundlesEqual(params, fromBundle);
525     }
526 
527     @Test
testControleeParams()528     public void testControleeParams() {
529         UwbAddress uwbAddress1 = UwbAddress.fromBytes(new byte[] {1, 2});
530         UwbAddress uwbAddress2 = UwbAddress.fromBytes(new byte[] {4, 5});
531         UwbAddress[] addressList = new UwbAddress[] {uwbAddress1, uwbAddress2};
532         int[] subSessionIdList = new int[] {3, 4};
533         FiraControleeParams params =
534                 new FiraControleeParams.Builder()
535                         .setAddressList(addressList)
536                         .setSubSessionIdList(subSessionIdList)
537                         .build();
538 
539         assertArrayEquals(params.getAddressList(), addressList);
540         assertArrayEquals(params.getSubSessionIdList(), subSessionIdList);
541         FiraControleeParams fromBundle =
542                 FiraControleeParams.fromBundle(params.toBundle());
543         assertArrayEquals(fromBundle.getAddressList(), addressList);
544         assertArrayEquals(fromBundle.getSubSessionIdList(), subSessionIdList);
545         verifyProtocolPresent(params);
546         verifyBundlesEqual(params, fromBundle);
547     }
548 
549     @Test
testStatusCode()550     public void testStatusCode() {
551         int statusCode = STATUS_CODE_ERROR_ADDRESS_ALREADY_PRESENT;
552         FiraStatusCode params = new FiraStatusCode.Builder().setStatusCode(statusCode).build();
553         assertEquals(params.getStatusCode(), statusCode);
554         assertTrue(FiraStatusCode.isBundleValid(params.toBundle()));
555         FiraStatusCode fromBundle = FiraStatusCode.fromBundle(params.toBundle());
556         assertEquals(fromBundle.getStatusCode(), statusCode);
557 
558         verifyProtocolPresent(params);
559         verifyBundlesEqual(params, fromBundle);
560     }
561 
562     @Test
testMulticastListUpdateStatusCode()563     public void testMulticastListUpdateStatusCode() {
564         int statusCode = MULTICAST_LIST_UPDATE_STATUS_ERROR_MULTICAST_LIST_FULL;
565         FiraMulticastListUpdateStatusCode params =
566                 new FiraMulticastListUpdateStatusCode.Builder().setStatusCode(statusCode).build();
567         assertEquals(params.getStatusCode(), statusCode);
568         assertTrue(FiraMulticastListUpdateStatusCode.isBundleValid(params.toBundle()));
569 
570         FiraMulticastListUpdateStatusCode fromBundle =
571                 FiraMulticastListUpdateStatusCode.fromBundle(params.toBundle());
572         assertEquals(fromBundle.getStatusCode(), statusCode);
573 
574         verifyProtocolPresent(params);
575         verifyBundlesEqual(params, fromBundle);
576     }
577 
578     @Test
testStateChangeReasonCode()579     public void testStateChangeReasonCode() {
580         int reasonCode = STATE_CHANGE_REASON_CODE_ERROR_INVALID_RANGING_INTERVAL;
581         FiraStateChangeReasonCode params =
582                 new FiraStateChangeReasonCode.Builder().setReasonCode(reasonCode).build();
583         assertEquals(reasonCode, params.getReasonCode());
584         assertTrue(FiraStateChangeReasonCode.isBundleValid(params.toBundle()));
585 
586         FiraStateChangeReasonCode fromBundle =
587                 FiraStateChangeReasonCode.fromBundle(params.toBundle());
588         assertEquals(reasonCode, fromBundle.getReasonCode());
589 
590         verifyProtocolPresent(params);
591         verifyBundlesEqual(params, fromBundle);
592     }
593 
verifyProtocolPresent(Params params)594     private void verifyProtocolPresent(Params params) {
595         assertTrue(Params.isProtocol(params.toBundle(), FiraParams.PROTOCOL_NAME));
596     }
597 
verifyBundlesEqual(Params params, Params fromBundle)598     private void verifyBundlesEqual(Params params, Params fromBundle) {
599         PersistableBundle.kindofEquals(params.toBundle(), fromBundle.toBundle());
600     }
601 
602     @Test
testSpecificationParams()603     public void testSpecificationParams() {
604         FiraProtocolVersion minPhyVersionSupported = new FiraProtocolVersion(1, 0);
605         FiraProtocolVersion maxPhyVersionSupported = new FiraProtocolVersion(2, 0);
606         FiraProtocolVersion minMacVersionSupported = new FiraProtocolVersion(1, 2);
607         FiraProtocolVersion maxMacVersionSupported = new FiraProtocolVersion(1, 2);
608         List<Integer> supportedChannels = List.of(5, 6, 8, 9);
609         EnumSet<FiraParams.AoaCapabilityFlag> aoaCapabilities =
610                 EnumSet.of(FiraParams.AoaCapabilityFlag.HAS_ELEVATION_SUPPORT);
611 
612         EnumSet<FiraParams.DeviceRoleCapabilityFlag> deviceRoleCapabilities =
613                 EnumSet.allOf(FiraParams.DeviceRoleCapabilityFlag.class);
614         boolean hasBlockStridingSupport = true;
615         boolean hasNonDeferredModeSupport = true;
616         boolean hasInitiationTimeSupport = true;
617         boolean hasRssiReportingSupport = true;
618         boolean hasDiagnosticsSupport = true;
619         EnumSet<FiraParams.MultiNodeCapabilityFlag> multiNodeCapabilities =
620                 EnumSet.allOf(FiraParams.MultiNodeCapabilityFlag.class);
621         EnumSet<FiraParams.PrfCapabilityFlag> prfCapabilities =
622                 EnumSet.allOf(FiraParams.PrfCapabilityFlag.class);
623         EnumSet<FiraParams.RangingRoundCapabilityFlag> rangingRoundCapabilities =
624                 EnumSet.allOf(FiraParams.RangingRoundCapabilityFlag.class);
625         EnumSet<FiraParams.RframeCapabilityFlag> rframeCapabilities =
626                 EnumSet.allOf(FiraParams.RframeCapabilityFlag.class);
627         EnumSet<FiraParams.StsCapabilityFlag> stsCapabilities =
628                 EnumSet.allOf(FiraParams.StsCapabilityFlag.class);
629         EnumSet<FiraParams.PsduDataRateCapabilityFlag> psduDataRateCapabilities =
630                 EnumSet.allOf(FiraParams.PsduDataRateCapabilityFlag.class);
631         EnumSet<FiraParams.BprfParameterSetCapabilityFlag> bprfCapabilities =
632                 EnumSet.allOf(FiraParams.BprfParameterSetCapabilityFlag.class);
633         EnumSet<FiraParams.HprfParameterSetCapabilityFlag> hprfCapabilities =
634                 EnumSet.allOf(FiraParams.HprfParameterSetCapabilityFlag.class);
635         EnumSet<FiraParams.RangeDataNtfConfigCapabilityFlag> rangeDataNtfConfigCapabilities =
636                 EnumSet.allOf(FiraParams.RangeDataNtfConfigCapabilityFlag.class);
637         int deviceType = RANGING_DEVICE_TYPE_CONTROLLER;
638         boolean suspendRangingSupport = true;
639         int sessionKeyLength = 1;
640         boolean hasBackgroundSupport = true;
641 
642         FiraSpecificationParams params =
643                 new FiraSpecificationParams.Builder()
644                         .setMinPhyVersionSupported(minPhyVersionSupported)
645                         .setMaxPhyVersionSupported(maxPhyVersionSupported)
646                         .setMinMacVersionSupported(minMacVersionSupported)
647                         .setMaxMacVersionSupported(maxMacVersionSupported)
648                         .setSupportedChannels(supportedChannels)
649                         .setAoaCapabilities(aoaCapabilities)
650                         .setDeviceRoleCapabilities(deviceRoleCapabilities)
651                         .hasBlockStridingSupport(hasBlockStridingSupport)
652                         .hasNonDeferredModeSupport(hasNonDeferredModeSupport)
653                         .hasInitiationTimeSupport(hasInitiationTimeSupport)
654                         .hasRssiReportingSupport(hasRssiReportingSupport)
655                         .hasDiagnosticsSupport(hasDiagnosticsSupport)
656                         .setMultiNodeCapabilities(multiNodeCapabilities)
657                         .setPrfCapabilities(prfCapabilities)
658                         .setRangingRoundCapabilities(rangingRoundCapabilities)
659                         .setRframeCapabilities(rframeCapabilities)
660                         .setStsCapabilities(stsCapabilities)
661                         .setPsduDataRateCapabilities(psduDataRateCapabilities)
662                         .setBprfParameterSetCapabilities(bprfCapabilities)
663                         .setHprfParameterSetCapabilities(hprfCapabilities)
664                         .setRangeDataNtfConfigCapabilities(rangeDataNtfConfigCapabilities)
665                         .setDeviceType(deviceType)
666                         .setSuspendRangingSupport(suspendRangingSupport)
667                         .setSessionKeyLength(sessionKeyLength)
668                         .setBackgroundRangingSupport(false)
669                         .build();
670         assertEquals(minPhyVersionSupported, params.getMinPhyVersionSupported());
671         assertEquals(maxPhyVersionSupported, params.getMaxPhyVersionSupported());
672         assertEquals(minMacVersionSupported, params.getMinMacVersionSupported());
673         assertEquals(maxMacVersionSupported, params.getMaxMacVersionSupported());
674         assertEquals(supportedChannels, params.getSupportedChannels());
675         assertEquals(aoaCapabilities, params.getAoaCapabilities());
676         assertEquals(deviceRoleCapabilities, params.getDeviceRoleCapabilities());
677         assertEquals(hasBlockStridingSupport, params.hasBlockStridingSupport());
678         assertEquals(hasNonDeferredModeSupport, params.hasNonDeferredModeSupport());
679         assertEquals(hasInitiationTimeSupport, params.hasInitiationTimeSupport());
680         assertEquals(hasRssiReportingSupport, params.hasRssiReportingSupport());
681         assertEquals(hasDiagnosticsSupport, params.hasDiagnosticsSupport());
682         assertEquals(multiNodeCapabilities, params.getMultiNodeCapabilities());
683         assertEquals(prfCapabilities, params.getPrfCapabilities());
684         assertEquals(rangingRoundCapabilities, params.getRangingRoundCapabilities());
685         assertEquals(rframeCapabilities, params.getRframeCapabilities());
686         assertEquals(stsCapabilities, params.getStsCapabilities());
687         assertEquals(psduDataRateCapabilities, params.getPsduDataRateCapabilities());
688         assertEquals(bprfCapabilities, params.getBprfParameterSetCapabilities());
689         assertEquals(hprfCapabilities, params.getHprfParameterSetCapabilities());
690         assertEquals(rangeDataNtfConfigCapabilities, params.getRangeDataNtfConfigCapabilities());
691         assertEquals(deviceType, params.getDeviceType());
692         assertEquals(suspendRangingSupport, params.hasSuspendRangingSupport());
693         assertEquals(sessionKeyLength, params.getSessionKeyLength());
694         assertEquals(false, params.hasBackgroundRangingSupport());
695 
696         FiraSpecificationParams fromBundle = FiraSpecificationParams.fromBundle(params.toBundle());
697         assertEquals(minPhyVersionSupported, fromBundle.getMinPhyVersionSupported());
698         assertEquals(maxPhyVersionSupported, fromBundle.getMaxPhyVersionSupported());
699         assertEquals(minMacVersionSupported, fromBundle.getMinMacVersionSupported());
700         assertEquals(maxMacVersionSupported, fromBundle.getMaxMacVersionSupported());
701         assertEquals(supportedChannels, fromBundle.getSupportedChannels());
702         assertEquals(aoaCapabilities, fromBundle.getAoaCapabilities());
703         assertEquals(deviceRoleCapabilities, fromBundle.getDeviceRoleCapabilities());
704         assertEquals(hasBlockStridingSupport, fromBundle.hasBlockStridingSupport());
705         assertEquals(hasNonDeferredModeSupport, fromBundle.hasNonDeferredModeSupport());
706         assertEquals(hasInitiationTimeSupport, params.hasInitiationTimeSupport());
707         assertEquals(multiNodeCapabilities, fromBundle.getMultiNodeCapabilities());
708         assertEquals(prfCapabilities, fromBundle.getPrfCapabilities());
709         assertEquals(rangingRoundCapabilities, fromBundle.getRangingRoundCapabilities());
710         assertEquals(rframeCapabilities, fromBundle.getRframeCapabilities());
711         assertEquals(stsCapabilities, fromBundle.getStsCapabilities());
712         assertEquals(psduDataRateCapabilities, fromBundle.getPsduDataRateCapabilities());
713         assertEquals(bprfCapabilities, fromBundle.getBprfParameterSetCapabilities());
714         assertEquals(hprfCapabilities, fromBundle.getHprfParameterSetCapabilities());
715         assertEquals(rangeDataNtfConfigCapabilities,
716                 fromBundle.getRangeDataNtfConfigCapabilities());
717         assertEquals(deviceType, fromBundle.getDeviceType());
718         assertEquals(suspendRangingSupport, fromBundle.hasSuspendRangingSupport());
719         assertEquals(sessionKeyLength, fromBundle.getSessionKeyLength());
720         assertEquals(false, fromBundle.hasBackgroundRangingSupport());
721         verifyProtocolPresent(params);
722         verifyBundlesEqual(params, fromBundle);
723 
724         FiraSpecificationParams fromCopy = new FiraSpecificationParams.Builder(params)
725                 .setBackgroundRangingSupport(hasBackgroundSupport)
726                 .build();
727 
728         assertEquals(minPhyVersionSupported, fromCopy.getMinPhyVersionSupported());
729         assertEquals(maxPhyVersionSupported, fromCopy.getMaxPhyVersionSupported());
730         assertEquals(minMacVersionSupported, fromCopy.getMinMacVersionSupported());
731         assertEquals(maxMacVersionSupported, fromCopy.getMaxMacVersionSupported());
732         assertEquals(supportedChannels, fromCopy.getSupportedChannels());
733         assertEquals(aoaCapabilities, fromCopy.getAoaCapabilities());
734         assertEquals(deviceRoleCapabilities, fromCopy.getDeviceRoleCapabilities());
735         assertEquals(hasBlockStridingSupport, fromCopy.hasBlockStridingSupport());
736         assertEquals(hasNonDeferredModeSupport, fromCopy.hasNonDeferredModeSupport());
737         assertEquals(hasInitiationTimeSupport, params.hasInitiationTimeSupport());
738         assertEquals(multiNodeCapabilities, fromCopy.getMultiNodeCapabilities());
739         assertEquals(prfCapabilities, fromCopy.getPrfCapabilities());
740         assertEquals(rangingRoundCapabilities, fromCopy.getRangingRoundCapabilities());
741         assertEquals(rframeCapabilities, fromCopy.getRframeCapabilities());
742         assertEquals(stsCapabilities, fromCopy.getStsCapabilities());
743         assertEquals(psduDataRateCapabilities, fromCopy.getPsduDataRateCapabilities());
744         assertEquals(bprfCapabilities, fromCopy.getBprfParameterSetCapabilities());
745         assertEquals(hprfCapabilities, fromCopy.getHprfParameterSetCapabilities());
746         assertEquals(rangeDataNtfConfigCapabilities,
747                 fromCopy.getRangeDataNtfConfigCapabilities());
748         assertEquals(deviceType, fromCopy.getDeviceType());
749         assertEquals(suspendRangingSupport, fromCopy.hasSuspendRangingSupport());
750         assertEquals(sessionKeyLength, fromCopy.getSessionKeyLength());
751         assertEquals(hasBackgroundSupport, fromCopy.hasBackgroundRangingSupport());
752         verifyProtocolPresent(params);
753         verifyBundlesEqual(params, fromCopy);
754     }
755 
756     @Test
testSpecificationParams_whenNoChannelsSet()757     public void testSpecificationParams_whenNoChannelsSet() {
758         FiraSpecificationParams params =
759                 new FiraSpecificationParams.Builder()
760                         .build();
761         assertEquals(List.of(), params.getSupportedChannels());
762 
763         FiraSpecificationParams fromBundle = FiraSpecificationParams.fromBundle(params.toBundle());
764         assertEquals(List.of(), fromBundle.getSupportedChannels());
765     }
766 
767     @Test
testFiraProtocolVersion()768     public void testFiraProtocolVersion() {
769         FiraProtocolVersion firaVersion = new FiraProtocolVersion(1, 2);
770         assertEquals(1, firaVersion.getMajor());
771         assertEquals(2, firaVersion.getMinor());
772 
773         firaVersion = FiraProtocolVersion.fromString("1.3");
774         assertEquals(1, firaVersion.getMajor());
775         assertEquals(3, firaVersion.getMinor());
776 
777         firaVersion = FiraProtocolVersion.fromBytes(new byte[]{0x1, 0x4}, 0);
778         assertEquals(1, firaVersion.getMajor());
779         assertEquals(4, firaVersion.getMinor());
780 
781         firaVersion = FiraProtocolVersion.fromLEShort((short) 0x1002);
782         assertEquals(2, firaVersion.getMajor());
783         assertEquals(1, firaVersion.getMinor());
784     }
785 }
786