141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills/*
241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * Copyright (C) 2015 The Android Open Source Project
341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills *
441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * Licensed under the Apache License, Version 2.0 (the "License");
541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * you may not use this file except in compliance with the License.
641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * You may obtain a copy of the License at
741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills *
841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills *      http://www.apache.org/licenses/LICENSE-2.0
941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills *
1041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * Unless required by applicable law or agreed to in writing, software
1141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * distributed under the License is distributed on an "AS IS" BASIS,
1241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * See the License for the specific language governing permissions and
14a8367288377cbaed6371256ca837b7aa22280706Mitchell Wills * limitations under the License.
1541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills */
1641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
17a8367288377cbaed6371256ca837b7aa22280706Mitchell Willspackage com.android.server.wifi.scanner;
1841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
1941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport static com.android.server.wifi.ScanTestUtil.NativeScanSettingsBuilder;
2041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport static com.android.server.wifi.ScanTestUtil.assertScanDatasEquals;
2141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport static com.android.server.wifi.ScanTestUtil.createFreqSet;
2272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills
239d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Willsimport static org.junit.Assert.*;
249d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Willsimport static org.mockito.Mockito.*;
2572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills
2641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport android.net.wifi.ScanResult;
2741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport android.net.wifi.WifiScanner;
2841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport android.net.wifi.WifiSsid;
2941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport android.test.suitebuilder.annotation.SmallTest;
3041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
31a8367288377cbaed6371256ca837b7aa22280706Mitchell Willsimport com.android.server.wifi.ScanDetail;
32a8367288377cbaed6371256ca837b7aa22280706Mitchell Willsimport com.android.server.wifi.ScanResults;
33a8367288377cbaed6371256ca837b7aa22280706Mitchell Willsimport com.android.server.wifi.WifiMonitor;
34a8367288377cbaed6371256ca837b7aa22280706Mitchell Willsimport com.android.server.wifi.WifiNative;
35a8367288377cbaed6371256ca837b7aa22280706Mitchell Wills
3641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport org.junit.Before;
3741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport org.junit.Test;
3841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport org.mockito.InOrder;
3941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
4041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport java.util.ArrayList;
41d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Piusimport java.util.HashSet;
4241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport java.util.Set;
4341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
4441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills/**
45a8367288377cbaed6371256ca837b7aa22280706Mitchell Wills * Unit tests for {@link com.android.server.wifi.scanner.SupplicantWifiScannerImpl}.
4641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills */
4741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills@SmallTest
485fa6221c4e507cbc596b6de77d793ec08d690157Mitchell Willspublic class SupplicantWifiScannerTest extends BaseWifiScannerImplTest {
4941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
5041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    @Before
517d2d8c27647676c51208e417afbb8dd6c6784b7cMitchell Wills    public void setup() throws Exception {
527e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills        mScanner = new SupplicantWifiScannerImpl(mContext, mWifiNative,
53ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius                mLooper.getLooper(), mClock);
5441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
5541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
5641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    @Test
5741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    public void backgroundScanSuccessSingleBucket() {
5841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanSettings settings = new NativeScanSettingsBuilder()
5941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withBasePeriod(10000)
6041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withMaxApPerScan(10)
6141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .addBucketWithBand(10000, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN,
6241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        WifiScanner.WIFI_BAND_24_GHZ)
6341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .build();
6441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
6541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        ScanPeriod[] expectedPeriods = new ScanPeriod[] {
6641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
6772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(0, 2400),
687e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ)),
6941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
7072c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(1, 2450),
717e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ))
7241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        };
7341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
7441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        doSuccessfulTest(settings, expectedPeriods);
7541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
7641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
7741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    @Test
7841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    public void backgroundScanMaxApExceeded() {
7941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanSettings settings = new NativeScanSettingsBuilder()
8041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withBasePeriod(10000)
8141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withMaxApPerScan(2)
8241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .addBucketWithBand(10000,
8372c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                        WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN
8472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                        | WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT,
8541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        WifiScanner.WIFI_BAND_24_GHZ)
8641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .build();
8741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
8872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        ScanPeriod[] expectedPeriods = new ScanPeriod[] {
8972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            new ScanPeriod(ScanPeriod.ReportType.FULL_AND_RESULT,
9072c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.createOverflowing(0, 2,
9172c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                            new ScanDetail(WifiSsid.createFromAsciiEncoded("TEST AP 1"),
9272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                                    "00:00:00:00:00:00", "", -70, 2450, Long.MAX_VALUE, 0),
9372c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                            new ScanDetail(WifiSsid.createFromAsciiEncoded("TEST AP 2"),
9472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                                    "AA:BB:CC:DD:EE:FF", "", -66, 2400, Long.MAX_VALUE, 0),
9572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                            new ScanDetail(WifiSsid.createFromAsciiEncoded("TEST AP 3"),
9672c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                                    "00:00:00:00:00:00", "", -80, 2450, Long.MAX_VALUE, 0),
9772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                            new ScanDetail(WifiSsid.createFromAsciiEncoded("TEST AP 4"),
9872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                                    "AA:BB:CC:11:22:33", "", -65, 2450, Long.MAX_VALUE, 0)),
997e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ))
10041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        };
10141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
10272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        doSuccessfulTest(settings, expectedPeriods);
10341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
10441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
10541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    @Test
10641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    public void backgroundScanSuccessWithFullScanResults() {
10741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanSettings settings = new NativeScanSettingsBuilder()
10841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withBasePeriod(10000)
10941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withMaxApPerScan(10)
11041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .addBucketWithBand(10000,
11172c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                        WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN
11272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                        | WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT,
11341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        WifiScanner.WIFI_BAND_24_GHZ)
11441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .build();
11541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
11641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        ScanPeriod[] expectedPeriods = new ScanPeriod[] {
11741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.FULL_AND_RESULT,
11872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(0, 2400, 2450, 2400, 2400),
1197e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ)),
12041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.FULL_AND_RESULT,
12172c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(1, 2450, 2400, 2450, 2400),
1227e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ))
12341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        };
12441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
12541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        doSuccessfulTest(settings, expectedPeriods);
12641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
12741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
12841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    @Test
12941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    public void backgroundScanSuccessWithMixedFullResultsAndNot() {
13041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanSettings settings = new NativeScanSettingsBuilder()
13141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withBasePeriod(10000)
13241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withMaxApPerScan(10)
13341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .addBucketWithBand(10000,
13441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN,
13541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        WifiScanner.WIFI_BAND_24_GHZ)
13641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .addBucketWithBand(20000,
13772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                        WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN
13872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                        | WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT,
13941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        WifiScanner.WIFI_BAND_5_GHZ)
14041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .build();
14141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
14241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        ScanPeriod[] expectedPeriods = new ScanPeriod[] {
14341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.FULL_AND_RESULT,
14472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(0, 2400, 2450, 2400, 5175),
1457e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_BOTH)),
14641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
14772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(1, 2450, 2400, 2450, 2400),
1487e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ)),
14941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.FULL_AND_RESULT,
15072c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(2, 2450, 2400, 2450, 5150),
1517e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_BOTH))
15241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        };
15341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
15441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        doSuccessfulTest(settings, expectedPeriods);
15541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
15641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
15741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    @Test
15841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    public void backgroundScanNoBatch() {
15941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanSettings settings = new NativeScanSettingsBuilder()
16041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withBasePeriod(10000)
16141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withMaxApPerScan(10)
16241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .addBucketWithBand(10000,
16341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        WifiScanner.REPORT_EVENT_NO_BATCH,
16441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        WifiScanner.WIFI_BAND_24_GHZ)
16541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .build();
16641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
16741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        ScanPeriod[] expectedPeriods = new ScanPeriod[] {
16841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.NONE,
16972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(0, 2400, 2400, 2400),
1707e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ)),
17141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.NONE,
17272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(1, 2400, 2400, 2450),
1737e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ)),
17441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.NONE,
17572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(2, 2400, 2450, 2400),
1767e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ))
17741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        };
17841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
17941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        doSuccessfulTest(settings, expectedPeriods);
18041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
18141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
18241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    @Test
18341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    public void backgroundScanBatch() {
18441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanSettings settings = new NativeScanSettingsBuilder()
18541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withBasePeriod(10000)
18641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withMaxApPerScan(10)
18741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withMaxScansToCache(3)
18841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .addBucketWithBand(10000,
18941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        WifiScanner.REPORT_EVENT_AFTER_BUFFER_FULL,
19041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        WifiScanner.WIFI_BAND_24_GHZ)
19141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .build();
19241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
1932771787818003e53e8175036a3d09688c783f350Mitchell Wills        ScanResults[] periodResults = new ScanResults[] {
1942771787818003e53e8175036a3d09688c783f350Mitchell Wills            ScanResults.create(0, 2400, 2400, 2400),
1952771787818003e53e8175036a3d09688c783f350Mitchell Wills            ScanResults.create(1, 2400, 2400, 2400, 2400),
1962771787818003e53e8175036a3d09688c783f350Mitchell Wills            ScanResults.create(2, 2450),
1972771787818003e53e8175036a3d09688c783f350Mitchell Wills            ScanResults.create(3, 2400, 2400),
1982771787818003e53e8175036a3d09688c783f350Mitchell Wills            ScanResults.create(4, 2400, 2450),
1992771787818003e53e8175036a3d09688c783f350Mitchell Wills            ScanResults.create(5, 2450)
2002771787818003e53e8175036a3d09688c783f350Mitchell Wills        };
2012771787818003e53e8175036a3d09688c783f350Mitchell Wills
20241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        ScanPeriod[] expectedPeriods = new ScanPeriod[] {
20341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.NONE,
2042771787818003e53e8175036a3d09688c783f350Mitchell Wills                    periodResults[0],
2057e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ)),
20641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.NONE,
2072771787818003e53e8175036a3d09688c783f350Mitchell Wills                    periodResults[1],
2087e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ)),
20941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
21041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                    new ScanResults[] {
2112771787818003e53e8175036a3d09688c783f350Mitchell Wills                        periodResults[0],
2122771787818003e53e8175036a3d09688c783f350Mitchell Wills                        periodResults[1],
2132771787818003e53e8175036a3d09688c783f350Mitchell Wills                        periodResults[2]
21441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                    },
2157e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ)),
21641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.NONE,
2172771787818003e53e8175036a3d09688c783f350Mitchell Wills                    periodResults[3],
2187e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ)),
21941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.NONE,
2202771787818003e53e8175036a3d09688c783f350Mitchell Wills                    periodResults[4],
2217e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ)),
22241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
22341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                    new ScanResults[] {
2242771787818003e53e8175036a3d09688c783f350Mitchell Wills                        periodResults[3],
2252771787818003e53e8175036a3d09688c783f350Mitchell Wills                        periodResults[4],
2262771787818003e53e8175036a3d09688c783f350Mitchell Wills                        periodResults[5]
22741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                    },
2287e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ))
22941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        };
23041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
23141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        doSuccessfulTest(settings, expectedPeriods);
23241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
23341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
23441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    @Test
23541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    public void backgroundScanSuccessWithMultipleBuckets() {
23641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanSettings settings = new NativeScanSettingsBuilder()
23741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withBasePeriod(10000)
23841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withMaxApPerScan(10)
23941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .addBucketWithBand(10000, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN,
24041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        WifiScanner.WIFI_BAND_24_GHZ)
24141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .addBucketWithBand(30000, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN,
24241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        WifiScanner.WIFI_BAND_BOTH)
24341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .addBucketWithChannels(20000, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN,
24441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        5650)
24541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .build();
24641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
24741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        ScanPeriod[] expectedPeriods = new ScanPeriod[] {
24841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
24972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(0, 2400, 5175),
2507e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandAndChannelScanFreqs(WifiScanner.WIFI_BAND_BOTH, 5650)),
25141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
25272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(1, 2400),
2537e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ)),
25441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
25572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(2, 2450, 5650),
2567e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandAndChannelScanFreqs(WifiScanner.WIFI_BAND_24_GHZ, 5650)),
25741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
25872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(3, 2450, 5175),
2597e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_BOTH)),
26041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
26172c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(4, new int[0]),
2627e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandAndChannelScanFreqs(WifiScanner.WIFI_BAND_24_GHZ, 5650)),
26341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
26472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(5, 2400, 2400, 2400, 2450),
2657e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ)),
26641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
26772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(6, 5150, 5650, 5650),
2687e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandAndChannelScanFreqs(WifiScanner.WIFI_BAND_BOTH, 5650))
26941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        };
27041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
27141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        doSuccessfulTest(settings, expectedPeriods);
27241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
27341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
27441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    @Test
27541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    public void backgroundScanSuccessWithMultipleBucketsWhereAPeriodDoesNotRequireAScan() {
27641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanSettings settings = new NativeScanSettingsBuilder()
27741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withBasePeriod(10000)
27841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withMaxApPerScan(10)
27941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .addBucketWithBand(30000, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN,
28041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        WifiScanner.WIFI_BAND_BOTH)
28141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .addBucketWithChannels(20000, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN,
28241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        5650)
28341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .build();
28441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
28541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // expected scan frequencies
28641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        ScanPeriod[] expectedPeriods = new ScanPeriod[] {
28741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
28872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(0, 2400, 5175),
2897e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandAndChannelScanFreqs(WifiScanner.WIFI_BAND_BOTH, 5650)),
29041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            null,
29141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
29272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(1, 5650),
29372c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    createFreqSet(5650)),
29441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
29572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(2, 2450, 5175),
2967e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_BOTH)),
29741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
29872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(3, 5650, 5650, 5650),
29972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    createFreqSet(5650)),
30041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            null,
30141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
30272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(4, 2400, 2400, 2400, 2450),
3037e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandAndChannelScanFreqs(WifiScanner.WIFI_BAND_BOTH, 5650))
30441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        };
30541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
30641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        doSuccessfulTest(settings, expectedPeriods);
30741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
30841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
30941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    @Test
31041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    public void backgroundScanStartFailed() {
31141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
31241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanSettings settings = new NativeScanSettingsBuilder()
31341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withBasePeriod(10000)
31441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withMaxApPerScan(10)
31541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .addBucketWithBand(10000, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN,
31641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        WifiScanner.WIFI_BAND_24_GHZ)
31741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .build();
31841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
31972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        InOrder order = inOrder(eventHandler, mWifiNative);
32041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
32141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // All scans fail
3223d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius        when(mWifiNative.scan(any(Set.class), any(Set.class))).thenReturn(false);
32341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
32441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // Start scan
32572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        mScanner.startBatchedScan(settings, eventHandler);
32641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
3279d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills        assertBackgroundPeriodAlarmPending();
32841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
3297e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills        expectFailedScanStart(order, eventHandler,
330d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius                expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ), new HashSet<Integer>());
33141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
33241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // Fire alarm to start next scan
3339d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills        dispatchBackgroundPeriodAlarm();
33441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
3359d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills        assertBackgroundPeriodAlarmPending();
33641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
3377e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills        expectFailedScanStart(order, eventHandler,
338d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius                expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ), new HashSet<Integer>());
33941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
34041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        verifyNoMoreInteractions(eventHandler);
34141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
34241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
34341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
34441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    @Test
34541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    public void backgroundScanEventFailed() {
34641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
34741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanSettings settings = new NativeScanSettingsBuilder()
34841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withBasePeriod(10000)
34941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withMaxApPerScan(10)
35041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .addBucketWithBand(10000, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN,
35141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        WifiScanner.WIFI_BAND_24_GHZ)
35241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .build();
35341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
35472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        InOrder order = inOrder(eventHandler, mWifiNative);
35541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
35641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // All scan starts succeed
3573d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius        when(mWifiNative.scan(any(Set.class), any(Set.class))).thenReturn(true);
35841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
35941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // Start scan
36072c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        mScanner.startBatchedScan(settings, eventHandler);
36141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
3629d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills        assertBackgroundPeriodAlarmPending();
36341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
3647e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills        expectFailedEventScan(order, eventHandler,
365d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius                expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ), new HashSet<Integer>());
36641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
36741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // Fire alarm to start next scan
3689d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills        dispatchBackgroundPeriodAlarm();
36941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
3709d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills        assertBackgroundPeriodAlarmPending();
37141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
3727e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills        expectFailedEventScan(order, eventHandler,
373d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius                expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ), new HashSet<Integer>());
37441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
37541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        verifyNoMoreInteractions(eventHandler);
37641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
37741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
37841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    /**
37941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     * Run a scan and then pause after the first scan completes, but before the next one starts
38041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     * Then resume the scan
38141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     */
38241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    @Test
38341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    public void pauseWhileWaitingToStartNextScanAndResumeScan() {
38441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
38541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanSettings settings = new NativeScanSettingsBuilder()
38641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withBasePeriod(10000)
38741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withMaxApPerScan(10)
38841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .addBucketWithBand(10000, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN,
38941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        WifiScanner.WIFI_BAND_24_GHZ)
39041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .build();
39141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
39241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        ScanPeriod[] expectedPeriods = new ScanPeriod[] {
39341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
39472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(0, 2400, 2450, 2450),
3957e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ)),
39641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
39772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(1, 2400),
3987e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ))
39941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        };
40041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
40172c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        InOrder order = inOrder(eventHandler, mWifiNative);
40241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
40341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // All scan starts succeed
4043d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius        when(mWifiNative.scan(any(Set.class), any(Set.class))).thenReturn(true);
40541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
40641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // Start scan
40772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        mScanner.startBatchedScan(settings, eventHandler);
40841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
4099d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills        assertBackgroundPeriodAlarmPending();
41041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
4112771787818003e53e8175036a3d09688c783f350Mitchell Wills        expectSuccessfulBackgroundScan(order, eventHandler, expectedPeriods[0], 0);
41241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
4139d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills        assertBackgroundPeriodAlarmPending();
41441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
41572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        mScanner.pauseBatchedScan();
41641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
41741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // onPause callback (previous results were flushed)
41841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        order.verify(eventHandler).onScanPaused(new WifiScanner.ScanData[0]);
41941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
4209d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills        assertBackgroundPeriodAlarmNotPending();
42141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
42272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        mScanner.restartBatchedScan();
42341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
42441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // onRestarted callback
42541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        order.verify(eventHandler).onScanRestarted();
42641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
4272771787818003e53e8175036a3d09688c783f350Mitchell Wills        expectSuccessfulBackgroundScan(order, eventHandler, expectedPeriods[1], 1);
42841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
42941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        verifyNoMoreInteractions(eventHandler);
43041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
43141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
43241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    /**
43341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     * Run a scan and then pause while the first scan is running
43441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     * Then resume the scan
43541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     */
43641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    @Test
43741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    public void pauseWhileScanningAndResumeScan() {
43841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
43941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanSettings settings = new NativeScanSettingsBuilder()
44041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withBasePeriod(10000)
44141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withMaxApPerScan(10)
44241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .addBucketWithBand(10000, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN,
44341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        WifiScanner.WIFI_BAND_24_GHZ)
44441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .build();
44541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
44641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        ScanPeriod[] expectedPeriods = new ScanPeriod[] {
44741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
44872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(0, 2400, 2450, 2450),
4497e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ)),
45041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
45172c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(1, 2400),
4527e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ))
45341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        };
45441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
45572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        InOrder order = inOrder(eventHandler, mWifiNative);
45641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
45741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // All scan starts succeed
4583d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius        when(mWifiNative.scan(any(Set.class), any(Set.class))).thenReturn(true);
45941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
46041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // Start scan
46172c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        mScanner.startBatchedScan(settings, eventHandler);
46241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
4639d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills        assertBackgroundPeriodAlarmPending();
46441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
4653d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius        order.verify(mWifiNative).scan(eq(expectedPeriods[0].getScanFreqs()), any(Set.class));
46641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
46772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        mScanner.pauseBatchedScan();
46841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
46941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // onPause callback (no pending results)
47041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        order.verify(eventHandler).onScanPaused(new WifiScanner.ScanData[0]);
47141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
4729d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills        assertBackgroundPeriodAlarmNotPending();
47341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
47441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // Setup scan results
47572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        when(mWifiNative.getScanResults()).thenReturn(expectedPeriods[0]
47672c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                .getResultsToBeDelivered()[0].getScanDetailArrayList());
47741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
47841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // Notify scan has finished
47972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        mWifiMonitor.sendMessage(mWifiNative.getInterfaceName(), WifiMonitor.SCAN_RESULTS_EVENT);
48072c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        assertEquals("dispatch message after results event", 1, mLooper.dispatchAll());
48141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
48241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // listener should not be notified
48341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
48472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        mScanner.restartBatchedScan();
48541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
48641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // onRestarted callback
48741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        order.verify(eventHandler).onScanRestarted();
48841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
4892771787818003e53e8175036a3d09688c783f350Mitchell Wills        expectSuccessfulBackgroundScan(order, eventHandler, expectedPeriods[1], 1);
49041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
49141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        verifyNoMoreInteractions(eventHandler);
49241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
49341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
49441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
49541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    /**
49641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     * Run a scan and then pause after the first scan completes, but before the next one starts
49741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     * Then schedule a new scan while still paused
49841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     */
49941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    @Test
50041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    public void pauseWhileWaitingToStartNextScanAndStartNewScan() {
50141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
50241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanSettings settings = new NativeScanSettingsBuilder()
50341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withBasePeriod(10000)
50441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withMaxApPerScan(10)
50541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .addBucketWithBand(10000, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN,
50641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        WifiScanner.WIFI_BAND_24_GHZ)
50741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .build();
50841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
50941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanSettings settings2 = new NativeScanSettingsBuilder()
51041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withBasePeriod(10000)
51141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .withMaxApPerScan(10)
51241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .addBucketWithBand(10000, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN,
51341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        WifiScanner.WIFI_BAND_5_GHZ)
51441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                .build();
51541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
51641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        ScanPeriod[] expectedPeriods = new ScanPeriod[] {
51741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
51872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(0, 2400, 2450, 2450),
5197e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ))
52041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        };
52141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
52241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        ScanPeriod[] expectedPeriods2 = new ScanPeriod[] {
52341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            new ScanPeriod(ScanPeriod.ReportType.RESULT,
52472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    ScanResults.create(1, 5150, 5175, 5175),
5257e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills                    expectedBandScanFreqs(WifiScanner.WIFI_BAND_5_GHZ)),
52641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        };
52741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
52872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        InOrder order = inOrder(eventHandler, mWifiNative);
52941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
53041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // All scan starts succeed
5313d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius        when(mWifiNative.scan(any(Set.class), any(Set.class))).thenReturn(true);
53241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
53341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // Start scan
53472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        mScanner.startBatchedScan(settings, eventHandler);
53541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
5369d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills        assertBackgroundPeriodAlarmPending();
53741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
5382771787818003e53e8175036a3d09688c783f350Mitchell Wills        expectSuccessfulBackgroundScan(order, eventHandler, expectedPeriods[0], 0);
53941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
5409d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills        assertBackgroundPeriodAlarmPending();
54141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
54272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        mScanner.pauseBatchedScan();
54341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
54441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // onPause callback (previous results were flushed)
54541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        order.verify(eventHandler).onScanPaused(new WifiScanner.ScanData[0]);
54641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
5479d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills        assertBackgroundPeriodAlarmNotPending();
54841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
54941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // Start new scan
55072c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        mScanner.startBatchedScan(settings2, eventHandler);
55141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
5522771787818003e53e8175036a3d09688c783f350Mitchell Wills        expectSuccessfulBackgroundScan(order, eventHandler, expectedPeriods2[0], 0);
55341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
55441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        verifyNoMoreInteractions(eventHandler);
55541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
55641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
55741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    /**
55841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     * Run a test with the given settings where all native scans succeed
55941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     * This will execute expectedPeriods.length scan periods by first
56041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     * starting the scan settings and then dispatching the scan period alarm to start the
56141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     * next scan.
56241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     */
56341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    private void doSuccessfulTest(WifiNative.ScanSettings settings, ScanPeriod[] expectedPeriods) {
56441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
56541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
56672c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        InOrder order = inOrder(eventHandler, mWifiNative);
56741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
56841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // All scans succeed
5693d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius        when(mWifiNative.scan(any(Set.class), any(Set.class))).thenReturn(true);
57041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
57141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // Start scan
57272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        mScanner.startBatchedScan(settings, eventHandler);
57341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
57441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        for (int i = 0; i < expectedPeriods.length; ++i) {
57541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            ScanPeriod period = expectedPeriods[i];
5769d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills            assertBackgroundPeriodAlarmPending();
5779d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills            if (period != null) { // scan should be scheduled
5782771787818003e53e8175036a3d09688c783f350Mitchell Wills                expectSuccessfulBackgroundScan(order, eventHandler, expectedPeriods[i], i);
57941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            }
58041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            if (i < expectedPeriods.length - 1) {
5819d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills                dispatchBackgroundPeriodAlarm();
58241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            }
58341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        }
58441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
58541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        verifyNoMoreInteractions(eventHandler);
58641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
58741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
58841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    /**
58941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     * Verify the state after a scan was started either through startBatchedScan or
59041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     * dispatching the period alarm.
59141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     */
5925fa6221c4e507cbc596b6de77d793ec08d690157Mitchell Wills    private void expectSuccessfulBackgroundScan(InOrder order,
5932771787818003e53e8175036a3d09688c783f350Mitchell Wills            WifiNative.ScanEventHandler eventHandler, ScanPeriod period, int periodId) {
59441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        WifiScanner.ScanData[] scanDatas = null;
59541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        ArrayList<ScanDetail> nativeResults = null;
59641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        ScanResult[] fullResults = null;
59741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        if (period.getResultsToBeDelivered() != null) {
59841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            ScanResults lastPeriodResults = period.getResultsToBeDelivered()
59941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                    [period.getResultsToBeDelivered().length - 1];
60041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            nativeResults = lastPeriodResults.getScanDetailArrayList();
60141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            if (period.expectResults()) {
60241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                scanDatas =
60341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                        new WifiScanner.ScanData[period.getResultsToBeDelivered().length];
60441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                for (int j = 0; j < scanDatas.length; ++j) {
60541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                    scanDatas[j] = period.getResultsToBeDelivered()[j].getScanData();
60641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                }
60741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            }
60841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            if (period.expectFullResults()) {
60941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                fullResults = lastPeriodResults.getRawScanResults();
61041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            }
61141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        }
6125fa6221c4e507cbc596b6de77d793ec08d690157Mitchell Wills        expectSuccessfulBackgroundScan(order, eventHandler, period.getScanFreqs(),
613d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius                new HashSet<Integer>(), nativeResults, scanDatas, fullResults, periodId);
61441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
61541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
61641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    /**
61741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     * Verify the state after a scan was started either through startBatchedScan or
61841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     * dispatching the period alarm.
61941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills     */
6205fa6221c4e507cbc596b6de77d793ec08d690157Mitchell Wills    private void expectSuccessfulBackgroundScan(InOrder order,
6215fa6221c4e507cbc596b6de77d793ec08d690157Mitchell Wills            WifiNative.ScanEventHandler eventHandler, Set<Integer> scanFreqs,
622d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius            Set<Integer> networkIds, ArrayList<ScanDetail> nativeResults,
623d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius            WifiScanner.ScanData[] expectedScanResults,
6242771787818003e53e8175036a3d09688c783f350Mitchell Wills            ScanResult[] fullResults, int periodId) {
62541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // Verify scan started
626d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2Roshan Pius        order.verify(mWifiNative).scan(eq(scanFreqs), eq(networkIds));
62741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
62841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // Setup scan results
62972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        when(mWifiNative.getScanResults()).thenReturn(nativeResults);
63041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
63141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // Notify scan has finished
63272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        mWifiMonitor.sendMessage(mWifiNative.getInterfaceName(), WifiMonitor.SCAN_RESULTS_EVENT);
63372c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        assertEquals("dispatch message after results event", 1, mLooper.dispatchAll());
63441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
63541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        if (fullResults != null) {
63641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            for (ScanResult result : fullResults) {
637c9e6069eb941d282af213dc20b171877db6b567bMitchell Wills                order.verify(eventHandler).onFullScanResult(eq(result), eq(0));
63841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            }
63941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        }
64041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
64141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        if (expectedScanResults != null) {
64241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            // Verify scan results delivered
64363539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills            order.verify(eventHandler).onScanStatus(WifiNative.WIFI_SCAN_RESULTS_AVAILABLE);
6442771787818003e53e8175036a3d09688c783f350Mitchell Wills            assertScanDatasEquals("period[" + periodId + "].", expectedScanResults,
6452771787818003e53e8175036a3d09688c783f350Mitchell Wills                    mScanner.getLatestBatchedScanResults(true));
64641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        }
64741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
64841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
64941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    private void expectFailedScanStart(InOrder order, WifiNative.ScanEventHandler eventHandler,
6503d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius            Set<Integer> scanFreqs, Set<Integer> networkIds) {
65141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // Verify scan started
6523d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius        order.verify(mWifiNative).scan(eq(scanFreqs), eq(networkIds));
65363539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills
65463539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills        // TODO: verify failure event
65541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
65641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
65741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    private void expectFailedEventScan(InOrder order, WifiNative.ScanEventHandler eventHandler,
6583d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius            Set<Integer> scanFreqs, Set<Integer> networkIds) {
65941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // Verify scan started
6603d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius        order.verify(mWifiNative).scan(eq(scanFreqs), eq(networkIds));
66141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
66241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        // Notify scan has failed
66372c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        mWifiMonitor.sendMessage(mWifiNative.getInterfaceName(), WifiMonitor.SCAN_FAILED_EVENT);
66472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        assertEquals("dispatch message after results event", 1, mLooper.dispatchAll());
66563539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills
66663539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills        // TODO: verify failure event
66741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
66841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
6699d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills    private void assertBackgroundPeriodAlarmPending() {
6709d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills        assertTrue("background period alarm not pending",
6719d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills                mAlarmManager.isPending(SupplicantWifiScannerImpl.BACKGROUND_PERIOD_ALARM_TAG));
6729d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills    }
6739d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills
6749d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills    private void assertBackgroundPeriodAlarmNotPending() {
6759d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills        assertFalse("background period alarm is pending",
6769d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills                mAlarmManager.isPending(SupplicantWifiScannerImpl.BACKGROUND_PERIOD_ALARM_TAG));
6779d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills    }
6789d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills
6799d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills    private void dispatchBackgroundPeriodAlarm() {
6809d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills        assertTrue("dispatch background period alarm",
6819d0c558cab7c80a572a32ae70d501df15367fd5fMitchell Wills                mAlarmManager.dispatch(SupplicantWifiScannerImpl.BACKGROUND_PERIOD_ALARM_TAG));
68263539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills        mLooper.dispatchAll();
68341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
68441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
68541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    private static class ScanPeriod {
68641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        enum ReportType {
68741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            NONE(false, false),
68841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            RESULT(true, false),
68941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            FULL_AND_RESULT(true, true),
69041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            FULL(false, true);
69141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
69241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            public final boolean result;
69341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            public final boolean full;
69441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            private ReportType(boolean result, boolean full) {
69541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                this.result = result;
69641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills                this.full = full;
69741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            }
69841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        };
69941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        private final ReportType mReportType;
70041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        private final ScanResults[] mDeliveredResults;
70141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        private final Set<Integer> mRequestedFreqs;
70241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
70372c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        public ScanPeriod(ReportType reportType, ScanResults deliveredResult,
70472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                Set<Integer> requestedFreqs) {
70572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            this(reportType, new ScanResults[] {deliveredResult}, requestedFreqs);
70672c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        }
70772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills
70872c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        public ScanPeriod(ReportType reportType, ScanResults[] deliveredResults,
70972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                Set<Integer> requestedFreqs) {
71041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            mReportType = reportType;
71141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            mDeliveredResults = deliveredResults;
71272c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            mRequestedFreqs = requestedFreqs;
71341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        }
71441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills
71541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        public boolean expectResults() {
71641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            return mReportType.result;
71741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        }
71841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        public boolean expectFullResults() {
71941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            return mReportType.full;
72041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        }
72141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        public final ScanResults[] getResultsToBeDelivered() {
72241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            return mDeliveredResults;
72341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        }
72441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        public Set<Integer> getScanFreqs() {
72541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills            return mRequestedFreqs;
72641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills        }
72741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills    }
72841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills}
729