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