ScanTestUtil.java revision 41e38d84f562e12198f7db0d45f633712cae6cba
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.*; 20import static org.mockito.Mockito.when; 21 22import android.net.wifi.ScanResult; 23import android.net.wifi.WifiScanner; 24import android.net.wifi.WifiScanner.ChannelSpec; 25import android.net.wifi.WifiScanner.ScanData; 26import android.net.wifi.WifiScanner.ScanSettings; 27import android.net.wifi.WifiSsid; 28 29import com.android.server.wifi.WifiNative.BucketSettings; 30 31import java.lang.reflect.Field; 32import java.util.Arrays; 33import java.util.HashSet; 34import java.util.Set; 35 36/** 37 * Utilities for testing Wifi Scanning 38 */ 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 public static class NativeScanSettingsBuilder { 86 private final WifiNative.ScanSettings settings = new WifiNative.ScanSettings(); 87 public NativeScanSettingsBuilder() { 88 settings.buckets = new WifiNative.BucketSettings[0]; 89 settings.num_buckets = 0; 90 settings.report_threshold_percent = 100; 91 } 92 93 public NativeScanSettingsBuilder withBasePeriod(int basePeriod) { 94 settings.base_period_ms = basePeriod; 95 return this; 96 } 97 public NativeScanSettingsBuilder withMaxApPerScan(int maxAp) { 98 settings.max_ap_per_scan = maxAp; 99 return this; 100 } 101 public NativeScanSettingsBuilder withMaxScansToCache(int maxScans) { 102 settings.report_threshold_num_scans = maxScans; 103 return this; 104 } 105 106 public NativeScanSettingsBuilder addBucketWithBand( 107 int period, int report_events, int band) { 108 WifiNative.BucketSettings bucket = new WifiNative.BucketSettings(); 109 bucket.bucket = settings.num_buckets; 110 bucket.band = band; 111 bucket.period_ms = period; 112 bucket.report_events = report_events; 113 return addBucket(bucket); 114 } 115 116 public NativeScanSettingsBuilder addBucketWithChannels( 117 int period, int report_events, int... channels) { 118 WifiNative.BucketSettings bucket = new WifiNative.BucketSettings(); 119 bucket.bucket = settings.num_buckets; 120 bucket.band = WifiScanner.WIFI_BAND_UNSPECIFIED; 121 bucket.num_channels = channels.length; 122 bucket.channels = new WifiNative.ChannelSettings[channels.length]; 123 for (int i = 0; i < channels.length; ++i) { 124 bucket.channels[i] = new WifiNative.ChannelSettings(); 125 bucket.channels[i].frequency = channels[i]; 126 } 127 bucket.period_ms = period; 128 bucket.report_events = report_events; 129 return addBucket(bucket); 130 } 131 132 public NativeScanSettingsBuilder addBucket(WifiNative.BucketSettings bucket) { 133 settings.buckets = Arrays.copyOf(settings.buckets, settings.num_buckets + 1); 134 settings.buckets[settings.num_buckets] = bucket; 135 settings.num_buckets = settings.num_buckets + 1; 136 return this; 137 } 138 139 public WifiNative.ScanSettings build() { 140 return settings; 141 } 142 } 143 144 public static Set<Integer> createFreqSet(int... elements) { 145 Set<Integer> set = new HashSet<>(); 146 for (int e : elements) { 147 set.add(e); 148 } 149 return set; 150 } 151 152 public static ScanResult createScanResult(int freq) { 153 return new ScanResult(WifiSsid.createFromAsciiEncoded("AN SSID"), "00:00:00:00:00:00", "", 154 0, freq, 0); 155 } 156 157 public static ScanData createScanData(int... freqs) { 158 ScanResult[] results = new ScanResult[freqs.length]; 159 for (int i = 0; i < freqs.length; ++i) { 160 results[i] = createScanResult(freqs[i]); 161 } 162 return new ScanData(0, 0, results); 163 } 164 165 public static ScanData[] createScanDatas(int[][] freqs) { 166 ScanData[] data = new ScanData[freqs.length]; 167 for (int i = 0; i < freqs.length; ++i) { 168 data[i] = createScanData(freqs[i]); 169 } 170 return data; 171 } 172 173 public static void assertScanDatasEquals(ScanData[] expected, ScanData[] actual) { 174 assertNotNull(expected); 175 assertNotNull(actual); 176 assertEquals("ScanData.length", expected.length, actual.length); 177 for (int i = 0; i < expected.length; ++i) { 178 ScanData expectedData = expected[i]; 179 ScanData actualData = actual[i]; 180 assertEquals("ScanData["+i+"].id", expectedData.getId(), actualData.getId()); 181 assertEquals("ScanData["+i+"].flags", expectedData.getFlags(), actualData.getFlags()); 182 assertEquals("ScanData["+i+"].results.length", 183 expectedData.getResults().length, actualData.getResults().length); 184 for (int j = 0; j < expectedData.getResults().length; ++ j) { 185 ScanResult expectedResult = expectedData.getResults()[j]; 186 ScanResult actualResult = actualData.getResults()[j]; 187 assertEquals("ScanData["+i+"].results["+j+"].SSID", 188 expectedResult.SSID, actualResult.SSID); 189 assertEquals("ScanData["+i+"].results["+j+"].wifiSsid", 190 expectedResult.wifiSsid.toString(), actualResult.wifiSsid.toString()); 191 assertEquals("ScanData["+i+"].results["+j+"].BSSID", 192 expectedResult.BSSID, actualResult.BSSID); 193 assertEquals("ScanData["+i+"].results["+j+"].capabilities", 194 expectedResult.capabilities, actualResult.capabilities); 195 assertEquals("ScanData["+i+"].results["+j+"].level", 196 expectedResult.level, actualResult.level); 197 assertEquals("ScanData["+i+"].results["+j+"].frequency", 198 expectedResult.frequency, actualResult.frequency); 199 assertEquals("ScanData["+i+"].results["+j+"].timestamp", 200 expectedResult.timestamp, actualResult.timestamp); 201 assertEquals("ScanData["+i+"].results["+j+"].frequency", 202 expectedResult.seen, actualResult.seen); 203 } 204 } 205 } 206 207 public static WifiScanner.ChannelSpec[] channelsToSpec(int... channels) { 208 WifiScanner.ChannelSpec[] channelSpecs = new WifiScanner.ChannelSpec[channels.length]; 209 for (int i = 0; i < channels.length; ++i) { 210 channelSpecs[i] = new WifiScanner.ChannelSpec(channels[i]); 211 } 212 return channelSpecs; 213 } 214 215 public static ChannelSpec[] getAllChannels(BucketSettings bucket) { 216 if (bucket.band == WifiScanner.WIFI_BAND_UNSPECIFIED) { 217 ChannelSpec[] channels = new ChannelSpec[bucket.num_channels]; 218 for (int i = 0; i < bucket.num_channels; i++) { 219 channels[i] = new ChannelSpec(bucket.channels[i].frequency); 220 } 221 return channels; 222 } else { 223 return WifiChannelHelper.getChannelsForBand(bucket.band); 224 } 225 } 226 public static ChannelSpec[] getAllChannels(ScanSettings settings) { 227 if (settings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) { 228 ChannelSpec[] channels = new ChannelSpec[settings.channels.length]; 229 for (int i = 0; i < settings.channels.length; i++) { 230 channels[i] = new ChannelSpec(settings.channels[i].frequency); 231 } 232 return channels; 233 } else { 234 return WifiChannelHelper.getChannelsForBand(settings.band); 235 } 236 } 237} 238