ScanTestUtil.java revision 2771787818003e53e8175036a3d09688c783f350
1/* 2 * Copyright (C) 2015 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 17package com.android.server.wifi; 18 19import static org.junit.Assert.assertEquals; 20import static org.junit.Assert.assertNotNull; 21import static org.mockito.Mockito.when; 22 23import android.net.wifi.ScanResult; 24import android.net.wifi.WifiScanner; 25import android.net.wifi.WifiScanner.ChannelSpec; 26import android.net.wifi.WifiScanner.ScanData; 27import android.net.wifi.WifiScanner.ScanSettings; 28import android.net.wifi.WifiSsid; 29 30import com.android.server.wifi.WifiNative.BucketSettings; 31 32import java.lang.reflect.Field; 33import java.util.Arrays; 34import java.util.HashSet; 35import java.util.Set; 36 37/** 38 * Utilities for testing Wifi Scanning 39 */ 40public class ScanTestUtil { 41 42 public static void installWlanWifiNative(WifiNative wifiNative) throws Exception { 43 Field field = WifiNative.class.getDeclaredField("wlanNativeInterface"); 44 field.setAccessible(true); 45 field.set(null, wifiNative); 46 47 // Clear static state 48 WifiChannelHelper.clearChannelCache(); 49 } 50 51 public static void setupMockChannels(WifiNative wifiNative, int[] channels24, int[] channels5, 52 int[] channelsDfs) throws Exception { 53 when(wifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_24_GHZ)) 54 .thenReturn(channels24); 55 when(wifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_5_GHZ)) 56 .thenReturn(channels5); 57 when(wifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY)) 58 .thenReturn(channelsDfs); 59 } 60 61 public static ScanSettings createRequest(WifiScanner.ChannelSpec[] channels, int period, 62 int batch, int bssidsPerScan, int reportEvents) { 63 ScanSettings request = new ScanSettings(); 64 request.band = WifiScanner.WIFI_BAND_UNSPECIFIED; 65 request.channels = channels; 66 request.periodInMs = period; 67 request.numBssidsPerScan = bssidsPerScan; 68 request.maxScansToCache = batch; 69 request.reportEvents = reportEvents; 70 return request; 71 } 72 73 public static ScanSettings createRequest(int band, int period, int batch, int bssidsPerScan, 74 int reportEvents) { 75 ScanSettings request = new ScanSettings(); 76 request.band = band; 77 request.channels = null; 78 request.periodInMs = period; 79 request.numBssidsPerScan = bssidsPerScan; 80 request.maxScansToCache = batch; 81 request.reportEvents = reportEvents; 82 return request; 83 } 84 85 /** 86 * Create an exponential back off scan request if maxPeriod != period && maxPeriod != 0. 87 */ 88 public static ScanSettings createRequest(int band, int period, int maxPeriod, int stepCount, 89 int batch, int bssidsPerScan, int reportEvents) { 90 ScanSettings request = new ScanSettings(); 91 request.band = band; 92 request.channels = null; 93 request.periodInMs = period; 94 request.maxPeriodInMs = maxPeriod; 95 request.stepCount = stepCount; 96 request.numBssidsPerScan = bssidsPerScan; 97 request.maxScansToCache = batch; 98 request.reportEvents = reportEvents; 99 return request; 100 } 101 102 /** 103 * Builder to create WifiNative.ScanSettings objects for testing 104 */ 105 public static class NativeScanSettingsBuilder { 106 private final WifiNative.ScanSettings mSettings = new WifiNative.ScanSettings(); 107 public NativeScanSettingsBuilder() { 108 mSettings.buckets = new WifiNative.BucketSettings[0]; 109 mSettings.num_buckets = 0; 110 mSettings.report_threshold_percent = 100; 111 } 112 113 public NativeScanSettingsBuilder withBasePeriod(int basePeriod) { 114 mSettings.base_period_ms = basePeriod; 115 return this; 116 } 117 public NativeScanSettingsBuilder withMaxApPerScan(int maxAp) { 118 mSettings.max_ap_per_scan = maxAp; 119 return this; 120 } 121 public NativeScanSettingsBuilder withMaxScansToCache(int maxScans) { 122 mSettings.report_threshold_num_scans = maxScans; 123 return this; 124 } 125 126 public NativeScanSettingsBuilder addBucketWithBand( 127 int period, int reportEvents, int band) { 128 WifiNative.BucketSettings bucket = new WifiNative.BucketSettings(); 129 bucket.bucket = mSettings.num_buckets; 130 bucket.band = band; 131 bucket.period_ms = period; 132 bucket.report_events = reportEvents; 133 return addBucket(bucket); 134 } 135 136 public NativeScanSettingsBuilder addBucketWithChannels( 137 int period, int reportEvents, int... channels) { 138 WifiNative.BucketSettings bucket = new WifiNative.BucketSettings(); 139 bucket.bucket = mSettings.num_buckets; 140 bucket.band = WifiScanner.WIFI_BAND_UNSPECIFIED; 141 bucket.num_channels = channels.length; 142 bucket.channels = new WifiNative.ChannelSettings[channels.length]; 143 for (int i = 0; i < channels.length; ++i) { 144 bucket.channels[i] = new WifiNative.ChannelSettings(); 145 bucket.channels[i].frequency = channels[i]; 146 } 147 bucket.period_ms = period; 148 bucket.report_events = reportEvents; 149 return addBucket(bucket); 150 } 151 152 public NativeScanSettingsBuilder addBucket(WifiNative.BucketSettings bucket) { 153 mSettings.buckets = Arrays.copyOf(mSettings.buckets, mSettings.num_buckets + 1); 154 mSettings.buckets[mSettings.num_buckets] = bucket; 155 mSettings.num_buckets = mSettings.num_buckets + 1; 156 return this; 157 } 158 159 public WifiNative.ScanSettings build() { 160 return mSettings; 161 } 162 } 163 164 public static Set<Integer> createFreqSet(int... elements) { 165 Set<Integer> set = new HashSet<>(); 166 for (int e : elements) { 167 set.add(e); 168 } 169 return set; 170 } 171 172 public static ScanResult createScanResult(int freq) { 173 return new ScanResult(WifiSsid.createFromAsciiEncoded("AN SSID"), "00:00:00:00:00:00", "", 174 0, freq, 0); 175 } 176 177 public static ScanData createScanData(int... freqs) { 178 ScanResult[] results = new ScanResult[freqs.length]; 179 for (int i = 0; i < freqs.length; ++i) { 180 results[i] = createScanResult(freqs[i]); 181 } 182 return new ScanData(0, 0, results); 183 } 184 185 public static ScanData[] createScanDatas(int[][] freqs) { 186 ScanData[] data = new ScanData[freqs.length]; 187 for (int i = 0; i < freqs.length; ++i) { 188 data[i] = createScanData(freqs[i]); 189 } 190 return data; 191 } 192 193 private static void assertScanDataEquals(String prefix, ScanData expected, ScanData actual) { 194 assertNotNull(prefix + "expected ScanData was null", expected); 195 assertNotNull(prefix + "actual ScanData was null", actual); 196 assertEquals(prefix + "id", expected.getId(), actual.getId()); 197 assertEquals(prefix + "flags", expected.getFlags(), actual.getFlags()); 198 assertEquals(prefix + "results.length", 199 expected.getResults().length, actual.getResults().length); 200 for (int j = 0; j < expected.getResults().length; ++j) { 201 ScanResult expectedResult = expected.getResults()[j]; 202 ScanResult actualResult = actual.getResults()[j]; 203 assertEquals(prefix + "results[" + j + "].SSID", 204 expectedResult.SSID, actualResult.SSID); 205 assertEquals(prefix + "results[" + j + "].wifiSsid", 206 expectedResult.wifiSsid.toString(), actualResult.wifiSsid.toString()); 207 assertEquals(prefix + "results[" + j + "].BSSID", 208 expectedResult.BSSID, actualResult.BSSID); 209 assertEquals(prefix + "results[" + j + "].capabilities", 210 expectedResult.capabilities, actualResult.capabilities); 211 assertEquals(prefix + "results[" + j + "].level", 212 expectedResult.level, actualResult.level); 213 assertEquals(prefix + "results[" + j + "].frequency", 214 expectedResult.frequency, actualResult.frequency); 215 assertEquals(prefix + "results[" + j + "].timestamp", 216 expectedResult.timestamp, actualResult.timestamp); 217 assertEquals(prefix + "results[" + j + "].seen", 218 expectedResult.seen, actualResult.seen); 219 } 220 } 221 222 public static void assertScanDataEquals(ScanData expected, ScanData actual) { 223 assertScanDataEquals("", expected, actual); 224 } 225 226 public static void assertScanDatasEquals(String prefix, ScanData[] expected, ScanData[] actual) { 227 assertNotNull("expected " + prefix + "ScanData[] was null", expected); 228 assertNotNull("actaul " + prefix + "ScanData[] was null", actual); 229 assertEquals(prefix + "ScanData.length", expected.length, actual.length); 230 for (int i = 0; i < expected.length; ++i) { 231 assertScanDataEquals(prefix + "ScanData[" + i + "].", expected[i], actual[i]); 232 } 233 } 234 235 public static void assertScanDatasEquals(ScanData[] expected, ScanData[] actual) { 236 assertScanDatasEquals("", expected, actual); 237 } 238 239 public static WifiScanner.ChannelSpec[] channelsToSpec(int... channels) { 240 WifiScanner.ChannelSpec[] channelSpecs = new WifiScanner.ChannelSpec[channels.length]; 241 for (int i = 0; i < channels.length; ++i) { 242 channelSpecs[i] = new WifiScanner.ChannelSpec(channels[i]); 243 } 244 return channelSpecs; 245 } 246 247 public static ChannelSpec[] getAllChannels(BucketSettings bucket) { 248 if (bucket.band == WifiScanner.WIFI_BAND_UNSPECIFIED) { 249 ChannelSpec[] channels = new ChannelSpec[bucket.num_channels]; 250 for (int i = 0; i < bucket.num_channels; i++) { 251 channels[i] = new ChannelSpec(bucket.channels[i].frequency); 252 } 253 return channels; 254 } else { 255 return WifiChannelHelper.getChannelsForBand(bucket.band); 256 } 257 } 258 public static ChannelSpec[] getAllChannels(ScanSettings settings) { 259 if (settings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) { 260 ChannelSpec[] channels = new ChannelSpec[settings.channels.length]; 261 for (int i = 0; i < settings.channels.length; i++) { 262 channels[i] = new ChannelSpec(settings.channels[i].frequency); 263 } 264 return channels; 265 } else { 266 return WifiChannelHelper.getChannelsForBand(settings.band); 267 } 268 } 269} 270