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