WificondPnoScannerTest.java revision dcd877d6c143db557884993ea437e2a432cb0ba3
162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius/*
262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius * Copyright (C) 2016 The Android Open Source Project
362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius *
462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius * Licensed under the Apache License, Version 2.0 (the "License");
562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius * you may not use this file except in compliance with the License.
662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius * You may obtain a copy of the License at
762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius *
862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius *      http://www.apache.org/licenses/LICENSE-2.0
962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius *
1062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius * Unless required by applicable law or agreed to in writing, software
1162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius * distributed under the License is distributed on an "AS IS" BASIS,
1262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius * See the License for the specific language governing permissions and
1462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius * limitations under the License
1562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius */
1662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
1762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piuspackage com.android.server.wifi;
1862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
1962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport android.content.Context;
2062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport android.net.wifi.ScanResult;
2162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport android.net.wifi.WifiConfiguration;
2262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport android.net.wifi.WifiScanner;
2362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport android.test.suitebuilder.annotation.SmallTest;
2462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
2562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport com.android.internal.R;
2662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport com.android.server.wifi.scanner.ChannelHelper.ChannelCollection;
2762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
2862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport org.junit.Before;
2962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport org.junit.Test;
3062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport org.mockito.InOrder;
3162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport org.mockito.Mock;
3262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport org.mockito.MockitoAnnotations;
3362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
3462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport java.util.Arrays;
3562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport java.util.Collections;
3662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport java.util.HashSet;
3762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport java.util.List;
3862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport java.util.Set;
3962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
4062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport static com.android.server.wifi.ScanTestUtil.NativeScanSettingsBuilder;
4162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport static com.android.server.wifi.ScanTestUtil.assertScanDataEquals;
4262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport static org.junit.Assert.assertEquals;
4362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport static org.junit.Assert.assertTrue;
4462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport static org.mockito.Mockito.any;
4562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport static org.mockito.Mockito.anyBoolean;
4662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport static org.mockito.Mockito.anyInt;
4762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport static org.mockito.Mockito.anyObject;
4862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport static org.mockito.Mockito.anyString;
4962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport static org.mockito.Mockito.eq;
5062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport static org.mockito.Mockito.inOrder;
5162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport static org.mockito.Mockito.mock;
5262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport static org.mockito.Mockito.never;
5362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport static org.mockito.Mockito.verify;
5462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport static org.mockito.Mockito.verifyNoMoreInteractions;
5562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piusimport static org.mockito.Mockito.when;
5662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
5762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius/**
5862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius * Unit tests for {@link com.android.server.wifi.SupplicantWifiScannerImpl.setPnoList}.
5962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius */
6062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius@SmallTest
6162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Piuspublic class SupplicantPnoScannerTest {
6262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
6362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    @Mock Context mContext;
6462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    MockAlarmManager mAlarmManager;
6562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    MockWifiMonitor mWifiMonitor;
6662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    MockLooper mLooper;
6762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    @Mock WifiNative mWifiNative;
6862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    MockResources mResources;
6962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    SupplicantWifiScannerImpl mScanner;
7062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
7162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    @Before
7262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    public void setup() throws Exception {
7362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        MockitoAnnotations.initMocks(this);
7462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
7562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        mLooper = new MockLooper();
7662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        mAlarmManager = new MockAlarmManager();
7762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        mWifiMonitor = new MockWifiMonitor();
7862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        mResources = new MockResources();
7962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
8062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        when(mWifiNative.getInterfaceName()).thenReturn("a_test_interface_name");
8162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        when(mContext.getSystemService(Context.ALARM_SERVICE))
8262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius                .thenReturn(mAlarmManager.getAlarmManager());
8362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        when(mContext.getResources()).thenReturn(mResources);
8462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    }
8562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
8662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    /**
8762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius     * Verify that the HW PNO scan triggers a supplicant PNO scan and invokes the OnPnoNetworkFound
8862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius     * callback when the scan results are received.
8962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius     */
9062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    @Test
91dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius    public void startHwDisconnectedPnoScan() {
9262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        createScannerWithHwPnoScanSupport();
9362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
9462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        WifiNative.PnoEventHandler pnoEventHandler = mock(WifiNative.PnoEventHandler.class);
95dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        WifiNative.PnoSettings pnoSettings = createDummyPnoSettings(false);
9662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        ScanResults scanResults = createDummyScanResults();
9762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
9862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        InOrder order = inOrder(pnoEventHandler, mWifiNative);
9962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
10062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        // Start PNO scan
10162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        startSuccessfulPnoScan(null, pnoSettings, null, pnoEventHandler);
10262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
103dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        expectSuccessfulHwDisconnectedPnoScan(order, pnoSettings, pnoEventHandler, scanResults);
10462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
10562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        verifyNoMoreInteractions(pnoEventHandler);
10662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    }
10762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
10862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    /**
10962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius     * Verify that we pause & resume HW PNO scan when a single scan is scheduled.
11062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius     */
11162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    @Test
112dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius    public void pauseResumeHwDisconnectedPnoScanForSingleScan() {
11362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        createScannerWithHwPnoScanSupport();
11462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
11562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        WifiNative.PnoEventHandler pnoEventHandler = mock(WifiNative.PnoEventHandler.class);
116dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        WifiNative.PnoSettings pnoSettings = createDummyPnoSettings(false);
11762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
11862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        WifiNative.ScanSettings settings = createDummyScanSettings();
11962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        ScanResults scanResults = createDummyScanResults();
12062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
12162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        InOrder order = inOrder(eventHandler, mWifiNative);
12262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
12362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        // Start PNO scan
12462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        startSuccessfulPnoScan(null, pnoSettings, null, pnoEventHandler);
12562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
12662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        // Start single scan
12762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        assertTrue(mScanner.startSingleScan(settings, eventHandler));
12862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        // Verify that the PNO scan was paused and single scan runs successfully
12962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        expectSuccessfulSingleScanWithHwPnoEnabled(order, eventHandler,
13062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius                expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ), new HashSet<Integer>(),
13162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius                scanResults);
13262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        verifyNoMoreInteractions(eventHandler);
13362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
13462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        order = inOrder(pnoEventHandler, mWifiNative);
13562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
13662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        // Now verify that PNO scan is resumed successfully
137dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        expectSuccessfulHwDisconnectedPnoScan(order, pnoSettings, pnoEventHandler, scanResults);
13862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        verifyNoMoreInteractions(pnoEventHandler);
13962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    }
14062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
14162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    /**
14262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius     * Verify that the SW PNO scan triggers a background scan and invokes the OnPnoNetworkFound
14362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius     * callback when the scan results are received.
14462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius     */
14562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    @Test
146dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius    public void startSwDisconnectedPnoScan() {
14762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        createScannerWithSwPnoScanSupport();
14862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
14962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        WifiNative.PnoEventHandler pnoEventHandler = mock(WifiNative.PnoEventHandler.class);
150dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        WifiNative.PnoSettings pnoSettings = createDummyPnoSettings(false);
151dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        WifiNative.ScanEventHandler scanEventHandler = mock(WifiNative.ScanEventHandler.class);
152dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        WifiNative.ScanSettings scanSettings = createDummyScanSettings();
153dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        ScanResults scanResults = createDummyScanResults();
154dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius
155dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        InOrder order = inOrder(pnoEventHandler, mWifiNative);
156dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius
157dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        // Start PNO scan
158dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        startSuccessfulPnoScan(scanSettings, pnoSettings, scanEventHandler, pnoEventHandler);
159dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius
160dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        expectSuccessfulSwPnoScan(order, pnoEventHandler, scanResults);
161dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius
162dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        verifyNoMoreInteractions(pnoEventHandler);
163dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius    }
164dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius
165dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius    /**
166dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius     * Verify that the connected PNO scan triggers a background scan and invokes the
167dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius     * OnPnoNetworkFound callback when the scan results are received.
168dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius     */
169dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius    @Test
170dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius    public void startHwConnectedPnoScan() {
171dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        createScannerWithHwPnoScanSupport();
172dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius
173dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        WifiNative.PnoEventHandler pnoEventHandler = mock(WifiNative.PnoEventHandler.class);
174dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        WifiNative.PnoSettings pnoSettings = createDummyPnoSettings(true);
175dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        WifiNative.ScanEventHandler scanEventHandler = mock(WifiNative.ScanEventHandler.class);
176dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        WifiNative.ScanSettings scanSettings = createDummyScanSettings();
177dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        ScanResults scanResults = createDummyScanResults();
178dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius
179dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        InOrder order = inOrder(pnoEventHandler, mWifiNative);
180dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius
181dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        // Start PNO scan
182dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        startSuccessfulPnoScan(scanSettings, pnoSettings, scanEventHandler, pnoEventHandler);
183dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius
184dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        expectSuccessfulSwPnoScan(order, pnoEventHandler, scanResults);
185dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius
186dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        verifyNoMoreInteractions(pnoEventHandler);
187dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius    }
188dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius
189dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius    /**
190dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius     * Verify that the connected PNO scan triggers a background scan and invokes the
191dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius     * OnPnoNetworkFound callback when the scan results are received.
192dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius     */
193dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius    @Test
194dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius    public void startSwConnectedPnoScan() {
195dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        createScannerWithSwPnoScanSupport();
196dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius
197dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        WifiNative.PnoEventHandler pnoEventHandler = mock(WifiNative.PnoEventHandler.class);
198dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        WifiNative.PnoSettings pnoSettings = createDummyPnoSettings(true);
19962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        WifiNative.ScanEventHandler scanEventHandler = mock(WifiNative.ScanEventHandler.class);
20062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        WifiNative.ScanSettings scanSettings = createDummyScanSettings();
20162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        ScanResults scanResults = createDummyScanResults();
20262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
20362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        InOrder order = inOrder(pnoEventHandler, mWifiNative);
20462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
20562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        // Start PNO scan
20662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        startSuccessfulPnoScan(scanSettings, pnoSettings, scanEventHandler, pnoEventHandler);
20762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
20862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        expectSuccessfulSwPnoScan(order, pnoEventHandler, scanResults);
20962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
21062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        verifyNoMoreInteractions(pnoEventHandler);
21162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    }
21262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
21362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    private void createScannerWithHwPnoScanSupport() {
21462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        mResources.setBoolean(R.bool.config_wifi_background_scan_support, true);
21562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        mScanner = new SupplicantWifiScannerImpl(mContext, mWifiNative, mLooper.getLooper());
21662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    }
21762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
21862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    private void createScannerWithSwPnoScanSupport() {
21962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        mResources.setBoolean(R.bool.config_wifi_background_scan_support, false);
22062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        mScanner = new SupplicantWifiScannerImpl(mContext, mWifiNative, mLooper.getLooper());
22162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    }
22262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
223dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius    private WifiNative.PnoSettings createDummyPnoSettings(boolean isConnected) {
22462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        WifiNative.PnoSettings pnoSettings = new WifiNative.PnoSettings();
225dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        pnoSettings.isConnected = isConnected;
22662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        pnoSettings.networkList = new WifiNative.PnoNetwork[2];
22762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        pnoSettings.networkList[0] = new WifiNative.PnoNetwork();
22862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        pnoSettings.networkList[0].ssid = "ssid_pno_1";
22962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        pnoSettings.networkList[0].networkId = 1;
23062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        pnoSettings.networkList[0].priority = 1;
23162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        pnoSettings.networkList[1] = new WifiNative.PnoNetwork();
23262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        pnoSettings.networkList[1].ssid = "ssid_pno_2";
23362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        pnoSettings.networkList[1].networkId = 2;
23462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        pnoSettings.networkList[1].priority = 2;
23562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        return pnoSettings;
23662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    }
23762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
23862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    private WifiNative.ScanSettings createDummyScanSettings() {
23962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        WifiNative.ScanSettings settings = new NativeScanSettingsBuilder()
24062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius                .withBasePeriod(10000)
24162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius                .withMaxApPerScan(10)
24262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius                .addBucketWithBand(10000, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN,
24362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius                        WifiScanner.WIFI_BAND_24_GHZ)
24462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius                .build();
24562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        return settings;
24662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    }
24762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
24862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    private ScanResults createDummyScanResults() {
24962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        return ScanResults.create(0, 2400, 2450, 2450, 2400, 2450, 2450, 2400, 2450, 2450);
25062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    }
25162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
25262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    private void startSuccessfulPnoScan(WifiNative.ScanSettings scanSettings,
25362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius            WifiNative.PnoSettings pnoSettings, WifiNative.ScanEventHandler scanEventHandler,
25462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius            WifiNative.PnoEventHandler pnoEventHandler) {
25562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        when(mWifiNative.setNetworkVariable(anyInt(), anyString(), anyString())).thenReturn(true);
25662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        when(mWifiNative.enableNetworkWithoutConnect(anyInt())).thenReturn(true);
25762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        // Scans succeed
25862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        when(mWifiNative.scan(any(Set.class), any(Set.class))).thenReturn(true);
25962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        when(mWifiNative.enableBackgroundScan(anyBoolean(), anyObject())).thenReturn(true);
26062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
26162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        assertTrue(mScanner.setPnoList(pnoSettings, pnoEventHandler));
26262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        // This should happen only for SW PNO scan
263dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        if (mScanner.shouldScheduleBackgroundScanForPno(pnoSettings.isConnected)) {
26462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius            assertTrue(mScanner.startBatchedScan(scanSettings, scanEventHandler));
26562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        }
26662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    }
26762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
26862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    private Set<Integer> expectedBandScanFreqs(int band) {
26962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        ChannelCollection collection = mScanner.getChannelHelper().createChannelCollection();
27062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        collection.addBand(band);
27162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        return collection.getSupplicantScanFreqs();
27262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    }
27362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
27462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    /**
27562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius     * Verify that the PNO scan was successfully started.
27662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius     */
277dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius    private void expectSuccessfulHwDisconnectedPnoScan(InOrder order,
278dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius            WifiNative.PnoSettings pnoSettings, WifiNative.PnoEventHandler eventHandler,
279dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius            ScanResults scanResults) {
28062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        for (int i = 0; i < pnoSettings.networkList.length; i++) {
28162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius            WifiNative.PnoNetwork network = pnoSettings.networkList[i];
28262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius            order.verify(mWifiNative).setNetworkVariable(network.networkId,
28362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius                    WifiConfiguration.priorityVarName, Integer.toString(network.priority));
28462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius            order.verify(mWifiNative).enableNetworkWithoutConnect(network.networkId);
28562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        }
28662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        // Verify  HW PNO scan started
28762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        order.verify(mWifiNative).enableBackgroundScan(true, null);
28862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
28962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        // Setup scan results
29062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        when(mWifiNative.getScanResults()).thenReturn(scanResults.getScanDetailArrayList());
29162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
29262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        // Notify scan has finished
29362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        mWifiMonitor.sendMessage(mWifiNative.getInterfaceName(), WifiMonitor.SCAN_RESULTS_EVENT);
29462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        assertEquals("dispatch message after results event", 1, mLooper.dispatchAll());
29562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
29662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        order.verify(eventHandler).onPnoNetworkFound(scanResults.getRawScanResults());
29762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    }
29862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
29962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    /**
30062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius     * Verify that the single scan results were delivered and that the PNO scan was paused and
30162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius     * resumed either side of it.
30262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius     */
30362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    private void expectSuccessfulSingleScanWithHwPnoEnabled(InOrder order,
30462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius            WifiNative.ScanEventHandler eventHandler, Set<Integer> expectedScanFreqs,
30562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius            Set<Integer> expectedHiddenNetIds, ScanResults scanResults) {
30662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        // Pause PNO scan first
30762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        order.verify(mWifiNative).enableBackgroundScan(false, null);
30862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
30962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        order.verify(mWifiNative).scan(eq(expectedScanFreqs), eq(expectedHiddenNetIds));
31062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
31162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        when(mWifiNative.getScanResults()).thenReturn(scanResults.getScanDetailArrayList());
31262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
31362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        // Notify scan has finished
31462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        mWifiMonitor.sendMessage(mWifiNative.getInterfaceName(), WifiMonitor.SCAN_RESULTS_EVENT);
31562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        assertEquals("dispatch message after results event", 1, mLooper.dispatchAll());
31662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
31762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        order.verify(eventHandler).onScanStatus(WifiNative.WIFI_SCAN_RESULTS_AVAILABLE);
31862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        assertScanDataEquals(scanResults.getScanData(), mScanner.getLatestSingleScanResults());
31962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
32062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        // Resume PNO scan after the single scan results are received
32162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        order.verify(mWifiNative).enableBackgroundScan(true, null);
32262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    }
32362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
32462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    /**
325dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius     * Verify that the SW PNO scan was successfully started. This could either be disconnected
326dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius     * or connected PNO.
32762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius     * This is basically ensuring that the background scan runs successfully and invokes the
32862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius     * onPnoNetworkFound callback.
32962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius     */
33062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    private void expectSuccessfulSwPnoScan(InOrder order,
33162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius            WifiNative.PnoEventHandler pnoEventHandler, ScanResults scanResults) {
33262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
33362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        // Verify scan started
33462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        order.verify(mWifiNative).scan(any(Set.class), any(Set.class));
33562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
33662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        // Make sure that HW PNO scan was not started
33762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        verify(mWifiNative, never()).enableBackgroundScan(anyBoolean(), anyObject());
33862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
33962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        // Setup scan results
34062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        when(mWifiNative.getScanResults()).thenReturn(scanResults.getScanDetailArrayList());
34162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
34262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        // Notify scan has finished
34362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        mWifiMonitor.sendMessage(mWifiNative.getInterfaceName(), WifiMonitor.SCAN_RESULTS_EVENT);
34462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        assertEquals("dispatch message after results event", 1, mLooper.dispatchAll());
34562bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
34662bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        // Scan results are sorted when using background scan
34762bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        List<ScanResult> scanResultList = Arrays.asList(scanResults.getRawScanResults());
34862bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        Collections.sort(scanResultList, WifiScannerImpl.SCAN_RESULT_SORT_COMPARATOR);
34962bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        ScanResult[] scanResultArray = new ScanResult[scanResultList.size()];
35062bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        scanResultList.toArray(scanResultArray);
35162bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius
35262bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius        order.verify(pnoEventHandler).onPnoNetworkFound(scanResultArray);
35362bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius    }
35462bc101940ae1f5e60c4d8861a149b900dbf5e5cRoshan Pius}
355