diff options
Diffstat (limited to 'tests/wifitests/src/com/android/server/wifi/scanner/SupplicantPnoScannerTest.java')
-rw-r--r-- | tests/wifitests/src/com/android/server/wifi/scanner/SupplicantPnoScannerTest.java | 163 |
1 files changed, 146 insertions, 17 deletions
diff --git a/tests/wifitests/src/com/android/server/wifi/scanner/SupplicantPnoScannerTest.java b/tests/wifitests/src/com/android/server/wifi/scanner/SupplicantPnoScannerTest.java index 39709f84d..560710f79 100644 --- a/tests/wifitests/src/com/android/server/wifi/scanner/SupplicantPnoScannerTest.java +++ b/tests/wifitests/src/com/android/server/wifi/scanner/SupplicantPnoScannerTest.java @@ -45,6 +45,7 @@ import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import java.util.Arrays; import java.util.HashSet; import java.util.Set; @@ -90,7 +91,7 @@ public class SupplicantPnoScannerTest { WifiNative.PnoEventHandler pnoEventHandler = mock(WifiNative.PnoEventHandler.class); WifiNative.PnoSettings pnoSettings = createDummyPnoSettings(false); - ScanResults scanResults = createDummyScanResults(); + ScanResults scanResults = createDummyScanResults(false); InOrder order = inOrder(pnoEventHandler, mWifiNative); // Start PNO scan @@ -111,7 +112,7 @@ public class SupplicantPnoScannerTest { WifiNative.PnoSettings pnoSettings = createDummyPnoSettings(false); WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class); WifiNative.ScanSettings settings = createDummyScanSettings(); - ScanResults scanResults = createDummyScanResults(); + ScanResults scanResults = createDummyScanResults(true); InOrder order = inOrder(eventHandler, mWifiNative); // Start PNO scan @@ -181,7 +182,7 @@ public class SupplicantPnoScannerTest { WifiNative.PnoSettings pnoSettings = createDummyPnoSettings(false); WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class); WifiNative.ScanSettings settings = createDummyScanSettings(); - ScanResults scanResults = createDummyScanResults(); + ScanResults scanResults = createDummyScanResults(true); InOrder order = inOrder(eventHandler, mWifiNative); // Start PNO scan @@ -214,12 +215,126 @@ public class SupplicantPnoScannerTest { verifyNoMoreInteractions(pnoEventHandler); } + /** + * Verify that the HW PNO scan stop failure still resets the PNO scan state. + * 1. Start Hw PNO. + * 2. Stop Hw PNO scan which raises a stop command to WifiNative which is failed. + * 3. Now restart a new PNO scan to ensure that the failure was cleanly handled. + */ + @Test + public void ignoreHwDisconnectedPnoScanStopFailure() { + createScannerWithHwPnoScanSupport(); + + WifiNative.PnoEventHandler pnoEventHandler = mock(WifiNative.PnoEventHandler.class); + WifiNative.PnoSettings pnoSettings = createDummyPnoSettings(false); + + // Start PNO scan + startSuccessfulPnoScan(null, pnoSettings, null, pnoEventHandler); + + // Fail the PNO stop. + when(mWifiNative.setPnoScan(false)).thenReturn(false); + assertTrue(mScanner.resetHwPnoList()); + assertTrue("dispatch pno monitor alarm", + mAlarmManager.dispatch( + SupplicantWifiScannerImpl.HwPnoDebouncer.PNO_DEBOUNCER_ALARM_TAG)); + mLooper.dispatchAll(); + verify(mWifiNative).setPnoScan(false); + + // Add a new PNO scan request and ensure it runs successfully. + startSuccessfulPnoScan(null, pnoSettings, null, pnoEventHandler); + assertTrue("dispatch pno monitor alarm", + mAlarmManager.dispatch( + SupplicantWifiScannerImpl.HwPnoDebouncer.PNO_DEBOUNCER_ALARM_TAG)); + mLooper.dispatchAll(); + InOrder order = inOrder(pnoEventHandler, mWifiNative); + ScanResults scanResults = createDummyScanResults(false); + expectSuccessfulHwDisconnectedPnoScan(order, pnoSettings, pnoEventHandler, scanResults); + verifyNoMoreInteractions(pnoEventHandler); + } + + /** + * Verify that the HW PNO scan is forcefully stopped (bypass debounce logic) and restarted when + * settings change. + * 1. Start Hw PNO. + * 2. Stop Hw PNO . + * 3. Now restart a new PNO scan with different settings. + * 4. Ensure that the stop was issued before we start again. + */ + @Test + public void forceRestartHwDisconnectedPnoScanWhenSettingsChange() { + createScannerWithHwPnoScanSupport(); + + WifiNative.PnoEventHandler pnoEventHandler = mock(WifiNative.PnoEventHandler.class); + WifiNative.PnoSettings pnoSettings = createDummyPnoSettings(false); + InOrder order = inOrder(pnoEventHandler, mWifiNative); + + // Start PNO scan + startSuccessfulPnoScan(null, pnoSettings, null, pnoEventHandler); + expectHwDisconnectedPnoScanStart(order, pnoSettings); + + // Stop PNO now. This should trigger the debounce timer and not stop PNO. + assertTrue(mScanner.resetHwPnoList()); + assertTrue(mAlarmManager.isPending( + SupplicantWifiScannerImpl.HwPnoDebouncer.PNO_DEBOUNCER_ALARM_TAG)); + order.verify(mWifiNative, never()).setPnoScan(false); + + // Now restart PNO scan with an extra network in settings. + pnoSettings.networkList = + Arrays.copyOf(pnoSettings.networkList, pnoSettings.networkList.length + 1); + pnoSettings.networkList[pnoSettings.networkList.length - 1] = + createDummyPnoNetwork("ssid_pno_new", 6, 6); + startSuccessfulPnoScan(null, pnoSettings, null, pnoEventHandler); + + // This should bypass the debounce timer and stop PNO scan immediately and then start + // a new debounce timer for the start. + order.verify(mWifiNative).setPnoScan(false); + + // Trigger the debounce timer and ensure we start PNO scan again. + mAlarmManager.dispatch(SupplicantWifiScannerImpl.HwPnoDebouncer.PNO_DEBOUNCER_ALARM_TAG); + mLooper.dispatchAll(); + order.verify(mWifiNative).setPnoScan(true); + } + + /** + * Verify that the HW PNO scan is not forcefully stopped (bypass debounce logic) when + * settings don't change. + * 1. Start Hw PNO. + * 2. Stop Hw PNO . + * 3. Now restart a new PNO scan with same settings. + * 4. Ensure that the stop was never issued. + */ + @Test + public void noForceRestartHwDisconnectedPnoScanWhenNoSettingsChange() { + createScannerWithHwPnoScanSupport(); + + WifiNative.PnoEventHandler pnoEventHandler = mock(WifiNative.PnoEventHandler.class); + WifiNative.PnoSettings pnoSettings = createDummyPnoSettings(false); + InOrder order = inOrder(pnoEventHandler, mWifiNative); + + // Start PNO scan + startSuccessfulPnoScan(null, pnoSettings, null, pnoEventHandler); + expectHwDisconnectedPnoScanStart(order, pnoSettings); + + // Stop PNO now. This should trigger the debounce timer and not stop PNO. + assertTrue(mScanner.resetHwPnoList()); + assertTrue(mAlarmManager.isPending( + SupplicantWifiScannerImpl.HwPnoDebouncer.PNO_DEBOUNCER_ALARM_TAG)); + order.verify(mWifiNative, never()).setPnoScan(false); + + // Now restart PNO scan with the same settings. + startSuccessfulPnoScan(null, pnoSettings, null, pnoEventHandler); + + // Trigger the debounce timer and ensure that we neither stop/start. + mLooper.dispatchAll(); + order.verify(mWifiNative, never()).setPnoScan(anyBoolean()); + } + private void doSuccessfulSwPnoScanTest(boolean isConnectedPno) { WifiNative.PnoEventHandler pnoEventHandler = mock(WifiNative.PnoEventHandler.class); WifiNative.PnoSettings pnoSettings = createDummyPnoSettings(isConnectedPno); WifiNative.ScanEventHandler scanEventHandler = mock(WifiNative.ScanEventHandler.class); WifiNative.ScanSettings scanSettings = createDummyScanSettings(); - ScanResults scanResults = createDummyScanResults(); + ScanResults scanResults = createDummyScanResults(false); InOrder order = inOrder(scanEventHandler, mWifiNative); @@ -243,18 +358,20 @@ public class SupplicantPnoScannerTest { new SupplicantWifiScannerImpl(mContext, mWifiNative, mLooper.getLooper(), mClock); } + private WifiNative.PnoNetwork createDummyPnoNetwork(String ssid, int networkId, int priority) { + WifiNative.PnoNetwork pnoNetwork = new WifiNative.PnoNetwork(); + pnoNetwork.ssid = ssid; + pnoNetwork.networkId = networkId; + pnoNetwork.priority = priority; + return pnoNetwork; + } + private WifiNative.PnoSettings createDummyPnoSettings(boolean isConnected) { WifiNative.PnoSettings pnoSettings = new WifiNative.PnoSettings(); pnoSettings.isConnected = isConnected; pnoSettings.networkList = new WifiNative.PnoNetwork[2]; - pnoSettings.networkList[0] = new WifiNative.PnoNetwork(); - pnoSettings.networkList[0].ssid = "ssid_pno_1"; - pnoSettings.networkList[0].networkId = 1; - pnoSettings.networkList[0].priority = 1; - pnoSettings.networkList[1] = new WifiNative.PnoNetwork(); - pnoSettings.networkList[1].ssid = "ssid_pno_2"; - pnoSettings.networkList[1].networkId = 2; - pnoSettings.networkList[1].priority = 2; + pnoSettings.networkList[0] = createDummyPnoNetwork("ssid_pno_1", 1, 1); + pnoSettings.networkList[1] = createDummyPnoNetwork("ssid_pno_2", 2, 2); return pnoSettings; } @@ -268,13 +385,15 @@ public class SupplicantPnoScannerTest { return settings; } - private ScanResults createDummyScanResults() { - return ScanResults.create(0, 2400, 2450, 2450, 2400, 2450, 2450, 2400, 2450, 2450); + private ScanResults createDummyScanResults(boolean allChannelsScanned) { + return ScanResults.create(0, allChannelsScanned, 2400, 2450, 2450, 2400, 2450, 2450, 2400, + 2450, 2450); } private void startSuccessfulPnoScan(WifiNative.ScanSettings scanSettings, WifiNative.PnoSettings pnoSettings, WifiNative.ScanEventHandler scanEventHandler, WifiNative.PnoEventHandler pnoEventHandler) { + reset(mWifiNative); when(mWifiNative.setNetworkVariable(anyInt(), anyString(), anyString())).thenReturn(true); when(mWifiNative.enableNetworkWithoutConnect(anyInt())).thenReturn(true); // Scans succeed @@ -300,9 +419,8 @@ public class SupplicantPnoScannerTest { /** * Verify that the PNO scan was successfully started. */ - private void expectSuccessfulHwDisconnectedPnoScan(InOrder order, - WifiNative.PnoSettings pnoSettings, WifiNative.PnoEventHandler eventHandler, - ScanResults scanResults) { + private void expectHwDisconnectedPnoScanStart(InOrder order, + WifiNative.PnoSettings pnoSettings) { for (int i = 0; i < pnoSettings.networkList.length; i++) { WifiNative.PnoNetwork network = pnoSettings.networkList[i]; order.verify(mWifiNative).setNetworkVariable(network.networkId, @@ -311,6 +429,17 @@ public class SupplicantPnoScannerTest { } // Verify HW PNO scan started order.verify(mWifiNative).setPnoScan(true); + } + + /** + * + * 1. Verify that the PNO scan was successfully started. + * 2. Send scan results and ensure that the |onPnoNetworkFound| callback was called. + */ + private void expectSuccessfulHwDisconnectedPnoScan(InOrder order, + WifiNative.PnoSettings pnoSettings, WifiNative.PnoEventHandler eventHandler, + ScanResults scanResults) { + expectHwDisconnectedPnoScanStart(order, pnoSettings); // Setup scan results when(mWifiNative.getScanResults()).thenReturn(scanResults.getScanDetailArrayList()); |