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 /** 114d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius * Add the provided hidden network IDs to scan request. 115d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius * @param networkIds List of hidden network IDs 116d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius * @return builder object 117d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius */ 118d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius public NativeScanSettingsBuilder withHiddenNetworkIds(int[] networkIds) { 119d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius mSettings.hiddenNetworkIds = networkIds; 120d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius return this; 121d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius } 122d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius 12341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills public NativeScanSettingsBuilder addBucketWithBand( 12472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills int period, int reportEvents, int band) { 12541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills WifiNative.BucketSettings bucket = new WifiNative.BucketSettings(); 12672c639e8b97067e948eca8be50dfea3173121090Mitchell Wills bucket.bucket = mSettings.num_buckets; 12741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills bucket.band = band; 12841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills bucket.period_ms = period; 12972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills bucket.report_events = reportEvents; 13041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills return addBucket(bucket); 13141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 13241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 13341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills public NativeScanSettingsBuilder addBucketWithChannels( 1347e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills int period, int reportEvents, WifiScanner.ChannelSpec... channels) { 13539175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills int[] channelFreqs = new int[channels.length]; 13639175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills for (int i = 0; i < channels.length; ++i) { 13739175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills channelFreqs[i] = channels[i].frequency; 13839175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } 13939175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills return addBucketWithChannels(period, reportEvents, channelFreqs); 140d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills } 141d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills 142d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills public NativeScanSettingsBuilder addBucketWithChannels( 14339175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills int period, int reportEvents, int... channels) { 14441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills WifiNative.BucketSettings bucket = new WifiNative.BucketSettings(); 14572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills bucket.bucket = mSettings.num_buckets; 14641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills bucket.band = WifiScanner.WIFI_BAND_UNSPECIFIED; 14741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills bucket.num_channels = channels.length; 14839175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills bucket.channels = channelsToNativeSettings(channels); 14941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills bucket.period_ms = period; 15072c639e8b97067e948eca8be50dfea3173121090Mitchell Wills bucket.report_events = reportEvents; 15141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills return addBucket(bucket); 15241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 15341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 15441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills public NativeScanSettingsBuilder addBucket(WifiNative.BucketSettings bucket) { 15572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills mSettings.buckets = Arrays.copyOf(mSettings.buckets, mSettings.num_buckets + 1); 15672c639e8b97067e948eca8be50dfea3173121090Mitchell Wills mSettings.buckets[mSettings.num_buckets] = bucket; 15772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills mSettings.num_buckets = mSettings.num_buckets + 1; 15841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills return this; 15941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 16041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 16141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills public WifiNative.ScanSettings build() { 16272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills return mSettings; 16341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 16441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 16541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 1668adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills /** 1678adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills * Compute the expected native scan settings that are expected for the given 1688adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills * WifiScanner.ScanSettings. 1698adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills */ 1708adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills public static WifiNative.ScanSettings computeSingleScanNativeSettings( 1718adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills WifiScanner.ScanSettings requestSettings) { 1728adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills int reportEvents = requestSettings.reportEvents | WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN; 1738adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills NativeScanSettingsBuilder builder = new NativeScanSettingsBuilder() 1748adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .withBasePeriod(0) 1758adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .withMaxApPerScan(0) 1768adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .withMaxPercentToCache(0) 1778adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .withMaxScansToCache(0); 1788adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills if (requestSettings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) { 1798adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills builder.addBucketWithChannels(0, reportEvents, requestSettings.channels); 1808adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills } else { 1818adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills builder.addBucketWithBand(0, reportEvents, requestSettings.band); 1828adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills } 1838adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills 1848adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills return builder.build(); 1858adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills } 1868adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills 1878adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills /** 1888adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills * Compute the expected native scan settings that are expected for the given channels. 1898adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills */ 1908adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills public static WifiNative.ScanSettings createSingleScanNativeSettingsForChannels( 1918adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills int reportEvents, WifiScanner.ChannelSpec... channels) { 1928adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills int actualReportEvents = reportEvents | WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN; 1938adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills return new NativeScanSettingsBuilder() 1948adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .withBasePeriod(0) 1958adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .withMaxApPerScan(0) 1968adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .withMaxPercentToCache(0) 1978adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .withMaxScansToCache(0) 1988adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .addBucketWithChannels(0, actualReportEvents, channels) 1998adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills .build(); 2008adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills } 2018adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills 20241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills public static Set<Integer> createFreqSet(int... elements) { 20341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills Set<Integer> set = new HashSet<>(); 20441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills for (int e : elements) { 20541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills set.add(e); 20641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 20741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills return set; 20841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 20941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 210297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills public static ScanResult createScanResult(int freq) { 2112e814680f4dd27a5f825afab189843582235cedcJan Nordqvist return new ScanResult(WifiSsid.createFromAsciiEncoded("AN SSID"), "00:00:00:00:00:00", 0L, 2122e814680f4dd27a5f825afab189843582235cedcJan Nordqvist -1, null, "", 0, freq, 0); 213297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills } 214297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills 215c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Wills private static ScanData createScanData(int[] freqs, int bucketsScanned) { 216297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills ScanResult[] results = new ScanResult[freqs.length]; 217297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills for (int i = 0; i < freqs.length; ++i) { 218297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills results[i] = createScanResult(freqs[i]); 219297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills } 220c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Wills return new ScanData(0, 0, bucketsScanned, results); 221297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills } 222297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills 223c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Wills public static ScanData[] createScanDatas(int[][] freqs, int[] bucketsScanned) { 224c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Wills assumeTrue(freqs.length == bucketsScanned.length); 225297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills ScanData[] data = new ScanData[freqs.length]; 226297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills for (int i = 0; i < freqs.length; ++i) { 227c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Wills data[i] = createScanData(freqs[i], bucketsScanned[i]); 228297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills } 229297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills return data; 230297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills } 231297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills 232c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Wills public static ScanData[] createScanDatas(int[][] freqs) { 233c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Wills return createScanDatas(freqs, new int[freqs.length] /* defaults all 0 */); 234c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Wills } 235c4f23cbd6de85cbffcd91b398e51eff106ef08d4Mitchell Wills 236c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius private static void assertScanResultsEquals(String prefix, ScanResult[] expected, 237c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius ScanResult[] actual) { 238c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertNotNull(prefix + "expected ScanResults was null", expected); 239c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertNotNull(prefix + "actual ScanResults was null", actual); 240c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals(prefix + "results.length", expected.length, actual.length); 241c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius for (int j = 0; j < expected.length; ++j) { 242c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius ScanResult expectedResult = expected[j]; 243c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius ScanResult actualResult = actual[j]; 24472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills assertEquals(prefix + "results[" + j + "].SSID", 24572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills expectedResult.SSID, actualResult.SSID); 24672c639e8b97067e948eca8be50dfea3173121090Mitchell Wills assertEquals(prefix + "results[" + j + "].wifiSsid", 24772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills expectedResult.wifiSsid.toString(), actualResult.wifiSsid.toString()); 24872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills assertEquals(prefix + "results[" + j + "].BSSID", 24972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills expectedResult.BSSID, actualResult.BSSID); 25072c639e8b97067e948eca8be50dfea3173121090Mitchell Wills assertEquals(prefix + "results[" + j + "].capabilities", 25172c639e8b97067e948eca8be50dfea3173121090Mitchell Wills expectedResult.capabilities, actualResult.capabilities); 25272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills assertEquals(prefix + "results[" + j + "].level", 25372c639e8b97067e948eca8be50dfea3173121090Mitchell Wills expectedResult.level, actualResult.level); 25472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills assertEquals(prefix + "results[" + j + "].frequency", 25572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills expectedResult.frequency, actualResult.frequency); 25672c639e8b97067e948eca8be50dfea3173121090Mitchell Wills assertEquals(prefix + "results[" + j + "].timestamp", 25772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills expectedResult.timestamp, actualResult.timestamp); 25872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills assertEquals(prefix + "results[" + j + "].seen", 25972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills expectedResult.seen, actualResult.seen); 26072c639e8b97067e948eca8be50dfea3173121090Mitchell Wills } 26172c639e8b97067e948eca8be50dfea3173121090Mitchell Wills } 2625fa6221c4e507cbc596b6de77d793ec08d690157Mitchell Wills 263c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius /** 264c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius * Asserts if the provided scan result arrays are the same. 265c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius */ 266c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius public static void assertScanResultsEquals(ScanResult[] expected, ScanResult[] actual) { 267c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertScanResultsEquals("", expected, actual); 268c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius } 269c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius 270c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius private static void assertScanDataEquals(String prefix, ScanData expected, ScanData actual) { 271c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertNotNull(prefix + "expected ScanData was null", expected); 272c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertNotNull(prefix + "actual ScanData was null", actual); 273c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals(prefix + "id", expected.getId(), actual.getId()); 274c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals(prefix + "flags", expected.getFlags(), actual.getFlags()); 275c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertScanResultsEquals(prefix, expected.getResults(), actual.getResults()); 276c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius } 277c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius 27872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills public static void assertScanDataEquals(ScanData expected, ScanData actual) { 27972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills assertScanDataEquals("", expected, actual); 28072c639e8b97067e948eca8be50dfea3173121090Mitchell Wills } 28172c639e8b97067e948eca8be50dfea3173121090Mitchell Wills 2822771787818003e53e8175036a3d09688c783f350Mitchell Wills public static void assertScanDatasEquals(String prefix, ScanData[] expected, ScanData[] actual) { 2832771787818003e53e8175036a3d09688c783f350Mitchell Wills assertNotNull("expected " + prefix + "ScanData[] was null", expected); 2842771787818003e53e8175036a3d09688c783f350Mitchell Wills assertNotNull("actaul " + prefix + "ScanData[] was null", actual); 2852771787818003e53e8175036a3d09688c783f350Mitchell Wills assertEquals(prefix + "ScanData.length", expected.length, actual.length); 28641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills for (int i = 0; i < expected.length; ++i) { 2872771787818003e53e8175036a3d09688c783f350Mitchell Wills assertScanDataEquals(prefix + "ScanData[" + i + "].", expected[i], actual[i]); 28841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 28941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 29041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 2912771787818003e53e8175036a3d09688c783f350Mitchell Wills public static void assertScanDatasEquals(ScanData[] expected, ScanData[] actual) { 2922771787818003e53e8175036a3d09688c783f350Mitchell Wills assertScanDatasEquals("", expected, actual); 2932771787818003e53e8175036a3d09688c783f350Mitchell Wills } 2942771787818003e53e8175036a3d09688c783f350Mitchell Wills 295297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills public static WifiScanner.ChannelSpec[] channelsToSpec(int... channels) { 296297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills WifiScanner.ChannelSpec[] channelSpecs = new WifiScanner.ChannelSpec[channels.length]; 297297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills for (int i = 0; i < channels.length; ++i) { 298297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills channelSpecs[i] = new WifiScanner.ChannelSpec(channels[i]); 299297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills } 300297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills return channelSpecs; 301297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills } 302297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills 303d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills public static void assertNativeScanSettingsEquals(WifiNative.ScanSettings expected, 304d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills WifiNative.ScanSettings actual) { 305d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("bssids per scan", expected.max_ap_per_scan, actual.max_ap_per_scan); 306d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("scans to cache", expected.report_threshold_num_scans, 307d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills actual.report_threshold_num_scans); 308d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("percent to cache", expected.report_threshold_percent, 309d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills actual.report_threshold_percent); 310d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("base period", expected.base_period_ms, actual.base_period_ms); 311d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills 312d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("number of buckets", expected.num_buckets, actual.num_buckets); 313d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertNotNull("buckets was null", actual.buckets); 314d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills for (int i = 0; i < expected.buckets.length; ++i) { 315d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertNotNull("buckets[" + i + "] was null", actual.buckets[i]); 316d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("buckets[" + i + "].period", 317d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills expected.buckets[i].period_ms, actual.buckets[i].period_ms); 318d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("buckets[" + i + "].reportEvents", 319d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills expected.buckets[i].report_events, actual.buckets[i].report_events); 320d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills 321d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("buckets[" + i + "].band", 322d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills expected.buckets[i].band, actual.buckets[i].band); 323d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills if (expected.buckets[i].band == WifiScanner.WIFI_BAND_UNSPECIFIED) { 324d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills Set<Integer> expectedChannels = new HashSet<>(); 3257e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills for (WifiNative.ChannelSettings channel : expected.buckets[i].channels) { 326d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills expectedChannels.add(channel.frequency); 327d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills } 328d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills Set<Integer> actualChannels = new HashSet<>(); 3297e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills for (WifiNative.ChannelSettings channel : actual.buckets[i].channels) { 330d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills actualChannels.add(channel.frequency); 331d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills } 332d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("channels", expectedChannels, actualChannels); 333d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills } else { 334d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills // since num_channels and channels are ignored when band is not 335d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills // WifiScanner.WIFI_BAND_UNSPECIFIED just assert that there are no channels 336d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills // the band equality was already checked above 337d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertEquals("buckets[" + i + "].num_channels not 0", 0, 338d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills actual.buckets[i].num_channels); 339d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills assertTrue("buckets[" + i + "].channels not null or empty", 340d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills actual.buckets[i].channels == null 341d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills || actual.buckets[i].channels.length == 0); 342d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills } 343d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills } 344d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills } 345d2d3de4c2bea4b949ed78a9b01b920bffa7e51a9Mitchell Wills 34639175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills /** 347c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius * Asserts if the provided pno settings are the same. 348c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius */ 349c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius public static void assertNativePnoSettingsEquals(WifiNative.PnoSettings expected, 350c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius WifiNative.PnoSettings actual) { 351c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertNotNull("expected was null", expected); 352c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertNotNull("actaul was null", actual); 353c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("min5GHzRssi", expected.min5GHzRssi, actual.min5GHzRssi); 354c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("min24GHzRssi", expected.min24GHzRssi, actual.min24GHzRssi); 355c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("initialScoreMax", expected.initialScoreMax, actual.initialScoreMax); 356c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("currentConnectionBonus", expected.currentConnectionBonus, 357c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius actual.currentConnectionBonus); 358c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("sameNetworkBonus", expected.sameNetworkBonus, actual.sameNetworkBonus); 359c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("secureBonus", expected.secureBonus, actual.secureBonus); 360c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("band5GHzBonus", expected.band5GHzBonus, actual.band5GHzBonus); 361c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("isConnected", expected.isConnected, actual.isConnected); 362c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertNotNull("expected networkList was null", expected.networkList); 363c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertNotNull("actual networkList was null", actual.networkList); 364c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("networkList.length", expected.networkList.length, actual.networkList.length); 365c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius for (int i = 0; i < expected.networkList.length; i++) { 366c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("networkList[" + i + "].ssid", 367c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius expected.networkList[i].ssid, actual.networkList[i].ssid); 368c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("networkList[" + i + "].networkId", 369c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius expected.networkList[i].networkId, actual.networkList[i].networkId); 370c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("networkList[" + i + "].priority", 371c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius expected.networkList[i].priority, actual.networkList[i].priority); 372c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("networkList[" + i + "].flags", 373c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius expected.networkList[i].flags, actual.networkList[i].flags); 374c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius assertEquals("networkList[" + i + "].auth_bit_field", 375c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius expected.networkList[i].auth_bit_field, actual.networkList[i].auth_bit_field); 376c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius } 377c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius } 378c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius 379c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius /** 38039175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills * Convert a list of channel frequencies to an array of equivalent WifiNative.ChannelSettings 38139175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills */ 38239175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills public static WifiNative.ChannelSettings[] channelsToNativeSettings(int... channels) { 38339175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills WifiNative.ChannelSettings[] channelSpecs = new WifiNative.ChannelSettings[channels.length]; 38439175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills for (int i = 0; i < channels.length; ++i) { 38539175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills channelSpecs[i] = new WifiNative.ChannelSettings(); 38639175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills channelSpecs[i].frequency = channels[i]; 38739175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } 38839175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills return channelSpecs; 38939175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } 39039175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills 391712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills /** 392712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * Matcher to check that a BucketSettings has the given band 393712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills */ 394712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public static Matcher<WifiNative.BucketSettings> bandIs(final int expectedBand) { 395712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return new TypeSafeDiagnosingMatcher<WifiNative.BucketSettings>() { 396712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills @Override 397712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public boolean matchesSafely(WifiNative.BucketSettings bucketSettings, 398712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills Description mismatchDescription) { 399712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills if (bucketSettings.band != expectedBand) { 400712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills mismatchDescription 401712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendText("did not have expected band ").appendValue(expectedBand) 402712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendText(", was ").appendValue(bucketSettings.band); 403712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return false; 404712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } else { 405712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return true; 406712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 407712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 408712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 409712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills @Override 410712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public void describeTo(final Description description) { 411712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills description.appendText("bucket band is ").appendValue(expectedBand); 412712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 413712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills }; 414712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 415712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 416712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills /** 417712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * Matcher to check that a BucketSettings has exactly the given channels 418712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills */ 419712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public static Matcher<WifiNative.BucketSettings> channelsAre(final int... expectedChannels) { 420712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return new TypeSafeDiagnosingMatcher<WifiNative.BucketSettings>() { 421712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills @Override 422712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public boolean matchesSafely(WifiNative.BucketSettings bucketSettings, 423712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills Description mismatchDescription) { 424712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills if (bucketSettings.band != WifiScanner.WIFI_BAND_UNSPECIFIED) { 425712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills mismatchDescription.appendText("did not have expected unspecified band, was ") 426712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendValue(bucketSettings.band); 427712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return false; 428712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } else if (bucketSettings.num_channels != expectedChannels.length) { 429712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills mismatchDescription 430712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendText("did not have expected num_channels ") 431712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendValue(expectedChannels.length) 432712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendText(", was ").appendValue(bucketSettings.num_channels); 433712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return false; 434712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } else if (bucketSettings.channels == null) { 435712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills mismatchDescription.appendText("had null channels array"); 436712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return false; 437712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } else if (bucketSettings.channels.length != expectedChannels.length) { 438712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills mismatchDescription 439712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendText("did not have channels array length matching excepted ") 440712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendValue(expectedChannels.length) 441712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendText(", was ").appendValue(bucketSettings.channels.length); 442712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return false; 443712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } else { 444712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills Set<Integer> foundChannelsSet = new HashSet<>(); 445712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills for (int i = 0; i < bucketSettings.channels.length; ++i) { 446712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills foundChannelsSet.add(bucketSettings.channels[i].frequency); 447712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 448712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills Set<Integer> expectedChannelsSet = new HashSet<>(); 449712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills for (int i = 0; i < expectedChannels.length; ++i) { 450712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills expectedChannelsSet.add(expectedChannels[i]); 451712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 452712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 453712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills if (!foundChannelsSet.containsAll(expectedChannelsSet) 454712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills || foundChannelsSet.size() != expectedChannelsSet.size()) { 455712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills Set<Integer> extraChannelsSet = new HashSet<>(foundChannelsSet); 456712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills extraChannelsSet.removeAll(expectedChannelsSet); 457712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills expectedChannelsSet.removeAll(foundChannelsSet); 458712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills mismatchDescription 459712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendText("does not contain expected channels ") 460712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendValue(expectedChannelsSet); 461712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills if (extraChannelsSet.size() > 0) { 462712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills mismatchDescription 463712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendText(", but contains extra channels ") 464712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills .appendValue(extraChannelsSet); 465712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 466712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return false; 467712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } else { 468712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return true; 469712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 470712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 471712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 472712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 473712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills @Override 474712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public void describeTo(final Description description) { 475712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills description.appendText("bucket channels are ").appendValue(expectedChannels); 476712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 477712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills }; 478712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 479297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills} 480