diff options
author | Mitchell Wills <mwills@google.com> | 2016-06-27 18:12:39 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2016-06-27 18:12:41 +0000 |
commit | 450fee26a21eb56d536df147d3e88d3549f807c0 (patch) | |
tree | cd50d11927d1d7c5133b33cc0841beb2b58ecf34 /tests | |
parent | 3c8094ab45f3320dbe45e6460c5d62dcc24ce7ae (diff) | |
parent | 1ba04405f98489f0fbd66b6566c64324be11111a (diff) | |
download | android_frameworks_opt_net_wifi-450fee26a21eb56d536df147d3e88d3549f807c0.tar.gz android_frameworks_opt_net_wifi-450fee26a21eb56d536df147d3e88d3549f807c0.tar.bz2 android_frameworks_opt_net_wifi-450fee26a21eb56d536df147d3e88d3549f807c0.zip |
Merge "Add a WifiScanner API to listen for ongoing scans" into nyc-mr1-dev
Diffstat (limited to 'tests')
-rw-r--r-- | tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java | 317 |
1 files changed, 311 insertions, 6 deletions
diff --git a/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java b/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java index 529b42988..ceed019c3 100644 --- a/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java +++ b/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java @@ -200,6 +200,18 @@ public class WifiScanningServiceTest { scanRequestId, scanParams)); } + private static void registerScanListener(BidirectionalAsyncChannel controlChannel, + int listenerRequestId) { + controlChannel.sendMessage(Message.obtain(null, WifiScanner.CMD_REGISTER_SCAN_LISTENER, 0, + listenerRequestId, null)); + } + + private static void deregisterScanListener(BidirectionalAsyncChannel controlChannel, + int listenerRequestId) { + controlChannel.sendMessage(Message.obtain(null, WifiScanner.CMD_DEREGISTER_SCAN_LISTENER, 0, + listenerRequestId, null)); + } + private static void verifySuccessfulResponse(InOrder order, Handler handler, int arg2) { Message response = verifyHandleMessageAndGetMessage(order, handler); assertSuccessfulResponse(arg2, response); @@ -219,12 +231,14 @@ public class WifiScanningServiceTest { /** * If multiple results are expected for a single hardware scan then the order that they are * dispatched is dependant on the order which they are iterated through internally. This - * function validates that the order is either one way or the other. + * function validates that the order is either one way or the other. A scan listener can + * optionally be provided as well and will be checked after the after the single scan requests. */ private static void verifyMultipleSingleScanResults(InOrder handlerOrder, Handler handler, - int requestId1, ScanResults results1, int requestId2, ScanResults results2) { + int requestId1, ScanResults results1, int requestId2, ScanResults results2, + int listenerRequestId, ScanResults listenerResults) { ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); - handlerOrder.verify(handler, times(4)) + handlerOrder.verify(handler, times(listenerResults == null ? 4 : 5)) .handleMessage(messageCaptor.capture()); int firstListenerId = messageCaptor.getAllValues().get(0).arg2; assertTrue(firstListenerId + " was neither " + requestId2 + " nor " + requestId1, @@ -238,6 +252,11 @@ public class WifiScanningServiceTest { new WifiScanner.ScanData[] {results1.getScanData()}, messageCaptor.getAllValues().get(2)); assertSingleScanCompletedMessage(requestId1, messageCaptor.getAllValues().get(3)); + if (listenerResults != null) { + assertScanResultsMessage(listenerRequestId, + new WifiScanner.ScanData[] {listenerResults.getScanData()}, + messageCaptor.getAllValues().get(4)); + } } else { assertScanResultsMessage(requestId1, new WifiScanner.ScanData[] {results1.getScanData()}, @@ -247,9 +266,20 @@ public class WifiScanningServiceTest { new WifiScanner.ScanData[] {results2.getScanData()}, messageCaptor.getAllValues().get(2)); assertSingleScanCompletedMessage(requestId2, messageCaptor.getAllValues().get(3)); + if (listenerResults != null) { + assertScanResultsMessage(listenerRequestId, + new WifiScanner.ScanData[] {listenerResults.getScanData()}, + messageCaptor.getAllValues().get(4)); + } } } + private static void verifyMultipleSingleScanResults(InOrder handlerOrder, Handler handler, + int requestId1, ScanResults results1, int requestId2, ScanResults results2) { + verifyMultipleSingleScanResults(handlerOrder, handler, requestId1, results1, requestId2, + results2, -1, null); + } + private static void verifyFailedResponse(InOrder order, Handler handler, int arg2, int expectedErrorReason, String expectedErrorDescription) { Message response = verifyHandleMessageAndGetMessage(order, handler); @@ -598,9 +628,95 @@ public class WifiScanningServiceTest { verify(mBatteryStats).noteWifiScanStoppedFromSource(eq(workSource)); } - // TODO Add more single scan tests - // * disable wifi while scanning - // * disable wifi while scanning with pending scan + /** + * Send a single scan request and then disable Wi-Fi before it completes + */ + @Test + public void sendSingleScanRequestThenDisableWifi() { + WifiScanner.ScanSettings requestSettings = createRequest(channelsToSpec(2400), 0, + 0, 20, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN); + int requestId = 2293; + + startServiceAndLoadDriver(); + + when(mWifiScannerImpl.startSingleScan(any(WifiNative.ScanSettings.class), + any(WifiNative.ScanEventHandler.class))).thenReturn(true); + + Handler handler = mock(Handler.class); + BidirectionalAsyncChannel controlChannel = connectChannel(handler); + InOrder order = inOrder(handler, mWifiScannerImpl); + + // Run scan 1 + sendSingleScanRequest(controlChannel, requestId, requestSettings, null); + mLooper.dispatchAll(); + verifySuccessfulResponse(order, handler, requestId); + + // disable wifi + TestUtil.sendWifiScanAvailable(mBroadcastReceiver, mContext, + WifiManager.WIFI_STATE_DISABLED); + + // validate failed response + mLooper.dispatchAll(); + verifyFailedResponse(order, handler, requestId, WifiScanner.REASON_UNSPECIFIED, + "Scan was interrupted"); + verifyNoMoreInteractions(handler); + } + + /** + * Send a single scan request, schedule a second pending scan and disable Wi-Fi before the first + * scan completes. + */ + @Test + public void sendSingleScanAndPendingScanAndListenerThenDisableWifi() { + WifiScanner.ScanSettings requestSettings1 = createRequest(channelsToSpec(2400), 0, + 0, 20, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN); + int requestId1 = 2293; + + WifiScanner.ScanSettings requestSettings2 = createRequest(channelsToSpec(2450), 0, + 0, 20, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN); + int requestId2 = 2294; + + int listenerRequestId = 2295; + + startServiceAndLoadDriver(); + + when(mWifiScannerImpl.startSingleScan(any(WifiNative.ScanSettings.class), + any(WifiNative.ScanEventHandler.class))).thenReturn(true); + + Handler handler = mock(Handler.class); + BidirectionalAsyncChannel controlChannel = connectChannel(handler); + InOrder order = inOrder(handler, mWifiScannerImpl); + + // Request scan 1 + sendSingleScanRequest(controlChannel, requestId1, requestSettings1, null); + mLooper.dispatchAll(); + verifySuccessfulResponse(order, handler, requestId1); + + // Request scan 2 + sendSingleScanRequest(controlChannel, requestId2, requestSettings2, null); + mLooper.dispatchAll(); + verifySuccessfulResponse(order, handler, requestId2); + + // Setup scan listener + registerScanListener(controlChannel, listenerRequestId); + mLooper.dispatchAll(); + verifySuccessfulResponse(order, handler, listenerRequestId); + + // disable wifi + TestUtil.sendWifiScanAvailable(mBroadcastReceiver, mContext, + WifiManager.WIFI_STATE_DISABLED); + + // validate failed response + mLooper.dispatchAll(); + ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); + order.verify(handler, times(2)).handleMessage(messageCaptor.capture()); + assertFailedResponse(requestId1, WifiScanner.REASON_UNSPECIFIED, + "Scan was interrupted", messageCaptor.getAllValues().get(0)); + assertFailedResponse(requestId2, WifiScanner.REASON_UNSPECIFIED, + "Scan was interrupted", messageCaptor.getAllValues().get(1)); + // No additional callbacks for scan listener + verifyNoMoreInteractions(handler); + } /** * Send a single scan request and then a second one after the first completes. @@ -994,6 +1110,195 @@ public class WifiScanningServiceTest { "results=" + results3.getRawScanResults().length); } + /** + * Register a single scan listener and do a single scan + */ + @Test + public void registerScanListener() throws Exception { + WifiScanner.ScanSettings requestSettings = createRequest(WifiScanner.WIFI_BAND_BOTH, 0, + 0, 20, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN); + WifiNative.ScanSettings nativeSettings = computeSingleScanNativeSettings(requestSettings); + ScanResults results = ScanResults.create(0, 2400, 5150, 5175); + + int requestId = 12; + int listenerRequestId = 13; + + startServiceAndLoadDriver(); + + Handler handler = mock(Handler.class); + BidirectionalAsyncChannel controlChannel = connectChannel(handler); + InOrder order = inOrder(handler, mWifiScannerImpl); + + when(mWifiScannerImpl.startSingleScan(any(WifiNative.ScanSettings.class), + any(WifiNative.ScanEventHandler.class))).thenReturn(true); + + registerScanListener(controlChannel, listenerRequestId); + mLooper.dispatchAll(); + verifySuccessfulResponse(order, handler, listenerRequestId); + + sendSingleScanRequest(controlChannel, requestId, requestSettings, null); + + mLooper.dispatchAll(); + WifiNative.ScanEventHandler eventHandler = verifyStartSingleScan(order, nativeSettings); + verifySuccessfulResponse(order, handler, requestId); + + when(mWifiScannerImpl.getLatestSingleScanResults()) + .thenReturn(results.getRawScanData()); + eventHandler.onScanStatus(WifiNative.WIFI_SCAN_RESULTS_AVAILABLE); + + mLooper.dispatchAll(); + verifyScanResultsRecieved(order, handler, requestId, results.getScanData()); + verifySingleScanCompletedRecieved(order, handler, requestId); + verifyScanResultsRecieved(order, handler, listenerRequestId, results.getScanData()); + verifyNoMoreInteractions(handler); + + assertDumpContainsRequestLog("registerScanListener", listenerRequestId); + assertDumpContainsCallbackLog("singleScanResults", listenerRequestId, + "results=" + results.getScanData().getResults().length); + } + + /** + * Register a single scan listener and do a single scan + */ + @Test + public void deregisterScanListener() throws Exception { + WifiScanner.ScanSettings requestSettings = createRequest(WifiScanner.WIFI_BAND_BOTH, 0, + 0, 20, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN); + WifiNative.ScanSettings nativeSettings = computeSingleScanNativeSettings(requestSettings); + ScanResults results = ScanResults.create(0, 2400, 5150, 5175); + + int requestId = 12; + int listenerRequestId = 13; + + startServiceAndLoadDriver(); + + Handler handler = mock(Handler.class); + BidirectionalAsyncChannel controlChannel = connectChannel(handler); + InOrder order = inOrder(handler, mWifiScannerImpl); + + when(mWifiScannerImpl.startSingleScan(any(WifiNative.ScanSettings.class), + any(WifiNative.ScanEventHandler.class))).thenReturn(true); + + registerScanListener(controlChannel, listenerRequestId); + mLooper.dispatchAll(); + verifySuccessfulResponse(order, handler, listenerRequestId); + + sendSingleScanRequest(controlChannel, requestId, requestSettings, null); + + mLooper.dispatchAll(); + WifiNative.ScanEventHandler eventHandler = verifyStartSingleScan(order, nativeSettings); + verifySuccessfulResponse(order, handler, requestId); + + deregisterScanListener(controlChannel, listenerRequestId); + mLooper.dispatchAll(); + + when(mWifiScannerImpl.getLatestSingleScanResults()) + .thenReturn(results.getRawScanData()); + eventHandler.onScanStatus(WifiNative.WIFI_SCAN_RESULTS_AVAILABLE); + + mLooper.dispatchAll(); + verifyScanResultsRecieved(order, handler, requestId, results.getScanData()); + verifySingleScanCompletedRecieved(order, handler, requestId); + verifyNoMoreInteractions(handler); + + assertDumpContainsRequestLog("registerScanListener", listenerRequestId); + assertDumpContainsRequestLog("deregisterScanListener", listenerRequestId); + } + + /** + * Send a single scan request and then two more before the first completes. Neither are + * satisfied by the first scan. Verify that the first completes and the second two are merged. + */ + @Test + public void scanListenerRecievesAllResults() throws RemoteException { + WifiScanner.ScanSettings requestSettings1 = createRequest(channelsToSpec(2400), 0, + 0, 20, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN); + int requestId1 = 12; + ScanResults results1 = ScanResults.create(0, 2400); + + WifiScanner.ScanSettings requestSettings2 = createRequest(channelsToSpec(2450, 5175), 0, + 0, 20, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN); + int requestId2 = 13; + ScanResults results2 = ScanResults.create(0, 2450, 5175, 2450); + + WifiScanner.ScanSettings requestSettings3 = createRequest(channelsToSpec(5150), 0, + 0, 20, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN); + int requestId3 = 15; + ScanResults results3 = ScanResults.create(0, 5150, 5150, 5150, 5150); + + WifiNative.ScanSettings nativeSettings2and3 = createSingleScanNativeSettingsForChannels( + WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN, channelsToSpec(2450, 5175, 5150)); + ScanResults results2and3 = ScanResults.merge(results2, results3); + + int listenerRequestId = 13; + + + startServiceAndLoadDriver(); + + when(mWifiScannerImpl.startSingleScan(any(WifiNative.ScanSettings.class), + any(WifiNative.ScanEventHandler.class))).thenReturn(true); + + Handler handler = mock(Handler.class); + BidirectionalAsyncChannel controlChannel = connectChannel(handler); + InOrder handlerOrder = inOrder(handler); + InOrder nativeOrder = inOrder(mWifiScannerImpl); + + // Run scan 1 + sendSingleScanRequest(controlChannel, requestId1, requestSettings1, null); + + mLooper.dispatchAll(); + WifiNative.ScanEventHandler eventHandler1 = verifyStartSingleScan(nativeOrder, + computeSingleScanNativeSettings(requestSettings1)); + verifySuccessfulResponse(handlerOrder, handler, requestId1); + + + // Queue scan 2 (will not run because previous is in progress) + sendSingleScanRequest(controlChannel, requestId2, requestSettings2, null); + mLooper.dispatchAll(); + verifySuccessfulResponse(handlerOrder, handler, requestId2); + + // Queue scan 3 (will not run because previous is in progress) + sendSingleScanRequest(controlChannel, requestId3, requestSettings3, null); + mLooper.dispatchAll(); + verifySuccessfulResponse(handlerOrder, handler, requestId3); + + // Register scan listener + registerScanListener(controlChannel, listenerRequestId); + mLooper.dispatchAll(); + verifySuccessfulResponse(handlerOrder, handler, listenerRequestId); + + // dispatch scan 1 results + when(mWifiScannerImpl.getLatestSingleScanResults()) + .thenReturn(results1.getScanData()); + eventHandler1.onScanStatus(WifiNative.WIFI_SCAN_RESULTS_AVAILABLE); + + mLooper.dispatchAll(); + verifyScanResultsRecieved(handlerOrder, handler, requestId1, results1.getScanData()); + verifySingleScanCompletedRecieved(handlerOrder, handler, requestId1); + verifyScanResultsRecieved(handlerOrder, handler, listenerRequestId, results1.getScanData()); + + // now that the first scan completed we expect the second and third ones to start + WifiNative.ScanEventHandler eventHandler2and3 = verifyStartSingleScan(nativeOrder, + nativeSettings2and3); + + // dispatch scan 2 and 3 results + when(mWifiScannerImpl.getLatestSingleScanResults()) + .thenReturn(results2and3.getScanData()); + eventHandler2and3.onScanStatus(WifiNative.WIFI_SCAN_RESULTS_AVAILABLE); + + mLooper.dispatchAll(); + + verifyMultipleSingleScanResults(handlerOrder, handler, requestId2, results2, requestId3, + results3, listenerRequestId, results2and3); + + assertDumpContainsRequestLog("registerScanListener", listenerRequestId); + assertDumpContainsCallbackLog("singleScanResults", listenerRequestId, + "results=" + results1.getRawScanResults().length); + assertDumpContainsCallbackLog("singleScanResults", listenerRequestId, + "results=" + results2and3.getRawScanResults().length); + } + + private void doSuccessfulBackgroundScan(WifiScanner.ScanSettings requestSettings, WifiNative.ScanSettings nativeSettings) { startServiceAndLoadDriver(); |