summaryrefslogtreecommitdiffstats
path: root/tests/wifitests/src/com/android/server/wifi/scanner/SupplicantPnoScannerTest.java
diff options
context:
space:
mode:
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.java163
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());