ScanTestUtil.java revision 2771787818003e53e8175036a3d09688c783f350
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
14297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * limitations under the License
15297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills */
16297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
17297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willspackage com.android.server.wifi;
18297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
1972c639e8b97067e948eca8be50dfea3173121090Mitchell Willsimport static org.junit.Assert.assertEquals;
2072c639e8b97067e948eca8be50dfea3173121090Mitchell Willsimport static org.junit.Assert.assertNotNull;
21297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport static org.mockito.Mockito.when;
22297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
23297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport android.net.wifi.ScanResult;
24297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport android.net.wifi.WifiScanner;
25297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport android.net.wifi.WifiScanner.ChannelSpec;
26297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport android.net.wifi.WifiScanner.ScanData;
27297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport android.net.wifi.WifiScanner.ScanSettings;
28297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport android.net.wifi.WifiSsid;
29297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
30297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport com.android.server.wifi.WifiNative.BucketSettings;
31297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
32297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport java.lang.reflect.Field;
3341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport java.util.Arrays;
3441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport java.util.HashSet;
3541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport java.util.Set;
36297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
37297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills/**
38297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * Utilities for testing Wifi Scanning
39297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills */
40297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willspublic class ScanTestUtil {
41297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
42297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public static void installWlanWifiNative(WifiNative wifiNative) throws Exception {
43297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        Field field = WifiNative.class.getDeclaredField("wlanNativeInterface");
44297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        field.setAccessible(true);
45297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        field.set(null, wifiNative);
46297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
47297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        // Clear static state
48297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        WifiChannelHelper.clearChannelCache();
49297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
50297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
51297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public static void setupMockChannels(WifiNative wifiNative, int[] channels24, int[] channels5,
52297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            int[] channelsDfs) throws Exception {
53297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        when(wifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_24_GHZ))
54297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                .thenReturn(channels24);
55297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        when(wifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_5_GHZ))
56297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                .thenReturn(channels5);
57297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        when(wifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY))
58297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                .thenReturn(channelsDfs);
59297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
60297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
61297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public static ScanSettings createRequest(WifiScanner.ChannelSpec[] channels, int period,
62297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            int batch, int bssidsPerScan, int reportEvents) {
63297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        ScanSettings request = new ScanSettings();
64297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        request.band = WifiScanner.WIFI_BAND_UNSPECIFIED;
65297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        request.channels = channels;
66297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        request.periodInMs = period;
67297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        request.numBssidsPerScan = bssidsPerScan;
68297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        request.maxScansToCache = batch;
69297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        request.reportEvents = reportEvents;
70297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        return request;
71297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
72297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
73297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public static ScanSettings createRequest(int band, int period, int batch, int bssidsPerScan,
74297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            int reportEvents) {
75297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        ScanSettings request = new ScanSettings();
76297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        request.band = band;
77297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        request.channels = null;
78297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        request.periodInMs = period;
79297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        request.numBssidsPerScan = bssidsPerScan;
80297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        request.maxScansToCache = batch;
81297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        request.reportEvents = reportEvents;
82297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        return request;
83297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
84297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
8572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills    /**
86f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan     * Create an exponential back off scan request if maxPeriod != period && maxPeriod != 0.
87f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan     */
88f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan    public static ScanSettings createRequest(int band, int period, int maxPeriod, int stepCount,
89f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan            int batch, int bssidsPerScan, int reportEvents) {
90f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan        ScanSettings request = new ScanSettings();
91f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan        request.band = band;
92f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan        request.channels = null;
93f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan        request.periodInMs = period;
94f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan        request.maxPeriodInMs = maxPeriod;
95f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan        request.stepCount = stepCount;
96f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan        request.numBssidsPerScan = bssidsPerScan;
97f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan        request.maxScansToCache = batch;
98f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan        request.reportEvents = reportEvents;
99f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan        return request;
100f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan    }
101f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan
102f935e529bdcc150dc57641f5f2ab10cd69f2e3e9Randy Pan    /**
10372c639e8b97067e948eca8be50dfea3173121090Mitchell Wills     * Builder to create WifiNative.ScanSettings objects for testing
10472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills     */
10541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    public static class NativeScanSettingsBuilder {
10672c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        private final WifiNative.ScanSettings mSettings = new WifiNative.ScanSettings();
10741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        public NativeScanSettingsBuilder() {
10872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            mSettings.buckets = new WifiNative.BucketSettings[0];
10972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            mSettings.num_buckets = 0;
11072c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            mSettings.report_threshold_percent = 100;
11141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        }
11241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
11341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        public NativeScanSettingsBuilder withBasePeriod(int basePeriod) {
11472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            mSettings.base_period_ms = basePeriod;
11541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            return this;
11641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        }
11741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        public NativeScanSettingsBuilder withMaxApPerScan(int maxAp) {
11872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            mSettings.max_ap_per_scan = maxAp;
11941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            return this;
12041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        }
12141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        public NativeScanSettingsBuilder withMaxScansToCache(int maxScans) {
12272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            mSettings.report_threshold_num_scans = maxScans;
12341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            return this;
12441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        }
12541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
12641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        public NativeScanSettingsBuilder addBucketWithBand(
12772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                int period, int reportEvents, int band) {
12841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            WifiNative.BucketSettings bucket = new WifiNative.BucketSettings();
12972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            bucket.bucket = mSettings.num_buckets;
13041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            bucket.band = band;
13141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            bucket.period_ms = period;
13272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            bucket.report_events = reportEvents;
13341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            return addBucket(bucket);
13441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        }
13541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
13641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        public NativeScanSettingsBuilder addBucketWithChannels(
13772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                int period, int reportEvents, int... channels) {
13841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            WifiNative.BucketSettings bucket = new WifiNative.BucketSettings();
13972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            bucket.bucket = mSettings.num_buckets;
14041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            bucket.band = WifiScanner.WIFI_BAND_UNSPECIFIED;
14141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            bucket.num_channels = channels.length;
14241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            bucket.channels = new WifiNative.ChannelSettings[channels.length];
14341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            for (int i = 0; i < channels.length; ++i) {
14441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                bucket.channels[i] = new WifiNative.ChannelSettings();
14541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                bucket.channels[i].frequency = channels[i];
14641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            }
14741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            bucket.period_ms = period;
14872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            bucket.report_events = reportEvents;
14941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            return addBucket(bucket);
15041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        }
15141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
15241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        public NativeScanSettingsBuilder addBucket(WifiNative.BucketSettings bucket) {
15372c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            mSettings.buckets = Arrays.copyOf(mSettings.buckets, mSettings.num_buckets + 1);
15472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            mSettings.buckets[mSettings.num_buckets] = bucket;
15572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            mSettings.num_buckets = mSettings.num_buckets + 1;
15641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            return this;
15741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        }
15841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
15941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        public WifiNative.ScanSettings build() {
16072c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            return mSettings;
16141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        }
16241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
16341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
16441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    public static Set<Integer> createFreqSet(int... elements) {
16541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        Set<Integer> set = new HashSet<>();
16641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        for (int e : elements) {
16741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            set.add(e);
16841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        }
16941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        return set;
17041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
17141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
172297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public static ScanResult createScanResult(int freq) {
173297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        return new ScanResult(WifiSsid.createFromAsciiEncoded("AN SSID"), "00:00:00:00:00:00", "",
174297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                0, freq, 0);
175297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
176297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
177297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public static ScanData createScanData(int... freqs) {
178297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        ScanResult[] results = new ScanResult[freqs.length];
179297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (int i = 0; i < freqs.length; ++i) {
180297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            results[i] = createScanResult(freqs[i]);
181297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
182297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        return new ScanData(0, 0, results);
183297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
184297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
185297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public static ScanData[] createScanDatas(int[][] freqs) {
186297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        ScanData[] data = new ScanData[freqs.length];
187297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (int i = 0; i < freqs.length; ++i) {
188297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            data[i] = createScanData(freqs[i]);
189297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
190297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        return data;
191297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
192297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
19372c639e8b97067e948eca8be50dfea3173121090Mitchell Wills    private static void assertScanDataEquals(String prefix, ScanData expected, ScanData actual) {
1945fa6221c4e507cbc596b6de77d793ec08d690157Mitchell Wills        assertNotNull(prefix + "expected ScanData was null", expected);
1955fa6221c4e507cbc596b6de77d793ec08d690157Mitchell Wills        assertNotNull(prefix + "actual ScanData was null", actual);
19672c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        assertEquals(prefix + "id", expected.getId(), actual.getId());
19772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        assertEquals(prefix + "flags", expected.getFlags(), actual.getFlags());
19872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        assertEquals(prefix + "results.length",
19972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                expected.getResults().length, actual.getResults().length);
20072c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        for (int j = 0; j < expected.getResults().length; ++j) {
20172c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            ScanResult expectedResult = expected.getResults()[j];
20272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            ScanResult actualResult = actual.getResults()[j];
20372c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            assertEquals(prefix + "results[" + j + "].SSID",
20472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    expectedResult.SSID, actualResult.SSID);
20572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            assertEquals(prefix + "results[" + j + "].wifiSsid",
20672c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    expectedResult.wifiSsid.toString(), actualResult.wifiSsid.toString());
20772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            assertEquals(prefix + "results[" + j + "].BSSID",
20872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    expectedResult.BSSID, actualResult.BSSID);
20972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            assertEquals(prefix + "results[" + j + "].capabilities",
21072c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    expectedResult.capabilities, actualResult.capabilities);
21172c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            assertEquals(prefix + "results[" + j + "].level",
21272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    expectedResult.level, actualResult.level);
21372c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            assertEquals(prefix + "results[" + j + "].frequency",
21472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    expectedResult.frequency, actualResult.frequency);
21572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            assertEquals(prefix + "results[" + j + "].timestamp",
21672c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    expectedResult.timestamp, actualResult.timestamp);
21772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            assertEquals(prefix + "results[" + j + "].seen",
21872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    expectedResult.seen, actualResult.seen);
21972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        }
22072c639e8b97067e948eca8be50dfea3173121090Mitchell Wills    }
2215fa6221c4e507cbc596b6de77d793ec08d690157Mitchell Wills
22272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills    public static void assertScanDataEquals(ScanData expected, ScanData actual) {
22372c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        assertScanDataEquals("", expected, actual);
22472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills    }
22572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills
2262771787818003e53e8175036a3d09688c783f350Mitchell Wills    public static void assertScanDatasEquals(String prefix, ScanData[] expected, ScanData[] actual) {
2272771787818003e53e8175036a3d09688c783f350Mitchell Wills        assertNotNull("expected " + prefix + "ScanData[] was null", expected);
2282771787818003e53e8175036a3d09688c783f350Mitchell Wills        assertNotNull("actaul " + prefix + "ScanData[] was null", actual);
2292771787818003e53e8175036a3d09688c783f350Mitchell Wills        assertEquals(prefix + "ScanData.length", expected.length, actual.length);
23041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        for (int i = 0; i < expected.length; ++i) {
2312771787818003e53e8175036a3d09688c783f350Mitchell Wills            assertScanDataEquals(prefix + "ScanData[" + i + "].", expected[i], actual[i]);
23241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        }
23341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
23441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
2352771787818003e53e8175036a3d09688c783f350Mitchell Wills    public static void assertScanDatasEquals(ScanData[] expected, ScanData[] actual) {
2362771787818003e53e8175036a3d09688c783f350Mitchell Wills        assertScanDatasEquals("", expected, actual);
2372771787818003e53e8175036a3d09688c783f350Mitchell Wills    }
2382771787818003e53e8175036a3d09688c783f350Mitchell Wills
239297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public static WifiScanner.ChannelSpec[] channelsToSpec(int... channels) {
240297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        WifiScanner.ChannelSpec[] channelSpecs = new WifiScanner.ChannelSpec[channels.length];
241297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (int i = 0; i < channels.length; ++i) {
242297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            channelSpecs[i] = new WifiScanner.ChannelSpec(channels[i]);
243297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
244297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        return channelSpecs;
245297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
246297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
247297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public static ChannelSpec[] getAllChannels(BucketSettings bucket) {
248297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        if (bucket.band == WifiScanner.WIFI_BAND_UNSPECIFIED) {
249297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            ChannelSpec[] channels = new ChannelSpec[bucket.num_channels];
250297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            for (int i = 0; i < bucket.num_channels; i++) {
251297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                channels[i] = new ChannelSpec(bucket.channels[i].frequency);
252297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            }
253297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            return channels;
254297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        } else {
255297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            return WifiChannelHelper.getChannelsForBand(bucket.band);
256297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
257297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
258297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public static ChannelSpec[] getAllChannels(ScanSettings settings) {
259297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        if (settings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) {
260297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            ChannelSpec[] channels = new ChannelSpec[settings.channels.length];
261297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            for (int i = 0; i < settings.channels.length; i++) {
262297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                channels[i] = new ChannelSpec(settings.channels[i].frequency);
263297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            }
264297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            return channels;
265297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        } else {
266297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            return WifiChannelHelper.getChannelsForBand(settings.band);
267297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
268297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
269297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills}
270