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.params;
18 
19 
20 import static com.google.common.truth.Truth.assertThat;
21 import static com.google.uwb.support.fira.FiraParams.CONTENTION_BASED_RANGING;
22 import static com.google.uwb.support.fira.FiraParams.MULTI_NODE_MODE_ONE_TO_MANY;
23 import static com.google.uwb.support.fira.FiraParams.MULTI_NODE_MODE_UNICAST;
24 import static com.google.uwb.support.fira.FiraParams.PROTOCOL_VERSION_1_1;
25 import static com.google.uwb.support.fira.FiraParams.PROTOCOL_VERSION_2_0;
26 import static com.google.uwb.support.fira.FiraParams.RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG;
27 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_DT_TAG;
28 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_ROLE_INITIATOR;
29 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_ROLE_RESPONDER;
30 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_TYPE_CONTROLEE;
31 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_TYPE_CONTROLLER;
32 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_TYPE_DT_TAG;
33 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_UT_TAG;
34 import static com.google.uwb.support.fira.FiraParams.RANGING_ROUND_USAGE_DL_TDOA;
35 import static com.google.uwb.support.fira.FiraParams.RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE;
36 import static com.google.uwb.support.fira.FiraParams.RANGING_ROUND_USAGE_UL_TDOA;
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.STS_CONFIG_DYNAMIC_FOR_CONTROLEE_INDIVIDUAL_KEY;
40 import static com.google.uwb.support.fira.FiraParams.STS_CONFIG_PROVISIONED;
41 import static com.google.uwb.support.fira.FiraParams.STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY;
42 import static com.google.uwb.support.fira.FiraParams.STS_CONFIG_STATIC;
43 import static com.google.uwb.support.fira.FiraParams.TX_TIMESTAMP_40_BIT;
44 import static com.google.uwb.support.fira.FiraParams.UL_TDOA_DEVICE_ID_16_BIT;
45 
46 import static org.junit.Assume.assumeTrue;
47 import static org.mockito.Mockito.mock;
48 import static org.mockito.Mockito.when;
49 
50 import android.platform.test.annotations.Presubmit;
51 import android.uwb.UwbAddress;
52 
53 import androidx.test.filters.SmallTest;
54 import androidx.test.runner.AndroidJUnit4;
55 
56 import com.android.modules.utils.build.SdkLevel;
57 import com.android.server.uwb.DeviceConfigFacade;
58 import com.android.server.uwb.UwbInjector;
59 import com.android.server.uwb.util.UwbUtil;
60 import com.android.uwb.flags.FeatureFlags;
61 
62 import com.google.uwb.support.fira.FiraOpenSessionParams;
63 import com.google.uwb.support.fira.FiraParams;
64 import com.google.uwb.support.fira.FiraProtocolVersion;
65 import com.google.uwb.support.fira.FiraRangingReconfigureParams;
66 
67 import org.junit.Before;
68 import org.junit.Test;
69 import org.junit.runner.RunWith;
70 import org.mockito.Mock;
71 import org.mockito.MockitoAnnotations;
72 
73 import java.util.Arrays;
74 
75 /**
76  * Unit tests for {@link com.android.server.uwb.params.FiraEncoder}.
77  */
78 @RunWith(AndroidJUnit4.class)
79 @SmallTest
80 @Presubmit
81 public class FiraEncoderTest {
82     private static final FiraProtocolVersion PROTOCOL_VERSION_DUMMY = new FiraProtocolVersion(0, 0);
83     private static final FiraOpenSessionParams.Builder TEST_FIRA_OPEN_SESSION_COMMON_PARAMS =
84             new FiraOpenSessionParams.Builder()
85                     .setProtocolVersion(FiraParams.PROTOCOL_VERSION_1_1) // Required Parameter
86                     .setSessionId(1)
87                     .setSessionType(SESSION_TYPE_RANGING)
88                     .setRangeDataNtfConfig(RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG)
89                     .setDeviceType(RANGING_DEVICE_TYPE_CONTROLLER)
90                     .setDeviceRole(RANGING_DEVICE_ROLE_RESPONDER)
91                     .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6}))
92                     .setDestAddressList(Arrays.asList(UwbAddress.fromBytes(new byte[]{0x4, 0x6})))
93                     .setMultiNodeMode(MULTI_NODE_MODE_UNICAST)
94                     .setRangingRoundUsage(RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE)
95                     .setStsConfig(STS_CONFIG_STATIC)
96                     .setVendorId(new byte[]{0x5, 0x78})
97                     .setStaticStsIV(new byte[]{0x1a, 0x55, 0x77, 0x47, 0x7e, 0x7d})
98                     .setRangeDataNtfAoaAzimuthLower(-1.5)
99                     .setRangeDataNtfAoaAzimuthUpper(2.5)
100                     .setRangeDataNtfAoaElevationLower(-1.5)
101                     .setRangeDataNtfAoaElevationUpper(1.2);
102 
103     private static final FiraOpenSessionParams.Builder TEST_FIRA_OPEN_SESSION_PARAMS_V_1_1 =
104             new FiraOpenSessionParams.Builder(TEST_FIRA_OPEN_SESSION_COMMON_PARAMS);
105 
106     private static final FiraOpenSessionParams.Builder TEST_FIRA_OPEN_SESSION_PARAMS_V_2_0 =
107             new FiraOpenSessionParams.Builder(TEST_FIRA_OPEN_SESSION_COMMON_PARAMS)
108                     .setProtocolVersion(FiraParams.PROTOCOL_VERSION_2_0)
109                     .setInitiationTime(1000)
110                     .setLinkLayerMode(1)
111                     .setApplicationDataEndpoint(1);
112 
113     private static final FiraOpenSessionParams.Builder
114             TEST_FIRA_OPEN_SESSION_PARAMS_V_2_0_ABSOLUTE_INITIATION_TIME =
115                     new FiraOpenSessionParams.Builder(TEST_FIRA_OPEN_SESSION_PARAMS_V_2_0)
116                             .setAbsoluteInitiationTime(20000000L);
117 
118     private static final FiraRangingReconfigureParams.Builder TEST_FIRA_RECONFIGURE_PARAMS =
119             new FiraRangingReconfigureParams.Builder()
120                     .setBlockStrideLength(6)
121                     .setRangeDataNtfConfig(RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG)
122                     .setRangeDataProximityFar(6)
123                     .setRangeDataProximityNear(4)
124                     .setRangeDataAoaAzimuthLower(-1.5)
125                     .setRangeDataAoaAzimuthUpper(2.5)
126                     .setRangeDataAoaElevationLower(-1.5)
127                     .setRangeDataAoaElevationUpper(1.2);
128 
129     private static final byte[] TEST_FIRA_RECONFIGURE_TLV_DATA =
130             UwbUtil.getByteArray("2D01060E01040F020400100206001D0807D59E4707D56022");
131 
132     private static final FiraOpenSessionParams.Builder TEST_FIRA_UT_TAG_OPEN_SESSION_PARAM =
133             new FiraOpenSessionParams.Builder()
134                     .setProtocolVersion(FiraParams.PROTOCOL_VERSION_1_1)
135                     .setSessionId(2)
136                     .setSessionType(SESSION_TYPE_RANGING)
137                     .setDeviceType(RANGING_DEVICE_TYPE_CONTROLLER)
138                     .setDeviceRole(RANGING_DEVICE_UT_TAG)
139                     .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6}))
140                     .setDestAddressList(Arrays.asList(UwbAddress.fromBytes(new byte[]{0x4, 0x6})))
141                     .setMultiNodeMode(MULTI_NODE_MODE_UNICAST)
142                     .setStsConfig(STS_CONFIG_STATIC)
143                     .setVendorId(new byte[]{0x5, 0x78})
144                     .setStaticStsIV(new byte[]{0x1a, 0x55, 0x77, 0x47, 0x7e, 0x7d})
145                     .setRangingRoundUsage(RANGING_ROUND_USAGE_UL_TDOA)
146                     .setUlTdoaTxIntervalMs(1200)
147                     .setUlTdoaRandomWindowMs(30)
148                     .setUlTdoaDeviceIdType(UL_TDOA_DEVICE_ID_16_BIT)
149                     .setUlTdoaDeviceId(new byte[]{0x0B, 0x0A})
150                     .setUlTdoaTxTimestampType(TX_TIMESTAMP_40_BIT);
151 
152     private static final String DEVICE_TYPE_CONTROLEE_TLV = "000100";
153     private static final String DEVICE_TYPE_CONTROLLER_TLV = "000101";
154     private static final String RANGING_ROUND_USAGE_SS_TWR_TLV = "010101";
155     private static final String RANGING_ROUND_USAGE_UL_TDOA_TLV = "010100";
156     private static final String RANGING_ROUND_USAGE_Dl_TDOA_TLV = "010105";
157     private static final String STS_CONFIG_STATIC_TLV = "020100";
158     private static final String STS_CONFIG_PROVISIONED_TLV = "020103";
159     private static final String MULTI_NODE_MODE_UNICAST_TLV = "030100";
160     private static final String MULTI_NODE_MODE_ONE_TO_MANY_TLV = "030101";
161     private static final String CHANNEL_NUMBER_TLV = "040109";
162     private static final String NUMBER_OF_CONTROLEES_TLV = "050101";
163     private static final String DEVICE_MAC_ADDRESS_TLV = "06020406";
164     private static final String SLOT_DURATION_TLV = "08026009";
165     private static final String MAC_FCS_TYPE_TLV = "0B0100";
166     private static final String RANGING_ROUND_CONTROL_TLV = "0C0103";
167     private static final String RANGING_ROUND_CONTROL_CONTENTION_MRP_RCP_CM_RRRM_TLV = "0C0147";
168     private static final String AOA_RESULT_REQ_TLV = "0D0101";
169     private static final String RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV = "0E0104";
170     private static final String RANGE_DATA_NTF_CONFIG_ENABLE_TLV = "0E0101";
171     private static final String RANGE_DATA_NTF_PROXIMITY_NEAR_TLV = "0F020000";
172     private static final String RANGE_DATA_NTF_PROXIMITY_FAR_TLV = "1002204E";
173     private static final String DEVICE_ROLE_RESPONDER_TLV = "110100";
174     private static final String DEVICE_ROLE_INITIATOR_TLV = "110101";
175     private static final String DEVICE_ROLE_UT_TAG_TLV = "110104";
176     private static final String DEVICE_ROLE_DT_TAG_TLV = "110108";
177     private static final String RFRAME_CONFIG_TLV = "120103";
178     private static final String RFRAME_CONFIG_DL_TDOA_TLV = "120101";
179     private static final String RSSI_REPORTING_TLV = "130100";
180     private static final String PREAMBLE_CODE_INDEX_TLV = "14010A";
181     private static final String SFD_ID_TLV = "150102";
182     private static final String PSDU_DATA_RATE_TLV = "160100";
183     private static final String PREAMBLE_DURATION_TLV = "170101";
184     private static final String LINK_LAYER_MODE_BYPASS_TLV = "180100";
185     private static final String LINK_LAYER_MODE_CONNECTIONLESS_DATA_TLV = "180101";
186     private static final String DATA_REPETITION_COUNT_TLV = "190100";
187     private static final String RANGING_TIME_STRUCT_TLV = "1A0101";
188     private static final String SLOTS_PER_RR_TLV = "1B0119";
189     private static final String TX_ADAPTIVE_PAYLOAD_POWER_TLV = "1C0100";
190     private static final String PRF_MODE_TLV = "1F0100";
191     private static final String CAP_SIZE_RANGE_DEFAULT_TLV = "20021805";
192     private static final String SCHEDULED_MODE_TIME_SCHEDULED_TLV = "220101";
193     private static final String SCHEDULED_MODE_CONTENTION_TLV = "220100";
194     private static final String KEY_ROTATION_TLV = "230100";
195     private static final String KEY_ROTATION_RATE_TLV = "240100";
196     private static final String SESSION_PRIORITY_TLV = "250132";
197     private static final String MAC_ADDRESS_MODE_TLV = "260100";
198     private static final String NUMBER_OF_STS_SEGMENTS_TLV = "290101";
199     private static final String MAX_RR_RETRY_TLV = "2A020000";
200     private static final String HOPPING_MODE_TLV = "2C0100";
201     private static final String BLOCK_STRIDE_LENGTH_TLV = "2D0100";
202     private static final String RESULT_REPORT_CONFIG_TLV = "2E0101";
203     private static final String IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV = "2F0101";
204     private static final String BPRF_PHR_DATA_RATE_TLV = "310100";
205     private static final String MAX_NUMBER_OF_MEASUREMENTS_TLV = "32020000";
206     private static final String STS_LENGTH_TLV = "350101";
207     private static final String ANTENNA_MODE_TLV = "EA0100";
208     private static final String RANGING_INTERVAL_TLV = "0904C8000000";
209     private static final String DST_MAC_ADDRESS_TLV = "07020406";
210     private static final String UWB_INITIATION_TIME_TLV = "2B0400000000";
211     private static final String UWB_INITIATION_TIME_2_0_TLV = "2B08E803000000000000";
212     private static final String ABSOLUTE_UWB_INITIATION_TIME_2_0_TLV = "2B08002D310100000000";
213     private static final String VENDOR_ID_TLV = "27020578";
214     private static final String STATIC_STS_IV_TLV = "28061A5577477E7D";
215     private static final String RANGE_DATA_NTF_AOA_BOUND_TLV = "1D0807D59E4707D56022";
216     private static final String APPLICATION_DATA_ENDPOINT_HOST_TLV = "4C0100";
217     private static final String APPLICATION_DATA_ENDPOINT_SECURE_COMPONENT_TLV = "4C0101";
218     private static final String UL_TDOA_TX_INTERVAL_TLV = "3304B0040000";
219     private static final String UL_TDOA_RANDOM_WINDOW_TLV = "34041E000000";
220     private static final String UL_TDOA_DEVICE_ID_TLV = "3803010B0A";
221     private static final String UL_TDOA_TX_TIMESTAMP_TLV = "390101";
222     private static final String SESSION_DATA_TRANSFER_STATUS_NTF_CONFIG_TLV = "470100";
223     private static final String SUB_SESSION_ID_TLV = "300401000000";
224     private static final String SESSION_KEY_TLV  = "451005780578057805780578057805780578";
225     private static final String SESSION_TIME_BASE_TLV  = "48090101000000C8000000";
226 
227     @Mock private UwbInjector mUwbInjector;
228     @Mock private FeatureFlags mFeatureFlags;
229 
230     private FiraEncoder mFiraEncoder;
231     private byte[] mFiraOpenSessionTlvUtTag;
232     private byte[] mFiraSessionv11TlvData;
233     private byte[] mFiraSessionv20TlvData;
234     private byte[] mFiraSessionv20AbsoluteInitiationTimeTlvData;
235 
236     @Before
setUp()237     public void setUp() {
238         MockitoAnnotations.initMocks(this);
239 
240         // Setup the unit tests to have the default behavior of using the UWBS UCI version.
241         when(mUwbInjector.getFeatureFlags()).thenReturn(mFeatureFlags);
242 
243         // Test antenna mode param.
244         DeviceConfigFacade mockDeviceConfig = mock(DeviceConfigFacade.class);
245         when(mockDeviceConfig.isAntennaModeConfigSupported()).thenReturn(true);
246         when(mUwbInjector.getDeviceConfigFacade()).thenReturn(mockDeviceConfig);
247 
248         mFiraEncoder = new FiraEncoder(mUwbInjector);
249 
250         if (!SdkLevel.isAtLeastU()) {
251             mFiraSessionv11TlvData = UwbUtil.getByteArray(
252                     "01010102010003010004010906020604080260090B01000C01030D01010E01040F02"
253                             + "00001002204E11010012010313010014010A1501021601001701011A01011B0119"
254                             + "1F01002201012301002401002501322601002901012A0200002C01002D01002E"
255                             + "01012F0101310100320200003501010904C8000000000101050101070206042B0400"
256                             + "0000001C01002702780528061A5577477E7D1D0807D59E4707D56022EA0100");
257 
258             mFiraOpenSessionTlvUtTag = UwbUtil.getByteArray(
259                     "01010002010003010004010906020604080260090B01000C01030D01010E01010F02"
260                             + "00001002204E11010412010313010014010A1501021601001701011A01011B0119"
261                             + "1F01002201012301002401002501322601002901012A0200002C01002D01002E"
262                             + "01012F0101310100320200003501010001012B04000000001C0100270278"
263                             + "0528061A5577477E7D3304B004000034041E0000003803010B0A390101EA0100");
264         } else {
265             mFiraSessionv11TlvData = UwbUtil.getByteArray(RANGING_ROUND_USAGE_SS_TWR_TLV
266                     + STS_CONFIG_STATIC_TLV + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV
267                     + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV
268                     + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV
269                     + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV
270                     + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_RESPONDER_TLV
271                     + RFRAME_CONFIG_TLV
272                     + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV + SFD_ID_TLV + PSDU_DATA_RATE_TLV
273                     + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV + SLOTS_PER_RR_TLV
274                     + PRF_MODE_TLV + SCHEDULED_MODE_TIME_SCHEDULED_TLV
275                     + KEY_ROTATION_TLV + KEY_ROTATION_RATE_TLV + SESSION_PRIORITY_TLV
276                     + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV + MAX_RR_RETRY_TLV
277                     + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV + RESULT_REPORT_CONFIG_TLV
278                     + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV + BPRF_PHR_DATA_RATE_TLV
279                     + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV + RANGING_INTERVAL_TLV
280                     + DEVICE_TYPE_CONTROLLER_TLV + NUMBER_OF_CONTROLEES_TLV + DST_MAC_ADDRESS_TLV
281                     + UWB_INITIATION_TIME_TLV + TX_ADAPTIVE_PAYLOAD_POWER_TLV + VENDOR_ID_TLV
282                     + STATIC_STS_IV_TLV + RANGE_DATA_NTF_AOA_BOUND_TLV + ANTENNA_MODE_TLV);
283 
284             mFiraSessionv20TlvData = UwbUtil.getByteArray(
285                     RANGING_ROUND_USAGE_SS_TWR_TLV
286                     + STS_CONFIG_STATIC_TLV + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV
287                     + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV
288                     + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV
289                     + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV
290                     + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_RESPONDER_TLV
291                     + RFRAME_CONFIG_TLV
292                     + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV + SFD_ID_TLV
293                     + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV
294                     + SLOTS_PER_RR_TLV
295                     + PRF_MODE_TLV + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV
296                     + KEY_ROTATION_RATE_TLV
297                     + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV
298                     + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV
299                     + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV
300                     + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV
301                     + RANGING_INTERVAL_TLV + DEVICE_TYPE_CONTROLLER_TLV + NUMBER_OF_CONTROLEES_TLV
302                     + DST_MAC_ADDRESS_TLV + UWB_INITIATION_TIME_2_0_TLV
303                     + LINK_LAYER_MODE_CONNECTIONLESS_DATA_TLV
304                     + DATA_REPETITION_COUNT_TLV
305                     + SESSION_DATA_TRANSFER_STATUS_NTF_CONFIG_TLV
306                     + APPLICATION_DATA_ENDPOINT_SECURE_COMPONENT_TLV
307                     + VENDOR_ID_TLV + STATIC_STS_IV_TLV
308                     + RANGE_DATA_NTF_AOA_BOUND_TLV + ANTENNA_MODE_TLV);
309 
310             mFiraSessionv20AbsoluteInitiationTimeTlvData = UwbUtil.getByteArray(
311                     RANGING_ROUND_USAGE_SS_TWR_TLV
312                     + STS_CONFIG_STATIC_TLV + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV
313                     + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV
314                     + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV
315                     + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV
316                     + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_RESPONDER_TLV
317                     + RFRAME_CONFIG_TLV
318                     + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV + SFD_ID_TLV
319                     + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV
320                     + SLOTS_PER_RR_TLV
321                     + PRF_MODE_TLV + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV
322                     + KEY_ROTATION_RATE_TLV
323                     + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV
324                     + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV
325                     + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV
326                     + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV
327                     + RANGING_INTERVAL_TLV + DEVICE_TYPE_CONTROLLER_TLV + NUMBER_OF_CONTROLEES_TLV
328                     + DST_MAC_ADDRESS_TLV + ABSOLUTE_UWB_INITIATION_TIME_2_0_TLV
329                     + LINK_LAYER_MODE_CONNECTIONLESS_DATA_TLV
330                     + DATA_REPETITION_COUNT_TLV
331                     + SESSION_DATA_TRANSFER_STATUS_NTF_CONFIG_TLV
332                     + APPLICATION_DATA_ENDPOINT_SECURE_COMPONENT_TLV
333                     + VENDOR_ID_TLV + STATIC_STS_IV_TLV
334                     + RANGE_DATA_NTF_AOA_BOUND_TLV + ANTENNA_MODE_TLV);
335 
336             mFiraOpenSessionTlvUtTag = UwbUtil.getByteArray(
337                     RANGING_ROUND_USAGE_UL_TDOA_TLV
338                     + STS_CONFIG_STATIC_TLV + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV
339                     + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV
340                     + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV
341                     + RANGE_DATA_NTF_CONFIG_ENABLE_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV
342                     + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_UT_TAG_TLV
343                     + RFRAME_CONFIG_TLV + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV
344                     + SFD_ID_TLV + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV
345                     + RANGING_TIME_STRUCT_TLV + SLOTS_PER_RR_TLV
346                     + PRF_MODE_TLV + SCHEDULED_MODE_TIME_SCHEDULED_TLV
347                     + KEY_ROTATION_TLV + KEY_ROTATION_RATE_TLV
348                     + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV
349                     + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV
350                     + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV
351                     + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV
352                     + DEVICE_TYPE_CONTROLLER_TLV
353                     + UWB_INITIATION_TIME_TLV + TX_ADAPTIVE_PAYLOAD_POWER_TLV + VENDOR_ID_TLV
354                     + STATIC_STS_IV_TLV + UL_TDOA_TX_INTERVAL_TLV + UL_TDOA_RANDOM_WINDOW_TLV
355                     + UL_TDOA_DEVICE_ID_TLV + UL_TDOA_TX_TIMESTAMP_TLV + ANTENNA_MODE_TLV);
356         }
357     }
358 
359     // Test FiraEncoder behavior when the Fira ProtocolVersion comes from the UWBS UCI version.
360     @Test
testFiraOpenSessionParams_useUwbsUciVersion()361     public void testFiraOpenSessionParams_useUwbsUciVersion() throws Exception {
362         // Test FiRa v1.1 Params
363         FiraOpenSessionParams params = TEST_FIRA_OPEN_SESSION_PARAMS_V_1_1.build();
364         TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_1_1);
365 
366         assertThat(tlvs.getNoOfParams()).isEqualTo(46);
367         assertThat(tlvs.getByteArray()).isEqualTo(mFiraSessionv11TlvData);
368 
369         // Test FiRa v2.0 Params
370         if (SdkLevel.isAtLeastU()) {
371             // Test the default Fira v2.0 OpenSessionParams.
372             params = TEST_FIRA_OPEN_SESSION_PARAMS_V_2_0.build();
373             tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_2_0);
374 
375             assertThat(tlvs.getNoOfParams()).isEqualTo(49);
376             assertThat(tlvs.getByteArray()).isEqualTo(mFiraSessionv20TlvData);
377 
378             // Test the Fira v2.0 OpenSessionParams with ABSOLUTE_INITIATION_TIME set.
379             params = TEST_FIRA_OPEN_SESSION_PARAMS_V_2_0_ABSOLUTE_INITIATION_TIME.build();
380             tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_2_0);
381 
382             assertThat(tlvs.getNoOfParams()).isEqualTo(49);
383             assertThat(tlvs.getByteArray()).isEqualTo(mFiraSessionv20AbsoluteInitiationTimeTlvData);
384 
385         }
386     }
387 
388     @Test
testFiraRangingReconfigureParams()389     public void testFiraRangingReconfigureParams() throws Exception {
390         FiraRangingReconfigureParams params = TEST_FIRA_RECONFIGURE_PARAMS.build();
391         TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_1_1);
392 
393         assertThat(tlvs.getNoOfParams()).isEqualTo(5);
394         assertThat(tlvs.getByteArray()).isEqualTo(TEST_FIRA_RECONFIGURE_TLV_DATA);
395     }
396 
397     // This test could be changed to just check that TlvEncoder returns a FiraEncoder, as
398     // above testFiraOpenSessionParams() already checks the encoding done by FiraEncoder.
399     @Test
testFiraOpenSessionParamsViaTlvEncoder()400     public void testFiraOpenSessionParamsViaTlvEncoder() throws Exception {
401         FiraOpenSessionParams params = TEST_FIRA_OPEN_SESSION_PARAMS_V_1_1.build();
402         TlvBuffer tlvs = TlvEncoder.getEncoder(FiraParams.PROTOCOL_NAME, mUwbInjector)
403                 .getTlvBuffer(params, PROTOCOL_VERSION_1_1);
404 
405         assertThat(tlvs.getNoOfParams()).isEqualTo(46);
406         assertThat(tlvs.getByteArray()).isEqualTo(mFiraSessionv11TlvData);
407     }
408 
409     @Test
testFiraRangingReconfigureParamsViaTlvEncoder()410     public void testFiraRangingReconfigureParamsViaTlvEncoder() throws Exception {
411         FiraRangingReconfigureParams params = TEST_FIRA_RECONFIGURE_PARAMS.build();
412         TlvBuffer tlvs = TlvEncoder.getEncoder(FiraParams.PROTOCOL_NAME, mUwbInjector)
413                 .getTlvBuffer(params, PROTOCOL_VERSION_DUMMY);
414 
415         assertThat(tlvs.getNoOfParams()).isEqualTo(5);
416         assertThat(tlvs.getByteArray()).isEqualTo(TEST_FIRA_RECONFIGURE_TLV_DATA);
417     }
418 
419     @Test
testFiraOpenSessionParamsUtTag()420     public void testFiraOpenSessionParamsUtTag() throws Exception {
421         FiraOpenSessionParams params = TEST_FIRA_UT_TAG_OPEN_SESSION_PARAM.build();
422         TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_1_1);
423 
424         assertThat(tlvs.getNoOfParams()).isEqualTo(46);
425         assertThat(tlvs.getByteArray()).isEqualTo(mFiraOpenSessionTlvUtTag);
426 
427     }
428 
429     @Test
testFiraOpenSessionParamsProvisionedStsWithSessionKey()430     public void testFiraOpenSessionParamsProvisionedStsWithSessionKey() throws Exception {
431         FiraOpenSessionParams params =
432                 new FiraOpenSessionParams.Builder()
433                         .setProtocolVersion(FiraParams.PROTOCOL_VERSION_1_1)
434                         .setSessionId(1)
435                         .setSessionType(SESSION_TYPE_RANGING)
436                         .setRangeDataNtfConfig(
437                                 RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG)
438                         .setDeviceType(RANGING_DEVICE_TYPE_CONTROLLER)
439                         .setDeviceRole(RANGING_DEVICE_ROLE_RESPONDER)
440                         .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6}))
441                         .setDestAddressList(Arrays.asList(UwbAddress.fromBytes(
442                                 new byte[]{0x4, 0x6})))
443                         .setMultiNodeMode(MULTI_NODE_MODE_UNICAST)
444                         .setRangingRoundUsage(RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE)
445                         .setStsConfig(STS_CONFIG_PROVISIONED)
446                         .setSessionKey(new byte[]{0x5, 0x78, 0x5, 0x78, 0x5, 0x78, 0x5, 0x78, 0x5,
447                                 0x78, 0x5, 0x78, 0x5, 0x78, 0x5, 0x78})
448                         .setRangeDataNtfAoaAzimuthLower(-1.5)
449                         .setRangeDataNtfAoaAzimuthUpper(2.5)
450                         .setRangeDataNtfAoaElevationLower(-1.5)
451                         .setRangeDataNtfAoaElevationUpper(1.2)
452                         .build();
453 
454         byte[] expected_data;
455         if (!SdkLevel.isAtLeastU()) {
456             expected_data = UwbUtil.getByteArray(
457                     "01010102010303010004010906020604080260090B01000C01030D01010E01040F02"
458                             + "00001002204E11010012010313010014010A1501021601001701011A01011B0119"
459                             + "1F01002201012301002401002501322601002901012A0200002C01002D01002E"
460                             + "01012F0101310100320200003501010904C8000000000101050101070206042B0400"
461                             + "0000001C0100451005780578057805780578057805780578"
462                             + "1D0807D59E4707D56022EA0100");
463         } else {
464             expected_data = UwbUtil.getByteArray(RANGING_ROUND_USAGE_SS_TWR_TLV
465                     + STS_CONFIG_PROVISIONED_TLV + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV
466                     + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV
467                     + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV
468                     + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV
469                     + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_RESPONDER_TLV
470                     + RFRAME_CONFIG_TLV
471                     + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV + SFD_ID_TLV
472                     + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV
473                     + SLOTS_PER_RR_TLV + PRF_MODE_TLV
474                     + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV + KEY_ROTATION_RATE_TLV
475                     + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV
476                     + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV
477                     + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV
478                     + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV
479                     + RANGING_INTERVAL_TLV + DEVICE_TYPE_CONTROLLER_TLV + NUMBER_OF_CONTROLEES_TLV
480                     + DST_MAC_ADDRESS_TLV + UWB_INITIATION_TIME_TLV + TX_ADAPTIVE_PAYLOAD_POWER_TLV
481                     + SESSION_KEY_TLV + RANGE_DATA_NTF_AOA_BOUND_TLV + ANTENNA_MODE_TLV);
482         }
483         TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_1_1);
484 
485         assertThat(tlvs.getNoOfParams()).isEqualTo(45);
486         assertThat(tlvs.getByteArray()).isEqualTo(expected_data);
487     }
488 
489    @Test
testFiraOpenSessionParamsProvisionedStsWithoutSessionKey()490     public void testFiraOpenSessionParamsProvisionedStsWithoutSessionKey() throws Exception {
491         FiraOpenSessionParams params =
492                 new FiraOpenSessionParams.Builder()
493                         .setProtocolVersion(FiraParams.PROTOCOL_VERSION_1_1)
494                         .setSessionId(1)
495                         .setSessionType(SESSION_TYPE_RANGING)
496                         .setRangeDataNtfConfig(
497                                 RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG)
498                         .setDeviceType(RANGING_DEVICE_TYPE_CONTROLLER)
499                         .setDeviceRole(RANGING_DEVICE_ROLE_RESPONDER)
500                         .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6}))
501                         .setDestAddressList(Arrays.asList(UwbAddress.fromBytes(
502                                 new byte[]{0x4, 0x6})))
503                         .setMultiNodeMode(MULTI_NODE_MODE_UNICAST)
504                         .setRangingRoundUsage(RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE)
505                         .setStsConfig(STS_CONFIG_PROVISIONED)
506                         .setRangeDataNtfAoaAzimuthLower(-1.5)
507                         .setRangeDataNtfAoaAzimuthUpper(2.5)
508                         .setRangeDataNtfAoaElevationLower(-1.5)
509                         .setRangeDataNtfAoaElevationUpper(1.2)
510                         .build();
511 
512         byte[] expected_data;
513         if (!SdkLevel.isAtLeastU()) {
514             expected_data = UwbUtil.getByteArray(
515                     "01010102010303010004010906020604080260090B01000C01030D01010E01040F02"
516                             + "00001002204E11010012010313010014010A1501021601001701011A01011B0119"
517                             + "1F01002201012301002401002501322601002901012A0200002C01002D01002E"
518                             + "01012F0101310100320200003501010904C8000000000101050101070206042B0400"
519                             + "0000001C01001D0807D59E4707D56022EA0100");
520         } else {
521             expected_data = UwbUtil.getByteArray(RANGING_ROUND_USAGE_SS_TWR_TLV
522                     + STS_CONFIG_PROVISIONED_TLV + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV
523                     + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV
524                     + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV
525                     + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV
526                     + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_RESPONDER_TLV
527                     + RFRAME_CONFIG_TLV
528                     + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV + SFD_ID_TLV
529                     + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV
530                     + SLOTS_PER_RR_TLV + PRF_MODE_TLV
531                     + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV + KEY_ROTATION_RATE_TLV
532                     + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV
533                     + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV
534                     + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV
535                     + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV
536                     + RANGING_INTERVAL_TLV + DEVICE_TYPE_CONTROLLER_TLV + NUMBER_OF_CONTROLEES_TLV
537                     + DST_MAC_ADDRESS_TLV + UWB_INITIATION_TIME_TLV + TX_ADAPTIVE_PAYLOAD_POWER_TLV
538                     + RANGE_DATA_NTF_AOA_BOUND_TLV + ANTENNA_MODE_TLV);
539         }
540         TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_1_1);
541 
542         assertThat(tlvs.getNoOfParams()).isEqualTo(44);
543         assertThat(tlvs.getByteArray()).isEqualTo(expected_data);
544     }
545 
546    @Test
testFiraOpenSessionParamsDynamicControleeIndKey()547     public void testFiraOpenSessionParamsDynamicControleeIndKey() throws Exception {
548         FiraOpenSessionParams params =
549                 new FiraOpenSessionParams.Builder()
550                         .setProtocolVersion(FiraParams.PROTOCOL_VERSION_1_1)
551                         .setSessionId(1)
552                         .setSessionType(SESSION_TYPE_RANGING)
553                         .setRangeDataNtfConfig(
554                                 RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG)
555                         .setDeviceType(RANGING_DEVICE_TYPE_CONTROLEE)
556                         .setDeviceRole(RANGING_DEVICE_ROLE_RESPONDER)
557                         .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6}))
558                         .setDestAddressList(Arrays.asList(UwbAddress.fromBytes(
559                                 new byte[]{0x4, 0x6})))
560                         .setMultiNodeMode(MULTI_NODE_MODE_UNICAST)
561                         .setRangingRoundUsage(RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE)
562                         .setStsConfig(STS_CONFIG_DYNAMIC_FOR_CONTROLEE_INDIVIDUAL_KEY)
563                         .setSubSessionId(01)
564                         .setRangeDataNtfAoaAzimuthLower(-1.5)
565                         .setRangeDataNtfAoaAzimuthUpper(2.5)
566                         .setRangeDataNtfAoaElevationLower(-1.5)
567                         .setRangeDataNtfAoaElevationUpper(1.2)
568                         .build();
569 
570         String STS_CONFIG_DYNAMIC_FOR_CONTROLEE_INDIVIDUAL_KEY_TLV = "020102";
571         byte[] expected_data;
572         if (!SdkLevel.isAtLeastU()) {
573             expected_data = UwbUtil.getByteArray(
574                     "01010102010203010004010906020604080260090B01000C01030D01010E01040F02"
575                             + "00001002204E11010012010313010014010A1501021601001701011A01011B0119"
576                             + "1F01002201012301002401002501322601002901012A0200002C01002D01002E"
577                             + "01012F0101310100320200003501010904C8000000000100050101070206042B0400"
578                             + "0000001C01003004010000001D0807D59E4707D56022EA0100");
579         } else {
580             expected_data = UwbUtil.getByteArray(RANGING_ROUND_USAGE_SS_TWR_TLV
581                     + STS_CONFIG_DYNAMIC_FOR_CONTROLEE_INDIVIDUAL_KEY_TLV
582                     + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV + DEVICE_MAC_ADDRESS_TLV
583                     + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV
584                     + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV
585                     + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV
586                     + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_RESPONDER_TLV
587                     + RFRAME_CONFIG_TLV
588                     + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV + SFD_ID_TLV
589                     + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV
590                     + SLOTS_PER_RR_TLV + PRF_MODE_TLV
591                     + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV + KEY_ROTATION_RATE_TLV
592                     + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV
593                     + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV
594                     + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV
595                     + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV
596                     + RANGING_INTERVAL_TLV + DEVICE_TYPE_CONTROLEE_TLV + NUMBER_OF_CONTROLEES_TLV
597                     + DST_MAC_ADDRESS_TLV + UWB_INITIATION_TIME_TLV + TX_ADAPTIVE_PAYLOAD_POWER_TLV
598                     + SUB_SESSION_ID_TLV + RANGE_DATA_NTF_AOA_BOUND_TLV + ANTENNA_MODE_TLV);
599         }
600         TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_1_1);
601 
602         assertThat(tlvs.getNoOfParams()).isEqualTo(45);
603         assertThat(tlvs.getByteArray()).isEqualTo(expected_data);
604     }
605 
606    @Test
testFiraOpenSessionParamsProvControleeIndKeyWithSessionkey()607     public void testFiraOpenSessionParamsProvControleeIndKeyWithSessionkey() throws Exception {
608         FiraOpenSessionParams params =
609                 new FiraOpenSessionParams.Builder()
610                         .setProtocolVersion(FiraParams.PROTOCOL_VERSION_1_1)
611                         .setSessionId(1)
612                         .setSessionType(SESSION_TYPE_RANGING)
613                         .setRangeDataNtfConfig(
614                                 RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG)
615                         .setDeviceType(RANGING_DEVICE_TYPE_CONTROLEE)
616                         .setDeviceRole(RANGING_DEVICE_ROLE_RESPONDER)
617                         .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6}))
618                         .setDestAddressList(Arrays.asList(UwbAddress.fromBytes(
619                                 new byte[]{0x4, 0x6})))
620                         .setMultiNodeMode(MULTI_NODE_MODE_UNICAST)
621                         .setRangingRoundUsage(RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE)
622                         .setStsConfig(STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY)
623                         .setSubSessionId(01)
624                         .setSessionKey(new byte[]{0x5, 0x78, 0x5, 0x78, 0x5, 0x78, 0x5, 0x78, 0x5,
625                                 0x78, 0x5, 0x78, 0x5, 0x78, 0x5, 0x78})
626                         .setSubsessionKey(new byte[]{0x6, 0x79, 0x6, 0x79, 0x6, 0x79, 0x6,
627                                 0x79, 0x6, 0x79, 0x6, 0x79, 0x6, 0x79, 0x6, 0x79})
628                         .setRangeDataNtfAoaAzimuthLower(-1.5)
629                         .setRangeDataNtfAoaAzimuthUpper(2.5)
630                         .setRangeDataNtfAoaElevationLower(-1.5)
631                         .setRangeDataNtfAoaElevationUpper(1.2)
632                         .build();
633 
634         String STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY_TLV = "020104";
635         String subsession_key = "461006790679067906790679067906790679";
636         byte[] expected_data;
637         if (!SdkLevel.isAtLeastU()) {
638             expected_data = UwbUtil.getByteArray(
639                     "01010102010403010004010906020604080260090B01000C01030D01010E01040F02"
640                             + "00001002204E11010012010313010014010A1501021601001701011A01011B0119"
641                             + "1F01002201012301002401002501322601002901012A0200002C01002D01002E"
642                             + "01012F0101310100320200003501010904C8000000000100050101070206042B0400"
643                             + "0000001C0100300401000000"
644                             + "461006790679067906790679067906790679"
645                             + "451005780578057805780578057805780578"
646                             + "1D0807D59E4707D56022EA0100");
647         } else {
648             expected_data = UwbUtil.getByteArray(RANGING_ROUND_USAGE_SS_TWR_TLV
649                     + STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY_TLV
650                     + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV + DEVICE_MAC_ADDRESS_TLV
651                     + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV + RANGING_ROUND_CONTROL_TLV
652                     + AOA_RESULT_REQ_TLV + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV
653                     + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV + RANGE_DATA_NTF_PROXIMITY_FAR_TLV
654                     + DEVICE_ROLE_RESPONDER_TLV + RFRAME_CONFIG_TLV
655                     + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV + SFD_ID_TLV
656                     + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV
657                     + SLOTS_PER_RR_TLV + PRF_MODE_TLV
658                     + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV + KEY_ROTATION_RATE_TLV
659                     + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV
660                     + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV
661                     + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV
662                     + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV
663                     + RANGING_INTERVAL_TLV + DEVICE_TYPE_CONTROLEE_TLV + NUMBER_OF_CONTROLEES_TLV
664                     + DST_MAC_ADDRESS_TLV + UWB_INITIATION_TIME_TLV + TX_ADAPTIVE_PAYLOAD_POWER_TLV
665                     + SUB_SESSION_ID_TLV + subsession_key + SESSION_KEY_TLV
666                     + RANGE_DATA_NTF_AOA_BOUND_TLV + ANTENNA_MODE_TLV);
667         }
668         TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_1_1);
669 
670         assertThat(tlvs.getNoOfParams()).isEqualTo(47);
671         assertThat(tlvs.getByteArray()).isEqualTo(expected_data);
672     }
673 
674     @Test
testFiraOpenSessionParamsProvControleeIndKeyWithoutSessionkey()675     public void testFiraOpenSessionParamsProvControleeIndKeyWithoutSessionkey() throws Exception {
676         FiraOpenSessionParams params =
677                 new FiraOpenSessionParams.Builder()
678                         .setProtocolVersion(FiraParams.PROTOCOL_VERSION_1_1)
679                         .setSessionId(1)
680                         .setSessionType(SESSION_TYPE_RANGING)
681                         .setRangeDataNtfConfig(
682                                 RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG)
683                         .setDeviceType(RANGING_DEVICE_TYPE_CONTROLEE)
684                         .setDeviceRole(RANGING_DEVICE_ROLE_RESPONDER)
685                         .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6}))
686                         .setDestAddressList(Arrays.asList(UwbAddress.fromBytes(
687                                 new byte[]{0x4, 0x6})))
688                         .setMultiNodeMode(MULTI_NODE_MODE_UNICAST)
689                         .setRangingRoundUsage(RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE)
690                         .setStsConfig(STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY)
691                         .setSubSessionId(01)
692                         .setRangeDataNtfAoaAzimuthLower(-1.5)
693                         .setRangeDataNtfAoaAzimuthUpper(2.5)
694                         .setRangeDataNtfAoaElevationLower(-1.5)
695                         .setRangeDataNtfAoaElevationUpper(1.2)
696                         .build();
697 
698         String STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY_TLV = "020104";
699         byte[] expected_data;
700         if (!SdkLevel.isAtLeastU()) {
701             expected_data = UwbUtil.getByteArray(
702                     "01010102010403010004010906020604080260090B01000C01030D01010E01040F02"
703                             + "00001002204E11010012010313010014010A1501021601001701011A01011B0119"
704                             + "1F01002201012301002401002501322601002901012A0200002C01002D01002E"
705                             + "01012F0101310100320200003501010904C8000000000100050101070206042B0400"
706                             + "0000001C01003004010000001D0807D59E4707D56022EA0100");
707         } else {
708             expected_data = UwbUtil.getByteArray(RANGING_ROUND_USAGE_SS_TWR_TLV
709                     + STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY_TLV
710                     + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV
711                     + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV
712                     + MAC_FCS_TYPE_TLV + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV
713                     + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV
714                     + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_RESPONDER_TLV
715                     + RFRAME_CONFIG_TLV + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV + SFD_ID_TLV
716                     + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV
717                     + SLOTS_PER_RR_TLV + PRF_MODE_TLV
718                     + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV + KEY_ROTATION_RATE_TLV
719                     + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV
720                     + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV
721                     + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV
722                     + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV
723                     + RANGING_INTERVAL_TLV + DEVICE_TYPE_CONTROLEE_TLV + NUMBER_OF_CONTROLEES_TLV
724                     + DST_MAC_ADDRESS_TLV + UWB_INITIATION_TIME_TLV + TX_ADAPTIVE_PAYLOAD_POWER_TLV
725                     + SUB_SESSION_ID_TLV
726                     + RANGE_DATA_NTF_AOA_BOUND_TLV + ANTENNA_MODE_TLV);
727         }
728         TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_1_1);
729 
730         assertThat(tlvs.getNoOfParams()).isEqualTo(45);
731         assertThat(tlvs.getByteArray()).isEqualTo(expected_data);
732     }
733 
734     @Test
testFiraDlTdoaDtTagSession()735     public void testFiraDlTdoaDtTagSession() throws Exception  {
736         assumeTrue(SdkLevel.isAtLeastU());
737         FiraOpenSessionParams params =
738                 new FiraOpenSessionParams.Builder()
739                         .setProtocolVersion(FiraParams.PROTOCOL_VERSION_1_1)
740                         .setSessionId(1)
741                         .setSessionType(SESSION_TYPE_RANGING)
742                         .setStsConfig(STS_CONFIG_STATIC)
743                         .setDeviceType(RANGING_DEVICE_TYPE_DT_TAG)
744                         .setDeviceRole(RANGING_DEVICE_DT_TAG)
745                         .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6}))
746                         .setDestAddressList(Arrays.asList(UwbAddress.fromBytes(
747                                 new byte[]{0x4, 0x6}))) // Should be ignored
748                         .setMultiNodeMode(MULTI_NODE_MODE_ONE_TO_MANY)
749                         .setRangingRoundUsage(RANGING_ROUND_USAGE_DL_TDOA)
750                         .setRframeConfig(RFRAME_CONFIG_SP1)
751                         .setVendorId(new byte[]{0x5, 0x78})
752                         .setStaticStsIV(new byte[]{0x1a, 0x55, 0x77, 0x47, 0x7e, 0x7d})
753                         .build();
754 
755         byte[] expected_data = UwbUtil.getByteArray(RANGING_ROUND_USAGE_Dl_TDOA_TLV
756                 + STS_CONFIG_STATIC_TLV + MULTI_NODE_MODE_ONE_TO_MANY_TLV + CHANNEL_NUMBER_TLV
757                 + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV
758                 + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV
759                 + RANGE_DATA_NTF_CONFIG_ENABLE_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV
760                 + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_DT_TAG_TLV
761                 + RFRAME_CONFIG_DL_TDOA_TLV + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV
762                 + SFD_ID_TLV + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV
763                 + SLOTS_PER_RR_TLV  + PRF_MODE_TLV
764                 + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV + KEY_ROTATION_RATE_TLV
765                 + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV
766                 + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV
767                 + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV
768                 + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV
769                 + RANGING_INTERVAL_TLV + TX_ADAPTIVE_PAYLOAD_POWER_TLV
770                 + VENDOR_ID_TLV + STATIC_STS_IV_TLV + ANTENNA_MODE_TLV);
771 
772         TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_1_1);
773 
774         assertThat(tlvs.getNoOfParams()).isEqualTo(41);
775         assertThat(tlvs.getByteArray()).isEqualTo(expected_data);
776     }
777 
778     @Test
testFiraDlTdoaDtTagSession_2_0()779     public void testFiraDlTdoaDtTagSession_2_0() throws Exception  {
780         assumeTrue(SdkLevel.isAtLeastU());
781         FiraOpenSessionParams params =
782                 new FiraOpenSessionParams.Builder()
783                         .setProtocolVersion(FiraParams.PROTOCOL_VERSION_2_0)
784                         .setSessionId(1)
785                         .setSessionType(SESSION_TYPE_RANGING)
786                         .setStsConfig(STS_CONFIG_STATIC)
787                         .setDeviceType(RANGING_DEVICE_TYPE_DT_TAG)
788                         .setDeviceRole(RANGING_DEVICE_DT_TAG)
789                         .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6}))
790                         .setDestAddressList(Arrays.asList(UwbAddress.fromBytes(
791                                 new byte[]{0x4, 0x6}))) // Should be ignored
792                         .setMultiNodeMode(MULTI_NODE_MODE_ONE_TO_MANY)
793                         .setRangingRoundUsage(RANGING_ROUND_USAGE_DL_TDOA)
794                         .setRframeConfig(RFRAME_CONFIG_SP1)
795                         .setVendorId(new byte[]{0x5, 0x78})
796                         .setStaticStsIV(new byte[]{0x1a, 0x55, 0x77, 0x47, 0x7e, 0x7d})
797                         .setDlTdoaBlockStriding(01)
798                         .build();
799 
800         String DL_TDOA_BLOCK_STRIDING_TLV = "430101";
801         byte[] expected_data = UwbUtil.getByteArray(RANGING_ROUND_USAGE_Dl_TDOA_TLV
802                 + STS_CONFIG_STATIC_TLV + MULTI_NODE_MODE_ONE_TO_MANY_TLV + CHANNEL_NUMBER_TLV
803                 + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV
804                 + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV
805                 + RANGE_DATA_NTF_CONFIG_ENABLE_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV
806                 + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_DT_TAG_TLV
807                 + RFRAME_CONFIG_DL_TDOA_TLV + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV
808                 + SFD_ID_TLV + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV
809                 + SLOTS_PER_RR_TLV + PRF_MODE_TLV
810                 + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV + KEY_ROTATION_RATE_TLV
811                 + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV
812                 + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV
813                 + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV
814                 + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV
815                 + RANGING_INTERVAL_TLV + DL_TDOA_BLOCK_STRIDING_TLV
816                 + LINK_LAYER_MODE_BYPASS_TLV + DATA_REPETITION_COUNT_TLV
817                 + SESSION_DATA_TRANSFER_STATUS_NTF_CONFIG_TLV
818                 + APPLICATION_DATA_ENDPOINT_HOST_TLV
819                 + VENDOR_ID_TLV + STATIC_STS_IV_TLV + ANTENNA_MODE_TLV);
820 
821         TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_2_0);
822 
823         assertThat(tlvs.getNoOfParams()).isEqualTo(45);
824         assertThat(tlvs.getByteArray()).isEqualTo(expected_data);
825     }
826 
827     @Test
testFiraContentionbasedOpenSessionParams()828     public void testFiraContentionbasedOpenSessionParams() throws Exception {
829         assumeTrue(SdkLevel.isAtLeastU());
830         FiraOpenSessionParams params =
831                 new FiraOpenSessionParams.Builder()
832                     .setProtocolVersion(FiraParams.PROTOCOL_VERSION_2_0)
833                     .setSessionId(1)
834                     .setSessionType(SESSION_TYPE_RANGING)
835                     .setRangeDataNtfConfig(RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG)
836                     .setDeviceType(RANGING_DEVICE_TYPE_CONTROLLER)
837                     .setDeviceRole(RANGING_DEVICE_ROLE_INITIATOR)
838                     .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6}))
839                     .setMultiNodeMode(MULTI_NODE_MODE_ONE_TO_MANY)
840                     .setRangingRoundUsage(RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE)
841                     .setStsConfig(STS_CONFIG_STATIC)
842                     .setVendorId(new byte[]{0x5, 0x78})
843                     .setStaticStsIV(new byte[]{0x1a, 0x55, 0x77, 0x47, 0x7e, 0x7d})
844                     .setRangeDataNtfAoaAzimuthLower(-1.5)
845                     .setRangeDataNtfAoaAzimuthUpper(2.5)
846                     .setRangeDataNtfAoaElevationLower(-1.5)
847                     .setRangeDataNtfAoaElevationUpper(1.2)
848                     .setInitiationTime(1000)
849                     .setScheduledMode(CONTENTION_BASED_RANGING)
850                     .setHasControlMessage(true)
851                     .setHasRangingControlPhase(true)
852                     .setMeasurementReportPhase(FiraParams.MEASUREMENT_REPORT_PHASE_SET)
853                     .build();
854         byte[] expected_data = UwbUtil.getByteArray(
855                 RANGING_ROUND_USAGE_SS_TWR_TLV
856                     + STS_CONFIG_STATIC_TLV
857                     + MULTI_NODE_MODE_ONE_TO_MANY_TLV
858                     + CHANNEL_NUMBER_TLV
859                     + DEVICE_MAC_ADDRESS_TLV
860                     + SLOT_DURATION_TLV
861                     + MAC_FCS_TYPE_TLV
862                     + RANGING_ROUND_CONTROL_CONTENTION_MRP_RCP_CM_RRRM_TLV
863                     + AOA_RESULT_REQ_TLV
864                     + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV
865                     + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV
866                     + RANGE_DATA_NTF_PROXIMITY_FAR_TLV
867                     + DEVICE_ROLE_INITIATOR_TLV
868                     + RFRAME_CONFIG_TLV
869                     + RSSI_REPORTING_TLV
870                     + PREAMBLE_CODE_INDEX_TLV
871                     + SFD_ID_TLV
872                     + PSDU_DATA_RATE_TLV
873                     + PREAMBLE_DURATION_TLV
874                     + RANGING_TIME_STRUCT_TLV
875                     + SLOTS_PER_RR_TLV
876                     + PRF_MODE_TLV
877                     + SCHEDULED_MODE_CONTENTION_TLV
878                     + KEY_ROTATION_TLV
879                     + KEY_ROTATION_RATE_TLV
880                     + SESSION_PRIORITY_TLV
881                     + MAC_ADDRESS_MODE_TLV
882                     + NUMBER_OF_STS_SEGMENTS_TLV
883                     + MAX_RR_RETRY_TLV
884                     + HOPPING_MODE_TLV
885                     + BLOCK_STRIDE_LENGTH_TLV
886                     + RESULT_REPORT_CONFIG_TLV
887                     + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV
888                     + BPRF_PHR_DATA_RATE_TLV
889                     + MAX_NUMBER_OF_MEASUREMENTS_TLV
890                     + STS_LENGTH_TLV
891                     + RANGING_INTERVAL_TLV
892                     + DEVICE_TYPE_CONTROLLER_TLV
893                     + UWB_INITIATION_TIME_2_0_TLV
894                     + LINK_LAYER_MODE_BYPASS_TLV
895                     + DATA_REPETITION_COUNT_TLV
896                     + SESSION_DATA_TRANSFER_STATUS_NTF_CONFIG_TLV
897                     + APPLICATION_DATA_ENDPOINT_HOST_TLV
898                     + VENDOR_ID_TLV
899                     + STATIC_STS_IV_TLV
900                     + RANGE_DATA_NTF_AOA_BOUND_TLV
901                     + CAP_SIZE_RANGE_DEFAULT_TLV
902                     + ANTENNA_MODE_TLV);
903         TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_2_0);
904 
905         assertThat(tlvs.getNoOfParams()).isEqualTo(48);
906         assertThat(tlvs.getByteArray()).isEqualTo(expected_data);
907     }
908 
909     @Test
testFiraOpenSessionParamsForEnabledReferenceTimeBase()910     public void testFiraOpenSessionParamsForEnabledReferenceTimeBase() throws Exception {
911         assumeTrue(SdkLevel.isAtLeastU());
912         FiraOpenSessionParams params =
913                 new FiraOpenSessionParams.Builder()
914                         .setProtocolVersion(FiraParams.PROTOCOL_VERSION_2_0)
915                         .setSessionId(1)
916                         .setSessionType(SESSION_TYPE_RANGING)
917                         .setRangeDataNtfConfig(
918                                 RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG)
919                         .setDeviceType(RANGING_DEVICE_TYPE_CONTROLLER)
920                         .setDeviceRole(RANGING_DEVICE_ROLE_RESPONDER)
921                         .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6}))
922                         .setDestAddressList(Arrays.asList(UwbAddress.fromBytes(
923                                 new byte[]{0x4, 0x6})))
924                         .setMultiNodeMode(MULTI_NODE_MODE_UNICAST)
925                         .setRangingRoundUsage(RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE)
926                         .setStsConfig(STS_CONFIG_STATIC)
927                         .setVendorId(new byte[]{0x5, 0x78})
928                         .setStaticStsIV(new byte[]{0x1a, 0x55, 0x77, 0x47, 0x7e, 0x7d})
929                         .setRangeDataNtfAoaAzimuthLower(-1.5)
930                         .setRangeDataNtfAoaAzimuthUpper(2.5)
931                         .setRangeDataNtfAoaElevationLower(-1.5)
932                         .setRangeDataNtfAoaElevationUpper(1.2)
933                         .setInitiationTime(1000)
934                         .setSessionTimeBase(1, 1, 200)
935                         .build();
936 
937         byte[] expected_data = UwbUtil.getByteArray(RANGING_ROUND_USAGE_SS_TWR_TLV
938                     + STS_CONFIG_STATIC_TLV + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV
939                     + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV
940                     + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV
941                     + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV
942                     + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_RESPONDER_TLV
943                     + RFRAME_CONFIG_TLV
944                     + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV + SFD_ID_TLV
945                     + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV
946                     + SLOTS_PER_RR_TLV
947                     + PRF_MODE_TLV + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV
948                     + KEY_ROTATION_RATE_TLV
949                     + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV
950                     + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV
951                     + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV
952                     + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV
953                     + RANGING_INTERVAL_TLV + DEVICE_TYPE_CONTROLLER_TLV + NUMBER_OF_CONTROLEES_TLV
954                     + DST_MAC_ADDRESS_TLV + UWB_INITIATION_TIME_2_0_TLV
955                     + LINK_LAYER_MODE_BYPASS_TLV
956                     + DATA_REPETITION_COUNT_TLV
957                     + SESSION_DATA_TRANSFER_STATUS_NTF_CONFIG_TLV
958                     + APPLICATION_DATA_ENDPOINT_HOST_TLV
959                     + SESSION_TIME_BASE_TLV
960                     + VENDOR_ID_TLV + STATIC_STS_IV_TLV
961                     + RANGE_DATA_NTF_AOA_BOUND_TLV + ANTENNA_MODE_TLV);
962         TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_2_0);
963 
964         assertThat(tlvs.getNoOfParams()).isEqualTo(50);
965         assertThat(tlvs.getByteArray()).isEqualTo(expected_data);
966     }
967 }
968