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