1 /*
2  * Copyright (C) 2017 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.wifi.rtt;
18 
19 import android.net.MacAddress;
20 import android.net.wifi.ScanResult;
21 import android.net.wifi.rtt.RangingRequest;
22 import android.net.wifi.rtt.RangingResult;
23 import android.net.wifi.rtt.ResponderConfig;
24 import android.util.Pair;
25 
26 import java.util.ArrayList;
27 import java.util.List;
28 
29 /**
30  * Utilities for the Rtt unit test suite.
31  */
32 public class RttTestUtils {
33     /**
34      * Compare the two lists and return true for equality, false otherwise. The two lists are
35      * considered identical if they have the same number of elements and contain equal elements
36      * (equality of elements using the equal() operator of the component objects).
37      *
38      * Note: null != empty list
39      */
compareListContentsNoOrdering(List a, List b)40     public static boolean compareListContentsNoOrdering(List a, List b) {
41         if (a == b) {
42             return true;
43         }
44         if (a == null || b == null) {
45             return false; // at this point they're not both null
46         }
47         if (a.size() != b.size()) { // at this point neither is null
48             return false;
49         }
50         return a.containsAll(b) && b.containsAll(a);
51     }
52 
53     /**
54      * Returns a placeholder ranging request with 3 requests and a non-default in-range burst size:
55      * - First: 802.11mc capable
56      * - Second: 802.11mc not capable
57      * - Third: Aware peer
58      */
getDummyRangingRequest(byte lastMacByte)59     public static RangingRequest getDummyRangingRequest(byte lastMacByte) {
60         RangingRequest.Builder builder = new RangingRequest.Builder();
61 
62         ScanResult scan1 = new ScanResult();
63         scan1.BSSID = "00:01:02:03:04:" + String.format("%02d", lastMacByte);
64         scan1.setFlag(ScanResult.FLAG_80211mc_RESPONDER);
65         scan1.channelWidth = ScanResult.CHANNEL_WIDTH_40MHZ;
66         ScanResult scan2 = new ScanResult();
67         scan2.BSSID = "0A:0B:0C:0D:0E:" + String.format("%02d", lastMacByte);
68         scan2.channelWidth = ScanResult.CHANNEL_WIDTH_20MHZ;
69         MacAddress mac1 = MacAddress.fromString("08:09:08:07:06:05");
70 
71         builder.addAccessPoint(scan1);
72         builder.addNon80211mcCapableAccessPoint(scan2);
73         // Changing default RTT burst size to a valid, but maximum, value
74         builder.setRttBurstSize(RangingRequest.getMaxRttBurstSize());
75         builder.addWifiAwarePeer(mac1);
76         return builder.build();
77     }
78 
79     /**
80      * Returns a placeholder ranging request with 4 requests and a non-default in-range burst size:
81      * - First: 802.11mc capable
82      * - Second: 802.11mc not capable
83      * - Third: Aware peer
84      * - Fourth: 802.11az & 802.11mc capable
85      */
getDummyRangingRequestWith11az(byte lastMacByte)86     public static RangingRequest getDummyRangingRequestWith11az(byte lastMacByte) {
87         RangingRequest.Builder builder = new RangingRequest.Builder();
88 
89         ScanResult scan1 = new ScanResult();
90         scan1.BSSID = "00:01:02:03:04:" + String.format("%02d", lastMacByte);
91         scan1.setFlag(ScanResult.FLAG_80211mc_RESPONDER);
92         scan1.channelWidth = ScanResult.CHANNEL_WIDTH_40MHZ;
93         ScanResult scan2 = new ScanResult();
94         scan2.BSSID = "0A:0B:0C:0D:0E:" + String.format("%02d", lastMacByte);
95         scan2.channelWidth = ScanResult.CHANNEL_WIDTH_20MHZ;
96         MacAddress mac1 = MacAddress.fromString("08:09:08:07:06:05");
97 
98         builder.addAccessPoint(scan1);
99         builder.addNon80211mcCapableAccessPoint(scan2);
100         // Changing default RTT burst size to a valid, but maximum, value
101         builder.setRttBurstSize(RangingRequest.getMaxRttBurstSize());
102         builder.addWifiAwarePeer(mac1);
103         // Add 11az & 11mc supported AP
104         scan1.BSSID = "00:11:22:33:44:" + String.format("%02d", lastMacByte);
105         scan1.setFlag(ScanResult.FLAG_80211mc_RESPONDER);
106         scan1.setFlag(ScanResult.FLAG_80211az_NTB_RESPONDER);
107         scan1.channelWidth = ScanResult.CHANNEL_WIDTH_40MHZ;
108         builder.addAccessPoint(scan1);
109         return builder.build();
110     }
111     /**
112      * Returns a placeholder ranging request with 11mc request with a specified burst size.
113      */
getDummyRangingRequestMcOnly(byte lastMacByte, int rttBurstSize)114     public static RangingRequest getDummyRangingRequestMcOnly(byte lastMacByte, int rttBurstSize) {
115         RangingRequest.Builder builder = new RangingRequest.Builder();
116 
117         ScanResult scan1 = new ScanResult();
118         scan1.BSSID = "00:01:02:03:04:" + String.format("%02d", lastMacByte);
119         scan1.setFlag(ScanResult.FLAG_80211mc_RESPONDER);
120         scan1.channelWidth = ScanResult.CHANNEL_WIDTH_40MHZ;
121 
122         builder.addAccessPoint(scan1);
123         builder.setRttBurstSize(rttBurstSize);
124 
125         return builder.build();
126     }
127 
128     /**
129      * Returns a placeholder ranging request with 2 requests - neither of which support 802.11mc.
130      */
getDummyRangingRequestNo80211mcSupport(byte lastMacByte)131     public static RangingRequest getDummyRangingRequestNo80211mcSupport(byte lastMacByte) {
132         RangingRequest.Builder builder = new RangingRequest.Builder();
133 
134         ScanResult scan1 = new ScanResult();
135         scan1.BSSID = "00:01:02:03:04:" + String.format("%02d", lastMacByte);
136         ScanResult scan2 = new ScanResult();
137         scan2.BSSID = "0A:0B:0C:0D:0E:" + String.format("%02d", lastMacByte);
138 
139         builder.addNon80211mcCapableAccessPoint(scan1);
140         builder.addNon80211mcCapableAccessPoint(scan2);
141 
142         return builder.build();
143     }
144 
145     /**
146      * Returns a matched set of placeholder ranging results: HAL RttResult and the public API
147      * RangingResult.
148      *
149      * @param request If non-null will be used as a template (BSSID) for the range results.
150      */
getDummyRangingResults( RangingRequest request)151     public static Pair<List<RangingResult>, List<RangingResult>> getDummyRangingResults(
152             RangingRequest request) {
153         int rangeCmBase = 15;
154         int rangeStdDevCmBase = 3;
155         int rssiBase = -20;
156         long rangeTimestampBase = 666;
157         List<RangingResult> halResults = new ArrayList<>();
158         List<RangingResult> results = new ArrayList<>();
159 
160         if (request != null) {
161             for (ResponderConfig peer : request.mRttPeers) {
162                 halResults.add(new RangingResult.Builder()
163                         .setStatus(RangingResult.STATUS_SUCCESS)
164                         .setMacAddress(peer.getMacAddress())
165                         .setDistanceMm(rangeCmBase)
166                         .setDistanceStdDevMm(rangeStdDevCmBase)
167                         .setRssi(rssiBase)
168                         .setNumAttemptedMeasurements(8)
169                         .setNumSuccessfulMeasurements(5)
170                         .setRangingTimestampMillis(rangeTimestampBase)
171                         .set80211mcMeasurement(true)
172                         .setMeasurementChannelFrequencyMHz(5180)
173                         .setMeasurementBandwidth(ScanResult.CHANNEL_WIDTH_40MHZ)
174                         .build());
175                 RangingResult.Builder builder = new RangingResult.Builder()
176                         .setStatus(RangingResult.STATUS_SUCCESS)
177                         .setDistanceMm(rangeCmBase++)
178                         .setDistanceStdDevMm(rangeStdDevCmBase++)
179                         .setRssi(rssiBase++)
180                         .setNumAttemptedMeasurements(8)
181                         .setNumSuccessfulMeasurements(5)
182                         .setRangingTimestampMillis(rangeTimestampBase++)
183                         .set80211mcMeasurement(true)
184                         .setMeasurementChannelFrequencyMHz(5180)
185                         .setMeasurementBandwidth(ScanResult.CHANNEL_WIDTH_40MHZ);
186                 if (peer.peerHandle == null) {
187                     builder.setMacAddress(peer.getMacAddress());
188                 } else {
189                     builder.setPeerHandle(peer.peerHandle);
190                 }
191                 RangingResult rangingResult = builder.build();
192                 results.add(rangingResult);
193             }
194         } else {
195             results.add(new RangingResult.Builder()
196                     .setStatus(RangingResult.STATUS_SUCCESS)
197                     .setMacAddress(MacAddress.fromString("10:01:02:03:04:05"))
198                     .setDistanceMm(rangeCmBase++)
199                     .setDistanceStdDevMm(rangeStdDevCmBase++)
200                     .setRssi(rssiBase++)
201                     .setNumAttemptedMeasurements(8)
202                     .setNumSuccessfulMeasurements(4)
203                     .setRangingTimestampMillis(rangeTimestampBase++)
204                     .set80211mcMeasurement(true)
205                     .setMeasurementChannelFrequencyMHz(5180)
206                     .setMeasurementBandwidth(ScanResult.CHANNEL_WIDTH_40MHZ)
207                     .build());
208             results.add(new RangingResult.Builder()
209                     .setStatus(RangingResult.STATUS_SUCCESS)
210                     .setMacAddress(MacAddress.fromString("1A:0B:0C:0D:0E:0F"))
211                     .setDistanceMm(rangeCmBase++)
212                     .setDistanceStdDevMm(rangeStdDevCmBase++)
213                     .setRssi(rssiBase++)
214                     .setNumAttemptedMeasurements(9)
215                     .setNumSuccessfulMeasurements(3)
216                     .setRangingTimestampMillis(rangeTimestampBase++)
217                     .set80211mcMeasurement(true)
218                     .setMeasurementChannelFrequencyMHz(5180)
219                     .setMeasurementBandwidth(ScanResult.CHANNEL_WIDTH_40MHZ)
220                     .build());
221             results.add(new RangingResult.Builder()
222                     .setStatus(RangingResult.STATUS_SUCCESS)
223                     .setMacAddress(MacAddress.fromString("08:09:08:07:06:05"))
224                     .setDistanceMm(rangeCmBase++)
225                     .setDistanceStdDevMm(rangeStdDevCmBase++)
226                     .setRssi(rssiBase++)
227                     .setNumAttemptedMeasurements(10)
228                     .setNumSuccessfulMeasurements(2)
229                     .setRangingTimestampMillis(rangeTimestampBase++)
230                     .set80211mcMeasurement(true)
231                     .setMeasurementChannelFrequencyMHz(5180)
232                     .setMeasurementBandwidth(ScanResult.CHANNEL_WIDTH_40MHZ)
233                     .build());
234             halResults.addAll(results);
235         }
236 
237         return new Pair<>(halResults, results);
238     }
239 }
240