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