1297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills/* 2297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * Copyright (C) 2015 The Android Open Source Project 3297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * 4297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * Licensed under the Apache License, Version 2.0 (the "License"); 5297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * you may not use this file except in compliance with the License. 6297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * You may obtain a copy of the License at 7297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * 8297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * http://www.apache.org/licenses/LICENSE-2.0 9297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * 10297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * Unless required by applicable law or agreed to in writing, software 11297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * distributed under the License is distributed on an "AS IS" BASIS, 12297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * See the License for the specific language governing permissions and 14a8367288377cbaed6371256ca837b7aa22280706Mitchell Wills * limitations under the License. 15297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills */ 16297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills 17297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willspackage com.android.server.wifi; 18297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills 19c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Willsimport static org.junit.Assert.*; 20c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Willsimport static org.junit.Assume.*; 21c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Willsimport static org.mockito.Mockito.*; 22d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills 23297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport android.net.wifi.ScanResult; 24297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport android.net.wifi.WifiScanner; 25297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport android.net.wifi.WifiScanner.ScanData; 26297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport android.net.wifi.WifiSsid; 27297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills 28712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Willsimport org.hamcrest.Description; 29712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Willsimport org.hamcrest.Matcher; 30712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Willsimport org.hamcrest.TypeSafeDiagnosingMatcher; 31712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 3241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport java.util.Arrays; 3341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport java.util.HashSet; 3441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport java.util.Set; 35297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills 36297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills/** 37297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * Utilities for testing Wifi Scanning 38297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills */ 39297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willspublic class ScanTestUtil { 40297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills 41297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills public static void setupMockChannels(WifiNative wifiNative, int[] channels24, int[] channels5, 42297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills int[] channelsDfs) throws Exception { 43297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills when(wifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_24_GHZ)) 44297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills .thenReturn(channels24); 45297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills when(wifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_5_GHZ)) 46297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills .thenReturn(channels5); 47297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills when(wifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY)) 48297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills .thenReturn(channelsDfs); 49297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills } 50297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills 51d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills public static WifiScanner.ScanSettings createRequest(WifiScanner.ChannelSpec[] channels, 52d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills int period, int batch, int bssidsPerScan, int reportEvents) { 53d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills WifiScanner.ScanSettings request = new WifiScanner.ScanSettings(); 54297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills request.band = WifiScanner.WIFI_BAND_UNSPECIFIED; 55297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills request.channels = channels; 56297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills request.periodInMs = period; 57297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills request.numBssidsPerScan = bssidsPerScan; 58297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills request.maxScansToCache = batch; 59297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills request.reportEvents = reportEvents; 60297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills return request; 61297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills } 62297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills 63d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills public static WifiScanner.ScanSettings createRequest(int band, int period, int batch, 64d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills int bssidsPerScan, int reportEvents) { 6594bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills return createRequest(band, period, 0, 0, batch, bssidsPerScan, reportEvents); 66297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills } 67297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills 6872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills /** 69f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan * Create an exponential back off scan request if maxPeriod != period && maxPeriod != 0. 70f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan */ 71d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills public static WifiScanner.ScanSettings createRequest(int band, int period, int maxPeriod, 72d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills int stepCount, int batch, int bssidsPerScan, int reportEvents) { 73d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills WifiScanner.ScanSettings request = new WifiScanner.ScanSettings(); 74f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan request.band = band; 75f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan request.channels = null; 76f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan request.periodInMs = period; 77f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan request.maxPeriodInMs = maxPeriod; 78f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan request.stepCount = stepCount; 79f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan request.numBssidsPerScan = bssidsPerScan; 80f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan request.maxScansToCache = batch; 81f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan request.reportEvents = reportEvents; 82f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan return request; 83f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan } 84f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan 85f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan /** 8672c639e8b97067e948eca8be50dfea3173121090Mitchell Wills * Builder to create WifiNative.ScanSettings objects for testing 8772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills */ 8841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills public static class NativeScanSettingsBuilder { 8972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills private final WifiNative.ScanSettings mSettings = new WifiNative.ScanSettings(); 9041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills public NativeScanSettingsBuilder() { 9172c639e8b97067e948eca8be50dfea3173121090Mitchell Wills mSettings.buckets = new WifiNative.BucketSettings[0]; 9272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills mSettings.num_buckets = 0; 9372c639e8b97067e948eca8be50dfea3173121090Mitchell Wills mSettings.report_threshold_percent = 100; 9441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 9541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 9641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills public NativeScanSettingsBuilder withBasePeriod(int basePeriod) { 9772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills mSettings.base_period_ms = basePeriod; 9841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills return this; 9941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 10041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills public NativeScanSettingsBuilder withMaxApPerScan(int maxAp) { 10172c639e8b97067e948eca8be50dfea3173121090Mitchell Wills mSettings.max_ap_per_scan = maxAp; 10241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills return this; 10341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 10441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills public NativeScanSettingsBuilder withMaxScansToCache(int maxScans) { 10572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills mSettings.report_threshold_num_scans = maxScans; 10641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills return this; 10741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 108d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills public NativeScanSettingsBuilder withMaxPercentToCache(int percent) { 109d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills mSettings.report_threshold_percent = percent; 110d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills return this; 111d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills } 11241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 113d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius /** 1146259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius * Add the provided hidden network SSIDs to scan request. 1156259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius * @param networkSSIDs List of hidden network SSIDs 116d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius * @return builder object 117d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius */ 1186259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius public NativeScanSettingsBuilder withHiddenNetworkSSIDs(String[] networkSSIDs) { 1196259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius mSettings.hiddenNetworks = new WifiNative.HiddenNetwork[networkSSIDs.length]; 1206259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius for (int i = 0; i < networkSSIDs.length; i++) { 1216259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius mSettings.hiddenNetworks[i] = new WifiNative.HiddenNetwork(); 1226259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius mSettings.hiddenNetworks[i].ssid = networkSSIDs[i]; 1236259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius } 124d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius return this; 125d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius } 126d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius 12741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills public NativeScanSettingsBuilder addBucketWithBand( 12872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills int period, int reportEvents, int band) { 12941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills WifiNative.BucketSettings bucket = new WifiNative.BucketSettings(); 13072c639e8b97067e948eca8be50dfea3173121090Mitchell Wills bucket.bucket = mSettings.num_buckets; 13141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills bucket.band = band; 13241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills bucket.period_ms = period; 13372c639e8b97067e948eca8be50dfea3173121090Mitchell Wills bucket.report_events = reportEvents; 13441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills return addBucket(bucket); 13541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 13641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 13741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills public NativeScanSettingsBuilder addBucketWithChannels( 1387e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills int period, int reportEvents, WifiScanner.ChannelSpec... channels) { 13939175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills int[] channelFreqs = new int[channels.length]; 14039175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills for (int i = 0; i < channels.length; ++i) { 14139175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills channelFreqs[i] = channels[i].frequency; 14239175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } 14339175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills return addBucketWithChannels(period, reportEvents, channelFreqs); 144d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills } 145d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills 146d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills public NativeScanSettingsBuilder addBucketWithChannels( 14739175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills int period, int reportEvents, int... channels) { 14841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills WifiNative.BucketSettings bucket = new WifiNative.BucketSettings(); 14972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills bucket.bucket = mSettings.num_buckets; 15041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills bucket.band = WifiScanner.WIFI_BAND_UNSPECIFIED; 15141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills bucket.num_channels = channels.length; 15239175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills bucket.channels = channelsToNativeSettings(channels); 15341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills bucket.period_ms = period; 15472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills bucket.report_events = reportEvents; 15541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills return addBucket(bucket); 15641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 15741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 15841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills public NativeScanSettingsBuilder addBucket(WifiNative.BucketSettings bucket) { 15972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills mSettings.buckets = Arrays.copyOf(mSettings.buckets, mSettings.num_buckets + 1); 16072c639e8b97067e948eca8be50dfea3173121090Mitchell Wills mSettings.buckets[mSettings.num_buckets] = bucket; 16172c639e8b97067e948eca8be50dfea3173121090Mitchell Wills mSettings.num_buckets = mSettings.num_buckets + 1; 16241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills return this; 16341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 16441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 16541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills public WifiNative.ScanSettings build() { 16672c639e8b97067e948eca8be50dfea3173121090Mitchell Wills return mSettings; 16741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 16841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 16941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 1708adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills /** 1718adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills * Compute the expected native scan settings that are expected for the given 1728adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills * WifiScanner.ScanSettings. 1738adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills */ 1748adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills public static WifiNative.ScanSettings computeSingleScanNativeSettings( 1758adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills WifiScanner.ScanSettings requestSettings) { 1768adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills int reportEvents = requestSettings.reportEvents | WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN; 1778adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills NativeScanSettingsBuilder builder = new NativeScanSettingsBuilder() 1788adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .withBasePeriod(0) 1798adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .withMaxApPerScan(0) 1808adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .withMaxPercentToCache(0) 1818adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .withMaxScansToCache(0); 1828adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills if (requestSettings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) { 1838adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills builder.addBucketWithChannels(0, reportEvents, requestSettings.channels); 1848adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills } else { 1858adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills builder.addBucketWithBand(0, reportEvents, requestSettings.band); 1868adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills } 1878adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills 1888adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills return builder.build(); 1898adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills } 1908adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills 1918adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills /** 1928adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills * Compute the expected native scan settings that are expected for the given channels. 1938adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills */ 1948adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills public static WifiNative.ScanSettings createSingleScanNativeSettingsForChannels( 1958adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills int reportEvents, WifiScanner.ChannelSpec... channels) { 1968adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills int actualReportEvents = reportEvents | WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN; 1978adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills return new NativeScanSettingsBuilder() 1988adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .withBasePeriod(0) 1998adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .withMaxApPerScan(0) 2008adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .withMaxPercentToCache(0) 2018adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .withMaxScansToCache(0) 2028adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .addBucketWithChannels(0, actualReportEvents, channels) 2038adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .build(); 2048adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills } 2058adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills 20641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills public static Set<Integer> createFreqSet(int... elements) { 20741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills Set<Integer> set = new HashSet<>(); 20841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills for (int e : elements) { 20941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills set.add(e); 21041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 21141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills return set; 21241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 21341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 214297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills public static ScanResult createScanResult(int freq) { 2152e814680f4dd27a5f825afab189843582235cedcJan Nordqvist return new ScanResult(WifiSsid.createFromAsciiEncoded("AN SSID"), "00:00:00:00:00:00", 0L, 2162e814680f4dd27a5f825afab189843582235cedcJan Nordqvist -1, null, "", 0, freq, 0); 217297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills } 218297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills 219c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Wills private static ScanData createScanData(int[] freqs, int bucketsScanned) { 220297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills ScanResult[] results = new ScanResult[freqs.length]; 221297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills for (int i = 0; i < freqs.length; ++i) { 222297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills results[i] = createScanResult(freqs[i]); 223297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills } 2243219e97566a093ed10b2a9d6fe77ed9089084d63Mitchell Wills return new ScanData(0, 0, bucketsScanned, false, results); 225297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills } 226297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills 227c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Wills public static ScanData[] createScanDatas(int[][] freqs, int[] bucketsScanned) { 228c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Wills assumeTrue(freqs.length == bucketsScanned.length); 229297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills ScanData[] data = new ScanData[freqs.length]; 230297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills for (int i = 0; i < freqs.length; ++i) { 231c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Wills data[i] = createScanData(freqs[i], bucketsScanned[i]); 232297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills } 233297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills return data; 234297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills } 235297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills 236c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Wills public static ScanData[] createScanDatas(int[][] freqs) { 237c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Wills return createScanDatas(freqs, new int[freqs.length] /* defaults all 0 */); 238c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Wills } 239c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Wills 24022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius private static void assertScanResultEquals( 24122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius String prefix, ScanResult expected, ScanResult actual) { 24222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius assertEquals(prefix + "SSID", expected.SSID, actual.SSID); 24322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius assertEquals(prefix + "wifiSsid", expected.wifiSsid.toString(), actual.wifiSsid.toString()); 24422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius assertEquals(prefix + "BSSID", expected.BSSID, actual.BSSID); 24522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius assertEquals(prefix + "capabilities", expected.capabilities, actual.capabilities); 24622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius assertEquals(prefix + "level", expected.level, actual.level); 24722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius assertEquals(prefix + "frequency", expected.frequency, actual.frequency); 24822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius assertEquals(prefix + "timestamp", expected.timestamp, actual.timestamp); 24922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius assertEquals(prefix + "seen", expected.seen, actual.seen); 25022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius } 25122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius 252c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius private static void assertScanResultsEquals(String prefix, ScanResult[] expected, 253c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius ScanResult[] actual) { 254c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertNotNull(prefix + "expected ScanResults was null", expected); 255c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertNotNull(prefix + "actual ScanResults was null", actual); 256c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals(prefix + "results.length", expected.length, actual.length); 257c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius for (int j = 0; j < expected.length; ++j) { 258c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius ScanResult expectedResult = expected[j]; 259c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius ScanResult actualResult = actual[j]; 26022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius assertScanResultEquals(prefix + "results[" + j + "]", actualResult, expectedResult); 26172c639e8b97067e948eca8be50dfea3173121090Mitchell Wills } 26272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills } 2635fa6221c4e507cbc596b6de77d793ec08d690157Mitchell Wills 264c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius /** 26522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius * Asserts if the provided scan results are the same. 26622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius */ 26722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius public static void assertScanResultEquals(ScanResult expected, ScanResult actual) { 26822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius assertScanResultEquals("", expected, actual); 26922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius } 27022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius 27122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius /** 272c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius * Asserts if the provided scan result arrays are the same. 273c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius */ 274c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius public static void assertScanResultsEquals(ScanResult[] expected, ScanResult[] actual) { 275c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertScanResultsEquals("", expected, actual); 276c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius } 277c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius 278c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius private static void assertScanDataEquals(String prefix, ScanData expected, ScanData actual) { 279c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertNotNull(prefix + "expected ScanData was null", expected); 280c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertNotNull(prefix + "actual ScanData was null", actual); 281c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals(prefix + "id", expected.getId(), actual.getId()); 282c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals(prefix + "flags", expected.getFlags(), actual.getFlags()); 2833219e97566a093ed10b2a9d6fe77ed9089084d63Mitchell Wills assertEquals(prefix + "all channels", expected.isAllChannelsScanned(), 2843219e97566a093ed10b2a9d6fe77ed9089084d63Mitchell Wills actual.isAllChannelsScanned()); 285c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertScanResultsEquals(prefix, expected.getResults(), actual.getResults()); 286c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius } 287c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius 28872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills public static void assertScanDataEquals(ScanData expected, ScanData actual) { 28972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills assertScanDataEquals("", expected, actual); 29072c639e8b97067e948eca8be50dfea3173121090Mitchell Wills } 29172c639e8b97067e948eca8be50dfea3173121090Mitchell Wills 2922771787818003e53e8175036a3d09688c783f350Mitchell Wills public static void assertScanDatasEquals(String prefix, ScanData[] expected, ScanData[] actual) { 2932771787818003e53e8175036a3d09688c783f350Mitchell Wills assertNotNull("expected " + prefix + "ScanData[] was null", expected); 2942771787818003e53e8175036a3d09688c783f350Mitchell Wills assertNotNull("actaul " + prefix + "ScanData[] was null", actual); 2952771787818003e53e8175036a3d09688c783f350Mitchell Wills assertEquals(prefix + "ScanData.length", expected.length, actual.length); 29641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills for (int i = 0; i < expected.length; ++i) { 2972771787818003e53e8175036a3d09688c783f350Mitchell Wills assertScanDataEquals(prefix + "ScanData[" + i + "].", expected[i], actual[i]); 29841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 29941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 30041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 3012771787818003e53e8175036a3d09688c783f350Mitchell Wills public static void assertScanDatasEquals(ScanData[] expected, ScanData[] actual) { 3022771787818003e53e8175036a3d09688c783f350Mitchell Wills assertScanDatasEquals("", expected, actual); 3032771787818003e53e8175036a3d09688c783f350Mitchell Wills } 3042771787818003e53e8175036a3d09688c783f350Mitchell Wills 305297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills public static WifiScanner.ChannelSpec[] channelsToSpec(int... channels) { 306297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills WifiScanner.ChannelSpec[] channelSpecs = new WifiScanner.ChannelSpec[channels.length]; 307297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills for (int i = 0; i < channels.length; ++i) { 308297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills channelSpecs[i] = new WifiScanner.ChannelSpec(channels[i]); 309297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills } 310297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills return channelSpecs; 311297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills } 312297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills 313d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills public static void assertNativeScanSettingsEquals(WifiNative.ScanSettings expected, 314d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills WifiNative.ScanSettings actual) { 315d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("bssids per scan", expected.max_ap_per_scan, actual.max_ap_per_scan); 316d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("scans to cache", expected.report_threshold_num_scans, 317d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills actual.report_threshold_num_scans); 318d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("percent to cache", expected.report_threshold_percent, 319d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills actual.report_threshold_percent); 320d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("base period", expected.base_period_ms, actual.base_period_ms); 321d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills 322d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("number of buckets", expected.num_buckets, actual.num_buckets); 323d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertNotNull("buckets was null", actual.buckets); 324d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills for (int i = 0; i < expected.buckets.length; ++i) { 325d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertNotNull("buckets[" + i + "] was null", actual.buckets[i]); 326d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("buckets[" + i + "].period", 327d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills expected.buckets[i].period_ms, actual.buckets[i].period_ms); 328d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("buckets[" + i + "].reportEvents", 329d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills expected.buckets[i].report_events, actual.buckets[i].report_events); 330d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills 331d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("buckets[" + i + "].band", 332d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills expected.buckets[i].band, actual.buckets[i].band); 333d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills if (expected.buckets[i].band == WifiScanner.WIFI_BAND_UNSPECIFIED) { 334d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills Set<Integer> expectedChannels = new HashSet<>(); 3357e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills for (WifiNative.ChannelSettings channel : expected.buckets[i].channels) { 336d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills expectedChannels.add(channel.frequency); 337d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills } 338d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills Set<Integer> actualChannels = new HashSet<>(); 3397e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills for (WifiNative.ChannelSettings channel : actual.buckets[i].channels) { 340d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills actualChannels.add(channel.frequency); 341d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills } 342d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("channels", expectedChannels, actualChannels); 343d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills } else { 344d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills // since num_channels and channels are ignored when band is not 345d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills // WifiScanner.WIFI_BAND_UNSPECIFIED just assert that there are no channels 346d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills // the band equality was already checked above 347d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("buckets[" + i + "].num_channels not 0", 0, 348d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills actual.buckets[i].num_channels); 349d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertTrue("buckets[" + i + "].channels not null or empty", 350d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills actual.buckets[i].channels == null 351d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills || actual.buckets[i].channels.length == 0); 352d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills } 353d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills } 354d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills } 355d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills 35639175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills /** 357c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius * Asserts if the provided pno settings are the same. 358c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius */ 359c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius public static void assertNativePnoSettingsEquals(WifiNative.PnoSettings expected, 360c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius WifiNative.PnoSettings actual) { 361c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertNotNull("expected was null", expected); 362c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertNotNull("actaul was null", actual); 363c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("min5GHzRssi", expected.min5GHzRssi, actual.min5GHzRssi); 364c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("min24GHzRssi", expected.min24GHzRssi, actual.min24GHzRssi); 365c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("initialScoreMax", expected.initialScoreMax, actual.initialScoreMax); 366c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("currentConnectionBonus", expected.currentConnectionBonus, 367c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius actual.currentConnectionBonus); 368c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("sameNetworkBonus", expected.sameNetworkBonus, actual.sameNetworkBonus); 369c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("secureBonus", expected.secureBonus, actual.secureBonus); 370c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("band5GHzBonus", expected.band5GHzBonus, actual.band5GHzBonus); 371c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("isConnected", expected.isConnected, actual.isConnected); 372c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertNotNull("expected networkList was null", expected.networkList); 373c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertNotNull("actual networkList was null", actual.networkList); 374c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("networkList.length", expected.networkList.length, actual.networkList.length); 375c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius for (int i = 0; i < expected.networkList.length; i++) { 376c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("networkList[" + i + "].ssid", 377c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius expected.networkList[i].ssid, actual.networkList[i].ssid); 378c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("networkList[" + i + "].flags", 379c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius expected.networkList[i].flags, actual.networkList[i].flags); 380c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("networkList[" + i + "].auth_bit_field", 381c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius expected.networkList[i].auth_bit_field, actual.networkList[i].auth_bit_field); 382c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius } 383c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius } 384c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius 385c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius /** 38639175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills * Convert a list of channel frequencies to an array of equivalent WifiNative.ChannelSettings 38739175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills */ 38839175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills public static WifiNative.ChannelSettings[] channelsToNativeSettings(int... channels) { 38939175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills WifiNative.ChannelSettings[] channelSpecs = new WifiNative.ChannelSettings[channels.length]; 39039175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills for (int i = 0; i < channels.length; ++i) { 39139175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills channelSpecs[i] = new WifiNative.ChannelSettings(); 39239175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills channelSpecs[i].frequency = channels[i]; 39339175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } 39439175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills return channelSpecs; 39539175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } 39639175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills 397712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills /** 398712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * Matcher to check that a BucketSettings has the given band 399712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills */ 400712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public static Matcher<WifiNative.BucketSettings> bandIs(final int expectedBand) { 401712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return new TypeSafeDiagnosingMatcher<WifiNative.BucketSettings>() { 402712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills @Override 403712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public boolean matchesSafely(WifiNative.BucketSettings bucketSettings, 404712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills Description mismatchDescription) { 405712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills if (bucketSettings.band != expectedBand) { 406712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills mismatchDescription 407712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendText("did not have expected band ").appendValue(expectedBand) 408712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendText(", was ").appendValue(bucketSettings.band); 409712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return false; 410712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } else { 411712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return true; 412712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 413712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 414712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 415712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills @Override 416712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public void describeTo(final Description description) { 417712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills description.appendText("bucket band is ").appendValue(expectedBand); 418712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 419712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills }; 420712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 421712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 422712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills /** 423712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * Matcher to check that a BucketSettings has exactly the given channels 424712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills */ 425712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public static Matcher<WifiNative.BucketSettings> channelsAre(final int... expectedChannels) { 426712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return new TypeSafeDiagnosingMatcher<WifiNative.BucketSettings>() { 427712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills @Override 428712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public boolean matchesSafely(WifiNative.BucketSettings bucketSettings, 429712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills Description mismatchDescription) { 430712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills if (bucketSettings.band != WifiScanner.WIFI_BAND_UNSPECIFIED) { 431712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills mismatchDescription.appendText("did not have expected unspecified band, was ") 432712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendValue(bucketSettings.band); 433712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return false; 434712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } else if (bucketSettings.num_channels != expectedChannels.length) { 435712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills mismatchDescription 436712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendText("did not have expected num_channels ") 437712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendValue(expectedChannels.length) 438712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendText(", was ").appendValue(bucketSettings.num_channels); 439712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return false; 440712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } else if (bucketSettings.channels == null) { 441712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills mismatchDescription.appendText("had null channels array"); 442712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return false; 443712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } else if (bucketSettings.channels.length != expectedChannels.length) { 444712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills mismatchDescription 445712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendText("did not have channels array length matching excepted ") 446712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendValue(expectedChannels.length) 447712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendText(", was ").appendValue(bucketSettings.channels.length); 448712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return false; 449712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } else { 450712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills Set<Integer> foundChannelsSet = new HashSet<>(); 451712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills for (int i = 0; i < bucketSettings.channels.length; ++i) { 452712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills foundChannelsSet.add(bucketSettings.channels[i].frequency); 453712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 454712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills Set<Integer> expectedChannelsSet = new HashSet<>(); 455712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills for (int i = 0; i < expectedChannels.length; ++i) { 456712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills expectedChannelsSet.add(expectedChannels[i]); 457712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 458712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 459712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills if (!foundChannelsSet.containsAll(expectedChannelsSet) 460712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills || foundChannelsSet.size() != expectedChannelsSet.size()) { 461712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills Set<Integer> extraChannelsSet = new HashSet<>(foundChannelsSet); 462712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills extraChannelsSet.removeAll(expectedChannelsSet); 463712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills expectedChannelsSet.removeAll(foundChannelsSet); 464712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills mismatchDescription 465712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendText("does not contain expected channels ") 466712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendValue(expectedChannelsSet); 467712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills if (extraChannelsSet.size() > 0) { 468712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills mismatchDescription 469712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendText(", but contains extra channels ") 470712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendValue(extraChannelsSet); 471712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 472712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return false; 473712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } else { 474712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return true; 475712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 476712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 477712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 478712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 479712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills @Override 480712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public void describeTo(final Description description) { 481712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills description.appendText("bucket channels are ").appendValue(expectedChannels); 482712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 483712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills }; 484712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 485297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills} 486