diff options
Diffstat (limited to 'tests/wifitests/src/com/android')
6 files changed, 497 insertions, 33 deletions
diff --git a/tests/wifitests/src/com/android/server/wifi/ScanRequestProxyTest.java b/tests/wifitests/src/com/android/server/wifi/ScanRequestProxyTest.java index 985789858..38e2eaf86 100644 --- a/tests/wifitests/src/com/android/server/wifi/ScanRequestProxyTest.java +++ b/tests/wifitests/src/com/android/server/wifi/ScanRequestProxyTest.java @@ -66,6 +66,11 @@ public class ScanRequestProxyTest { add(new WifiScanner.ScanSettings.HiddenNetwork("test_ssid_2")); }}; + private static final List<WifiScanner.ScanSettings.HiddenNetwork> TEST_HIDDEN_NETWORKS_LIST_NS = + new ArrayList<WifiScanner.ScanSettings.HiddenNetwork>() {{ + add(new WifiScanner.ScanSettings.HiddenNetwork("test_ssid_3")); + add(new WifiScanner.ScanSettings.HiddenNetwork("test_ssid_4")); + }}; @Mock private Context mContext; @Mock private AppOpsManager mAppOps; @@ -77,6 +82,8 @@ public class ScanRequestProxyTest { @Mock private WifiMetrics mWifiMetrics; @Mock private Clock mClock; @Mock private FrameworkFacade mFrameworkFacade; + @Mock private WifiNetworkSuggestionsManager mWifiNetworkSuggestionsManager; + private ArgumentCaptor<WorkSource> mWorkSourceArgumentCaptor = ArgumentCaptor.forClass(WorkSource.class); private ArgumentCaptor<WifiScanner.ScanSettings> mScanSettingsArgumentCaptor = @@ -98,7 +105,11 @@ public class ScanRequestProxyTest { MockitoAnnotations.initMocks(this); when(mWifiInjector.getWifiScanner()).thenReturn(mWifiScanner); + when(mWifiInjector.getWifiNetworkSuggestionsManager()) + .thenReturn(mWifiNetworkSuggestionsManager); when(mWifiConfigManager.retrieveHiddenNetworkList()).thenReturn(TEST_HIDDEN_NETWORKS_LIST); + when(mWifiNetworkSuggestionsManager.retrieveHiddenNetworkList()) + .thenReturn(TEST_HIDDEN_NETWORKS_LIST_NS); doNothing().when(mWifiScanner).registerScanListener( mGlobalScanListenerArgumentCaptor.capture()); doNothing().when(mWifiScanner).startScan( @@ -106,7 +117,8 @@ public class ScanRequestProxyTest { mScanRequestListenerArgumentCaptor.capture(), mWorkSourceArgumentCaptor.capture()); - mInOrder = inOrder(mWifiScanner, mWifiConfigManager, mContext); + mInOrder = inOrder(mWifiScanner, mWifiConfigManager, + mContext, mWifiNetworkSuggestionsManager); mTestScanDatas1 = ScanTestUtil.createScanDatas(new int[][]{{ 2417, 2427, 5180, 5170 }}, new int[]{0}, @@ -205,8 +217,8 @@ public class ScanRequestProxyTest { mInOrder.verify(mWifiScanner).registerScanListener(any()); mInOrder.verify(mWifiScanner).startScan(any(), any(), any()); - assertTrue(mWorkSourceArgumentCaptor.getValue().equals( - new WorkSource(TEST_UID, TEST_PACKAGE_NAME_1))); + assertEquals(mWorkSourceArgumentCaptor.getValue(), + new WorkSource(TEST_UID, TEST_PACKAGE_NAME_1)); validateScanSettings(mScanSettingsArgumentCaptor.getValue(), false, true); } @@ -222,10 +234,11 @@ public class ScanRequestProxyTest { assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1)); mInOrder.verify(mWifiConfigManager, never()).retrieveHiddenNetworkList(); + mInOrder.verify(mWifiNetworkSuggestionsManager, never()).retrieveHiddenNetworkList(); mInOrder.verify(mWifiScanner).startScan(any(), any(), any()); - assertTrue(mWorkSourceArgumentCaptor.getValue().equals( - new WorkSource(TEST_UID, TEST_PACKAGE_NAME_1))); + assertEquals(mWorkSourceArgumentCaptor.getValue(), + new WorkSource(TEST_UID, TEST_PACKAGE_NAME_1)); validateScanSettings(mScanSettingsArgumentCaptor.getValue(), false); verify(mWifiMetrics).incrementExternalAppOneshotScanRequestsCount(); @@ -242,11 +255,13 @@ public class ScanRequestProxyTest { validateScanAvailableBroadcastSent(true); assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1)); + mInOrder.verify(mWifiConfigManager).retrieveHiddenNetworkList(); + mInOrder.verify(mWifiNetworkSuggestionsManager).retrieveHiddenNetworkList(); mInOrder.verify(mWifiScanner).startScan(any(), any(), any()); - assertTrue(mWorkSourceArgumentCaptor.getValue().equals( - new WorkSource(TEST_UID, TEST_PACKAGE_NAME_1))); + assertEquals(mWorkSourceArgumentCaptor.getValue(), + new WorkSource(TEST_UID, TEST_PACKAGE_NAME_1)); validateScanSettings(mScanSettingsArgumentCaptor.getValue(), true); verify(mWifiMetrics).incrementExternalAppOneshotScanRequestsCount(); @@ -860,12 +875,15 @@ public class ScanRequestProxyTest { } assertEquals(WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN | WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT, scanSettings.reportEvents); + List<WifiScanner.ScanSettings.HiddenNetwork> hiddenNetworkList = + new ArrayList<>(); + hiddenNetworkList.addAll(TEST_HIDDEN_NETWORKS_LIST); + hiddenNetworkList.addAll(TEST_HIDDEN_NETWORKS_LIST_NS); if (expectHiddenNetworks) { assertNotNull(scanSettings.hiddenNetworks); - assertEquals(TEST_HIDDEN_NETWORKS_LIST.size(), scanSettings.hiddenNetworks.length); + assertEquals(hiddenNetworkList.size(), scanSettings.hiddenNetworks.length); for (int i = 0; i < scanSettings.hiddenNetworks.length; i++) { - validateHiddenNetworkInList(scanSettings.hiddenNetworks[i], - TEST_HIDDEN_NETWORKS_LIST); + validateHiddenNetworkInList(scanSettings.hiddenNetworks[i], hiddenNetworkList); } } else { assertNull(scanSettings.hiddenNetworks); diff --git a/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java index 7f6c1bcaf..c1686b48d 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java @@ -96,6 +96,10 @@ public class WifiConnectivityManagerTest { mWifiConnectivityHelper = mockWifiConnectivityHelper(); mWifiNS = mockWifiNetworkSelector(); when(mWifiInjector.getWifiScanner()).thenReturn(mWifiScanner); + when(mWifiInjector.getWifiNetworkSuggestionsManager()) + .thenReturn(mWifiNetworkSuggestionsManager); + when(mWifiNetworkSuggestionsManager.retrieveHiddenNetworkList()) + .thenReturn(new ArrayList<>()); mWifiConnectivityManager = createConnectivityManager(); verify(mWifiConfigManager).setOnSavedNetworkUpdateListener(anyObject()); mWifiConnectivityManager.setTrustedConnectionAllowed(true); @@ -140,6 +144,7 @@ public class WifiConnectivityManagerTest { @Mock private CarrierNetworkConfig mCarrierNetworkConfig; @Mock private WifiMetrics mWifiMetrics; @Mock private WifiNetworkScoreCache mScoreCache; + @Mock private WifiNetworkSuggestionsManager mWifiNetworkSuggestionsManager; @Captor ArgumentCaptor<ScanResult> mCandidateScanResultCaptor; @Captor ArgumentCaptor<ArrayList<String>> mBssidBlacklistCaptor; @Captor ArgumentCaptor<ArrayList<String>> mSsidWhitelistCaptor; diff --git a/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java b/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java index d4e6594c8..968527a8d 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java @@ -61,8 +61,10 @@ import android.os.WorkSource; import android.os.test.TestLooper; import android.test.suitebuilder.annotation.SmallTest; import android.util.Pair; +import android.util.Xml; import com.android.internal.util.AsyncChannel; +import com.android.internal.util.FastXmlSerializer; import com.android.server.wifi.WifiNetworkFactory.AccessPoint; import com.android.server.wifi.nano.WifiMetricsProto; import com.android.server.wifi.util.ScanResultUtil; @@ -76,9 +78,15 @@ import org.mockito.ArgumentMatcher; import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlSerializer; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -146,6 +154,7 @@ public class WifiNetworkFactoryTest { private WifiNetworkFactory mWifiNetworkFactory; private NetworkRequestStoreData.DataSource mDataSource; + private NetworkRequestStoreData mNetworkRequestStoreData; /** * Setup the mocks. @@ -185,6 +194,7 @@ public class WifiNetworkFactoryTest { verify(mWifiInjector).makeNetworkRequestStoreData(dataSourceArgumentCaptor.capture()); mDataSource = dataSourceArgumentCaptor.getValue(); assertNotNull(mDataSource); + mNetworkRequestStoreData = new NetworkRequestStoreData(mDataSource); // Register and establish full connection to connectivity manager. mWifiNetworkFactory.register(); @@ -1083,6 +1093,73 @@ public class WifiNetworkFactoryTest { } /** + * Verify when number of user approved access points exceed the capacity, framework should trim + * the Set by removing the least recently used elements. + */ + @Test + public void testNetworkSpecifierHandleUserSelectionConnectToNetworkExceedApprovedListCapacity() + throws Exception { + int userApproveAccessPointCapacity = mWifiNetworkFactory.NUM_OF_ACCESS_POINT_LIMIT_PER_APP; + int numOfApPerSsid = userApproveAccessPointCapacity / 2 + 1; + String[] testIds = new String[]{TEST_SSID_1, TEST_SSID_2}; + + // Setup up scan data + setupScanDataSameSsidWithDiffBssid(SCAN_RESULT_TYPE_WPA_PSK, numOfApPerSsid, testIds); + + // Setup network specifier for WPA-PSK networks. + PatternMatcher ssidPatternMatch = + new PatternMatcher(TEST_SSID_1, PatternMatcher.PATTERN_PREFIX); + Pair<MacAddress, MacAddress> bssidPatternMatch = + Pair.create(MacAddress.ALL_ZEROS_ADDRESS, MacAddress.ALL_ZEROS_ADDRESS); + WifiConfiguration wifiConfiguration = WifiConfigurationTestUtil.createPskNetwork(); + wifiConfiguration.preSharedKey = TEST_WPA_PRESHARED_KEY; + WifiNetworkSpecifier specifier = new WifiNetworkSpecifier( + ssidPatternMatch, bssidPatternMatch, wifiConfiguration, TEST_UID_1, + TEST_PACKAGE_NAME_1); + + // request network, trigger scan and get matched set. + mNetworkRequest.networkCapabilities.setNetworkSpecifier(specifier); + mWifiNetworkFactory.needNetworkFor(mNetworkRequest, 0); + + mWifiNetworkFactory.addCallback(mAppBinder, mNetworkRequestMatchCallback, + TEST_CALLBACK_IDENTIFIER); + verify(mNetworkRequestMatchCallback).onUserSelectionCallbackRegistration( + mNetworkRequestUserSelectionCallback.capture()); + + verifyPeriodicScans(0, PERIODIC_SCAN_INTERVAL_MS); + + INetworkRequestUserSelectionCallback networkRequestUserSelectionCallback = + mNetworkRequestUserSelectionCallback.getValue(); + assertNotNull(networkRequestUserSelectionCallback); + + // Now trigger user selection to one of the network. + mSelectedNetwork = WifiConfigurationTestUtil.createPskNetwork(); + mSelectedNetwork.SSID = "\"" + mTestScanDatas[0].getResults()[0].SSID + "\""; + networkRequestUserSelectionCallback.select(mSelectedNetwork); + mLooper.dispatchAll(); + + // Verifier num of Approved access points. + assertEquals(mWifiNetworkFactory.mUserApprovedAccessPointMap + .get(TEST_PACKAGE_NAME_1).size(), numOfApPerSsid); + + // Now trigger user selection to another network with different SSID. + mSelectedNetwork = WifiConfigurationTestUtil.createPskNetwork(); + mSelectedNetwork.SSID = "\"" + mTestScanDatas[0].getResults()[numOfApPerSsid].SSID + "\""; + networkRequestUserSelectionCallback.select(mSelectedNetwork); + mLooper.dispatchAll(); + + // Verify triggered trim when user Approved Access Points exceed capacity. + Set<AccessPoint> userApprovedAccessPoints = mWifiNetworkFactory.mUserApprovedAccessPointMap + .get(TEST_PACKAGE_NAME_1); + assertEquals(userApprovedAccessPoints.size(), userApproveAccessPointCapacity); + long numOfSsid1Aps = userApprovedAccessPoints + .stream() + .filter(a->a.ssid.equals(TEST_SSID_1)) + .count(); + assertEquals(numOfSsid1Aps, userApproveAccessPointCapacity - numOfApPerSsid); + } + + /** * Verify handling of user selection to trigger connection to an existing saved network. */ @Test @@ -2322,6 +2399,35 @@ public class WifiNetworkFactoryTest { verify(mClientModeImpl).sendMessage(any()); } + /** + * Verify the config store save and load could preserve the elements order. + */ + @Test + public void testStoteConfigSaveAndLoadPreserveOrder() throws Exception { + LinkedHashSet<AccessPoint> approvedApSet = new LinkedHashSet<>(); + approvedApSet.add(new AccessPoint(TEST_SSID_1, + MacAddress.fromString(TEST_BSSID_1), WifiConfiguration.SECURITY_TYPE_PSK)); + approvedApSet.add(new AccessPoint(TEST_SSID_2, + MacAddress.fromString(TEST_BSSID_2), WifiConfiguration.SECURITY_TYPE_PSK)); + approvedApSet.add(new AccessPoint(TEST_SSID_3, + MacAddress.fromString(TEST_BSSID_3), WifiConfiguration.SECURITY_TYPE_PSK)); + approvedApSet.add(new AccessPoint(TEST_SSID_4, + MacAddress.fromString(TEST_BSSID_4), WifiConfiguration.SECURITY_TYPE_PSK)); + mWifiNetworkFactory.mUserApprovedAccessPointMap.put(TEST_PACKAGE_NAME_1, + new LinkedHashSet<>(approvedApSet)); + // Save config. + byte[] xmlData = serializeData(); + mWifiNetworkFactory.mUserApprovedAccessPointMap.clear(); + // Load config. + deserializeData(xmlData); + + LinkedHashSet<AccessPoint> storedApSet = mWifiNetworkFactory + .mUserApprovedAccessPointMap.get(TEST_PACKAGE_NAME_1); + // Check load config success and order preserved. + assertNotNull(storedApSet); + assertArrayEquals(approvedApSet.toArray(), storedApSet.toArray()); + } + private Messenger sendNetworkRequestAndSetupForConnectionStatus() throws RemoteException { return sendNetworkRequestAndSetupForConnectionStatus(TEST_SSID_1); } @@ -2621,4 +2727,59 @@ public class WifiNetworkFactoryTest { expectedWifiConfiguration.fromWifiNetworkSpecifier = true; WifiConfigurationTestUtil.assertConfigurationEqual(expectedWifiConfiguration, network); } + + /** + * Create a test scan data for target SSID list with specified number and encryption type + * @param scanResultType network encryption type + * @param nums Number of results with different BSSIDs for one SSID + * @param ssids target SSID list + */ + private void setupScanDataSameSsidWithDiffBssid(int scanResultType, int nums, String[] ssids) { + String baseBssid = "11:34:56:78:90:"; + int[] freq = new int[nums * ssids.length]; + for (int i = 0; i < nums; i++) { + freq[i] = 2417 + i; + } + mTestScanDatas = ScanTestUtil.createScanDatas(new int[][]{ freq }); + assertEquals(1, mTestScanDatas.length); + ScanResult[] scanResults = mTestScanDatas[0].getResults(); + assertEquals(nums * ssids.length, scanResults.length); + String caps = getScanResultCapsForType(scanResultType); + for (int i = 0; i < ssids.length; i++) { + for (int j = i * nums; j < (i + 1) * nums; j++) { + scanResults[j].SSID = ssids[i]; + scanResults[j].BSSID = baseBssid + Integer.toHexString(16 + j); + scanResults[j].capabilities = caps; + scanResults[j].level = -45; + } + } + } + + /** + * Helper function for serializing configuration data to a XML block. + * + * @return byte[] of the XML data + * @throws Exception + */ + private byte[] serializeData() throws Exception { + final XmlSerializer out = new FastXmlSerializer(); + final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + out.setOutput(outputStream, StandardCharsets.UTF_8.name()); + mNetworkRequestStoreData.serializeData(out); + out.flush(); + return outputStream.toByteArray(); + } + + /** + * Helper function for parsing configuration data from a XML block. + * + * @param data XML data to parse from + * @throws Exception + */ + private void deserializeData(byte[] data) throws Exception { + final XmlPullParser in = Xml.newPullParser(); + final ByteArrayInputStream inputStream = new ByteArrayInputStream(data); + in.setInput(inputStream, StandardCharsets.UTF_8.name()); + mNetworkRequestStoreData.deserializeData(in, in.getDepth()); + } } diff --git a/tests/wifitests/src/com/android/server/wifi/WifiNetworkSuggestionsManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiNetworkSuggestionsManagerTest.java index 97a183370..9b462681a 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiNetworkSuggestionsManagerTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiNetworkSuggestionsManagerTest.java @@ -48,6 +48,7 @@ import android.net.MacAddress; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; import android.net.wifi.WifiNetworkSuggestion; +import android.net.wifi.WifiScanner; import android.os.Handler; import android.os.UserHandle; import android.os.test.TestLooper; @@ -836,7 +837,7 @@ public class WifiNetworkSuggestionsManagerTest { validatePostConnectionBroadcastSent(TEST_PACKAGE_1, networkSuggestion); // Verify no more broadcast were sent out. - verifyNoMoreInteractions(mContext); + mInorder.verifyNoMoreInteractions(); } /** @@ -865,7 +866,11 @@ public class WifiNetworkSuggestionsManagerTest { verify(mWifiMetrics).incrementNetworkSuggestionApiNumConnectFailure(); // Verify no more broadcast were sent out. - verifyNoMoreInteractions(mContext); + mInorder.verify(mWifiPermissionsUtil, never()).enforceCanAccessScanResults( + anyString(), anyInt()); + mInorder.verify(mContext, never()).sendBroadcastAsUser( + any(), any()); + } /** @@ -926,7 +931,7 @@ public class WifiNetworkSuggestionsManagerTest { } // Verify no more broadcast were sent out. - verifyNoMoreInteractions(mContext); + mInorder.verifyNoMoreInteractions(); } /** @@ -988,7 +993,7 @@ public class WifiNetworkSuggestionsManagerTest { } // Verify no more broadcast were sent out. - verifyNoMoreInteractions(mContext); + mInorder.verifyNoMoreInteractions(); } /** @@ -1051,7 +1056,7 @@ public class WifiNetworkSuggestionsManagerTest { } // Verify no more broadcast were sent out. - verifyNoMoreInteractions(mContext); + mInorder.verifyNoMoreInteractions(); } /** @@ -1083,7 +1088,10 @@ public class WifiNetworkSuggestionsManagerTest { TEST_BSSID); // Verify no broadcast was sent out. - verifyNoMoreInteractions(mContext, mWifiPermissionsUtil); + mInorder.verify(mWifiPermissionsUtil, never()).enforceCanAccessScanResults( + anyString(), anyInt()); + mInorder.verify(mContext, never()).sendBroadcastAsUser( + any(), any()); } /** @@ -1114,7 +1122,10 @@ public class WifiNetworkSuggestionsManagerTest { TEST_BSSID); // Verify no broadcast was sent out. - verifyNoMoreInteractions(mContext, mWifiPermissionsUtil); + mInorder.verify(mWifiPermissionsUtil, never()).enforceCanAccessScanResults( + anyString(), anyInt()); + mInorder.verify(mContext, never()).sendBroadcastAsUser( + any(), any()); } /** @@ -1151,7 +1162,7 @@ public class WifiNetworkSuggestionsManagerTest { .enforceCanAccessScanResults(TEST_PACKAGE_1, TEST_UID_1); // Verify no broadcast was sent out. - verifyNoMoreInteractions(mContext, mWifiPermissionsUtil); + mInorder.verifyNoMoreInteractions(); } /** @@ -1841,10 +1852,11 @@ public class WifiNetworkSuggestionsManagerTest { } /** - * Verify handling of user dismissal of the user approval notification. + * Verify user dismissal notification when first time add suggestions and dismissal the user + * approval notification when framework gets scan results. */ @Test - public void testUserApprovalNotificationDismissal() { + public void testUserApprovalNotificationDismissalWhenGetScanResult() { WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion( WifiConfigurationTestUtil.createOpenNetwork(), true, false, TEST_UID_1, TEST_PACKAGE_1); @@ -1855,6 +1867,11 @@ public class WifiNetworkSuggestionsManagerTest { assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS, mWifiNetworkSuggestionsManager.add(networkSuggestionList, TEST_UID_1, TEST_PACKAGE_1)); + validateUserApprovalNotification(TEST_APP_NAME_1); + // Simulate user dismissal notification. + sendBroadcastForUserAction( + NOTIFICATION_USER_DISMISSED_INTENT_ACTION, TEST_PACKAGE_1, TEST_UID_1); + reset(mNotificationManger); // Simulate finding the network in scan results. mWifiNetworkSuggestionsManager.getNetworkSuggestionsForScanDetail( @@ -1876,10 +1893,11 @@ public class WifiNetworkSuggestionsManagerTest { } /** - * Verify handling of user clicking allow on the user approval notification. + * Verify user dismissal notification when first time add suggestions and click on allow on + * the user approval notification when framework gets scan results. */ @Test - public void testUserApprovalNotificationClickOnAllow() { + public void testUserApprovalNotificationClickOnAllowWhenGetScanResult() { WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion( WifiConfigurationTestUtil.createOpenNetwork(), true, false, TEST_UID_1, TEST_PACKAGE_1); @@ -1890,6 +1908,12 @@ public class WifiNetworkSuggestionsManagerTest { assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS, mWifiNetworkSuggestionsManager.add(networkSuggestionList, TEST_UID_1, TEST_PACKAGE_1)); + validateUserApprovalNotification(TEST_APP_NAME_1); + + // Simulate user dismissal notification. + sendBroadcastForUserAction( + NOTIFICATION_USER_DISMISSED_INTENT_ACTION, TEST_PACKAGE_1, TEST_UID_1); + reset(mNotificationManger); // Simulate finding the network in scan results. mWifiNetworkSuggestionsManager.getNetworkSuggestionsForScanDetail( @@ -1915,10 +1939,11 @@ public class WifiNetworkSuggestionsManagerTest { } /** - * Verify handling of user clicking disallow on the user approval notification. + * Verify user dismissal notification when first time add suggestions and click on disallow on + * the user approval notification when framework gets scan results. */ @Test - public void testUserApprovalNotificationClickOnDisallow() { + public void testUserApprovalNotificationClickOnDisallowWhenGetScanResult() { WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion( WifiConfigurationTestUtil.createOpenNetwork(), true, false, TEST_UID_1, TEST_PACKAGE_1); @@ -1931,6 +1956,12 @@ public class WifiNetworkSuggestionsManagerTest { TEST_PACKAGE_1)); verify(mAppOpsManager).startWatchingMode(eq(OPSTR_CHANGE_WIFI_STATE), eq(TEST_PACKAGE_1), mAppOpChangedListenerCaptor.capture()); + validateUserApprovalNotification(TEST_APP_NAME_1); + + // Simulate user dismissal notification. + sendBroadcastForUserAction( + NOTIFICATION_USER_DISMISSED_INTENT_ACTION, TEST_PACKAGE_1, TEST_UID_1); + reset(mNotificationManger); // Simulate finding the network in scan results. mWifiNetworkSuggestionsManager.getNetworkSuggestionsForScanDetail( @@ -2009,6 +2040,134 @@ public class WifiNetworkSuggestionsManagerTest { } /** + * Verify get hidden networks from All user approve network suggestions + */ + @Test + public void testGetHiddenNetworks() { + + WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion( + WifiConfigurationTestUtil.createOpenNetwork(), true, false, TEST_UID_1, + TEST_PACKAGE_1); + WifiNetworkSuggestion hiddenNetworkSuggestion1 = new WifiNetworkSuggestion( + WifiConfigurationTestUtil.createPskHiddenNetwork(), true, false, TEST_UID_1, + TEST_PACKAGE_1); + WifiNetworkSuggestion hiddenNetworkSuggestion2 = new WifiNetworkSuggestion( + WifiConfigurationTestUtil.createPskHiddenNetwork(), true, false, TEST_UID_2, + TEST_PACKAGE_2); + List<WifiNetworkSuggestion> networkSuggestionList1 = + new ArrayList<WifiNetworkSuggestion>() {{ + add(networkSuggestion); + add(hiddenNetworkSuggestion1); + }}; + List<WifiNetworkSuggestion> networkSuggestionList2 = + new ArrayList<WifiNetworkSuggestion>() {{ + add(hiddenNetworkSuggestion2); + }}; + assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS, + mWifiNetworkSuggestionsManager.add(networkSuggestionList1, TEST_UID_1, + TEST_PACKAGE_1)); + assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS, + mWifiNetworkSuggestionsManager.add(networkSuggestionList2, TEST_UID_2, + TEST_PACKAGE_2)); + mWifiNetworkSuggestionsManager.setHasUserApprovedForApp(true, TEST_PACKAGE_1); + mWifiNetworkSuggestionsManager.setHasUserApprovedForApp(false, TEST_PACKAGE_2); + List<WifiScanner.ScanSettings.HiddenNetwork> hiddenNetworks = + mWifiNetworkSuggestionsManager.retrieveHiddenNetworkList(); + assertEquals(1, hiddenNetworks.size()); + assertEquals(hiddenNetworkSuggestion1.wifiConfiguration.SSID, hiddenNetworks.get(0).ssid); + } + + /** + * Verify handling of user clicking allow on the user approval notification when first time + * add suggestions. + */ + @Test + public void testUserApprovalNotificationClickOnAllowDuringAddingSuggestions() { + WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion( + WifiConfigurationTestUtil.createOpenNetwork(), true, false, TEST_UID_1, + TEST_PACKAGE_1); + List<WifiNetworkSuggestion> networkSuggestionList = + new ArrayList<WifiNetworkSuggestion>() {{ + add(networkSuggestion); + }}; + assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS, + mWifiNetworkSuggestionsManager.add(networkSuggestionList, TEST_UID_1, + TEST_PACKAGE_1)); + validateUserApprovalNotification(TEST_APP_NAME_1); + + // Simulate user clicking on allow in the notification. + sendBroadcastForUserAction( + NOTIFICATION_USER_ALLOWED_APP_INTENT_ACTION, TEST_PACKAGE_1, TEST_UID_1); + // Cancel the notification. + verify(mNotificationManger).cancel(SystemMessage.NOTE_NETWORK_SUGGESTION_AVAILABLE); + + // Verify config store interactions. + verify(mWifiConfigManager, times(2)).saveToStore(true); + assertTrue(mDataSource.hasNewDataToSerialize()); + + reset(mNotificationManger); + // We should not resend the notification next time the network is found in scan results. + mWifiNetworkSuggestionsManager.getNetworkSuggestionsForScanDetail( + createScanDetailForNetwork(networkSuggestion.wifiConfiguration)); + verifyNoMoreInteractions(mNotificationManger); + } + + /** + * Verify handling of user clicking Disallow on the user approval notification when first time + * add suggestions. + */ + @Test + public void testUserApprovalNotificationClickOnDisallowWhenAddSuggestions() { + WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion( + WifiConfigurationTestUtil.createOpenNetwork(), true, false, TEST_UID_1, + TEST_PACKAGE_1); + List<WifiNetworkSuggestion> networkSuggestionList = + new ArrayList<WifiNetworkSuggestion>() {{ + add(networkSuggestion); + }}; + assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS, + mWifiNetworkSuggestionsManager.add(networkSuggestionList, TEST_UID_1, + TEST_PACKAGE_1)); + verify(mAppOpsManager).startWatchingMode(eq(OPSTR_CHANGE_WIFI_STATE), + eq(TEST_PACKAGE_1), mAppOpChangedListenerCaptor.capture()); + validateUserApprovalNotification(TEST_APP_NAME_1); + + // Simulate user clicking on disallow in the notification. + sendBroadcastForUserAction( + NOTIFICATION_USER_DISALLOWED_APP_INTENT_ACTION, TEST_PACKAGE_1, TEST_UID_1); + // Ensure we turn off CHANGE_WIFI_STATE app-ops. + verify(mAppOpsManager).setMode( + OP_CHANGE_WIFI_STATE, TEST_UID_1, + TEST_PACKAGE_1, MODE_IGNORED); + // Cancel the notification. + verify(mNotificationManger).cancel(SystemMessage.NOTE_NETWORK_SUGGESTION_AVAILABLE); + + // Verify config store interactions. + verify(mWifiConfigManager, times(2)).saveToStore(true); + assertTrue(mDataSource.hasNewDataToSerialize()); + + reset(mNotificationManger); + + // Now trigger the app-ops callback to ensure we remove all of their suggestions. + AppOpsManager.OnOpChangedListener listener = mAppOpChangedListenerCaptor.getValue(); + assertNotNull(listener); + when(mAppOpsManager.unsafeCheckOpNoThrow( + OPSTR_CHANGE_WIFI_STATE, TEST_UID_1, + TEST_PACKAGE_1)) + .thenReturn(MODE_IGNORED); + listener.onOpChanged(OPSTR_CHANGE_WIFI_STATE, TEST_PACKAGE_1); + mLooper.dispatchAll(); + assertTrue(mWifiNetworkSuggestionsManager.getAllNetworkSuggestions().isEmpty()); + + // Assuming the user re-enabled the app again & added the same suggestions back. + assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS, + mWifiNetworkSuggestionsManager.add(networkSuggestionList, TEST_UID_1, + TEST_PACKAGE_1)); + validateUserApprovalNotification(TEST_APP_NAME_1); + verifyNoMoreInteractions(mNotificationManger); + } + + /** * Creates a scan detail corresponding to the provided network values. */ private ScanDetail createScanDetailForNetwork(WifiConfiguration configuration) { diff --git a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java index e286e339b..4f0ddc036 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java @@ -600,6 +600,26 @@ public class WifiServiceImplTest { } /** + * Verify that wifi can be enabled by the DO apps targeting Q SDK. + */ + @Test + public void testSetWifiEnabledSuccessForDOAppsTargetingQSDK() throws Exception { + doReturn(AppOpsManager.MODE_ALLOWED).when(mAppOpsManager) + .noteOp(AppOpsManager.OPSTR_CHANGE_WIFI_STATE, Process.myUid(), TEST_PACKAGE_NAME); + when(mWifiPermissionsUtil.isTargetSdkLessThan(anyString(), + eq(Build.VERSION_CODES.Q))).thenReturn(false); + when(mDevicePolicyManagerInternal.isActiveAdminWithPolicy( + Process.myUid(), DeviceAdminInfo.USES_POLICY_DEVICE_OWNER)) + .thenReturn(true); + + when(mSettingsStore.handleWifiToggled(eq(true))).thenReturn(true); + when(mSettingsStore.isAirplaneModeOn()).thenReturn(false); + assertTrue(mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, true)); + + verify(mWifiController).sendMessage(eq(CMD_WIFI_TOGGLED)); + } + + /** * Verify that wifi can be enabled by the system apps targeting Q SDK. */ @Test @@ -635,6 +655,20 @@ public class WifiServiceImplTest { } /** + * Verify that wifi is not enabled when wificontroller is not started. + */ + @Test + public void testSetWifiEnabledFailureWhenInCryptDebounce() throws Exception { + when(mFrameworkFacade.inStorageManagerCryptKeeperBounce()).thenReturn(true); + when(mContext.checkPermission(eq(android.Manifest.permission.NETWORK_SETTINGS), + anyInt(), anyInt())).thenReturn(PackageManager.PERMISSION_GRANTED); + when(mSettingsStore.handleWifiToggled(eq(true))).thenReturn(true); + when(mSettingsStore.isAirplaneModeOn()).thenReturn(false); + assertFalse(mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, true)); + verifyZeroInteractions(mWifiController); + } + + /** * Verify that wifi cannot be enabled by the apps targeting Q SDK. */ @Test @@ -830,6 +864,26 @@ public class WifiServiceImplTest { } /** + * Verify that wifi can be disabled by the PO apps targeting Q SDK. + */ + @Test + public void testSetWifiDisabledSuccessForPOAppsTargetingQSDK() throws Exception { + doReturn(AppOpsManager.MODE_ALLOWED).when(mAppOpsManager) + .noteOp(AppOpsManager.OPSTR_CHANGE_WIFI_STATE, Process.myUid(), TEST_PACKAGE_NAME); + when(mWifiPermissionsUtil.isTargetSdkLessThan(anyString(), + eq(Build.VERSION_CODES.Q))).thenReturn(false); + when(mDevicePolicyManagerInternal.isActiveAdminWithPolicy( + Process.myUid(), DeviceAdminInfo.USES_POLICY_PROFILE_OWNER)) + .thenReturn(true); + + when(mSettingsStore.handleWifiToggled(eq(false))).thenReturn(true); + when(mSettingsStore.isAirplaneModeOn()).thenReturn(false); + assertTrue(mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, false)); + + verify(mWifiController).sendMessage(eq(CMD_WIFI_TOGGLED)); + } + + /** * Verify that wifi can be disabled by the system apps targeting Q SDK. */ @Test @@ -866,6 +920,20 @@ public class WifiServiceImplTest { } /** + * Verify that wifi is not disabled when wificontroller is not started. + */ + @Test + public void testSetWifiDisabledFailureWhenInCryptDebounce() throws Exception { + when(mFrameworkFacade.inStorageManagerCryptKeeperBounce()).thenReturn(true); + when(mContext.checkPermission(eq(android.Manifest.permission.NETWORK_SETTINGS), + anyInt(), anyInt())).thenReturn(PackageManager.PERMISSION_GRANTED); + when(mSettingsStore.handleWifiToggled(eq(false))).thenReturn(false); + when(mSettingsStore.isAirplaneModeOn()).thenReturn(false); + assertFalse(mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, false)); + verifyZeroInteractions(mWifiController); + } + + /** * Verify that wifi cannot be disabled by the apps targeting Q SDK. */ @Test @@ -1122,6 +1190,19 @@ public class WifiServiceImplTest { } /** + * Verify does not start softap when wificontroller is not started. + */ + @Test + public void testStartSoftApWhenInCryptDebounce() { + when(mFrameworkFacade.inStorageManagerCryptKeeperBounce()).thenReturn(true); + + WifiConfiguration config = createValidSoftApConfiguration(); + boolean result = mWifiServiceImpl.startSoftAp(config); + assertFalse(result); + verifyZeroInteractions(mWifiController); + } + + /** * Verify a SecurityException is thrown when a caller without the correct permission attempts to * start softap. */ @@ -1145,6 +1226,18 @@ public class WifiServiceImplTest { } /** + * Verify does not stop softap when wificontroller is not started. + */ + @Test + public void testStopSoftApWhenInCryptDebounce() { + when(mFrameworkFacade.inStorageManagerCryptKeeperBounce()).thenReturn(true); + + boolean result = mWifiServiceImpl.stopSoftAp(); + assertFalse(result); + verifyZeroInteractions(mWifiController); + } + + /** * Verify SecurityException is thrown when a caller without the correct permission attempts to * stop softap. */ @@ -1499,6 +1592,19 @@ public class WifiServiceImplTest { } /** + * Only start LocalOnlyHotspot if device is in crypt debounce mode. + */ + @Test + public void testStartLocalOnlyHotspotFailsIfInCryptDebounce() throws Exception { + when(mWifiPermissionsUtil.isLocationModeEnabled()).thenReturn(true); + when(mFrameworkFacade.isAppForeground(anyInt())).thenReturn(true); + when(mFrameworkFacade.inStorageManagerCryptKeeperBounce()).thenReturn(true); + int result = mWifiServiceImpl.startLocalOnlyHotspot(mAppMessenger, mAppBinder, + TEST_PACKAGE_NAME); + assertEquals(LocalOnlyHotspotCallback.ERROR_INCOMPATIBLE_MODE, result); + } + + /** * Only start LocalOnlyHotspot if we are not tethering. */ @Test @@ -1516,7 +1622,6 @@ public class WifiServiceImplTest { // Start another session without a stop, that should fail. assertFalse(mWifiServiceImpl.startSoftAp(createValidSoftApConfiguration())); - verifyNoMoreInteractions(mWifiController); } diff --git a/tests/wifitests/src/com/android/server/wifi/hotspot2/OsuServerConnectionTest.java b/tests/wifitests/src/com/android/server/wifi/hotspot2/OsuServerConnectionTest.java index c5baac721..843caf1a9 100644 --- a/tests/wifitests/src/com/android/server/wifi/hotspot2/OsuServerConnectionTest.java +++ b/tests/wifitests/src/com/android/server/wifi/hotspot2/OsuServerConnectionTest.java @@ -81,7 +81,8 @@ import javax.net.ssl.X509TrustManager; */ @SmallTest public class OsuServerConnectionTest { - private static final String TEST_VALID_URL = "http://www.google.com"; + private static final String TEST_VALID_URL = "https://www.google.com"; + private static final String TEST_INVALID_URL = "http://www.google.com"; private static final String AUTH_TYPE = "ECDHE_RSA"; private static final String PROVIDER_NAME_VALID = "Boingo"; private static final String PROVIDER_NAME_INVALID = "Boingo1"; @@ -90,11 +91,10 @@ public class OsuServerConnectionTest { private TestLooper mLooper = new TestLooper(); private OsuServerConnection mOsuServerConnection; - private URL mValidServerUrl; + private URL mServerUrl; private List<Pair<Locale, String>> mProviderIdentities = new ArrayList<>(); private ArgumentCaptor<TrustManager[]> mTrustManagerCaptor = ArgumentCaptor.forClass(TrustManager[].class); - private Map<Integer, Map<String, byte[]>> mTrustCertsInfo = new HashMap<>(); @Mock PasspointProvisioner.OsuServerCallbacks mOsuServerCallbacks; @@ -114,7 +114,7 @@ public class OsuServerConnectionTest { mOsuServerConnection = new OsuServerConnection(mLooper.getLooper()); mOsuServerConnection.enableVerboseLogging(ENABLE_VERBOSE_LOGGING); mProviderIdentities.add(Pair.create(Locale.US, PROVIDER_NAME_VALID)); - mValidServerUrl = new URL(TEST_VALID_URL); + mServerUrl = new URL(TEST_VALID_URL); when(mWfaKeyStore.get()).thenReturn(mKeyStore); when(mOsuServerCallbacks.getSessionId()).thenReturn(TEST_SESSION_ID); when(mNetwork.openConnection(any(URL.class))).thenReturn(mUrlConnection); @@ -185,7 +185,7 @@ public class OsuServerConnectionTest { mOsuServerConnection.setEventCallback(mOsuServerCallbacks); assertTrue(mOsuServerConnection.canValidateServer()); - assertTrue(mOsuServerConnection.connect(mValidServerUrl, mNetwork)); + assertTrue(mOsuServerConnection.connect(mServerUrl, mNetwork)); mLooper.dispatchAll(); @@ -203,7 +203,7 @@ public class OsuServerConnectionTest { mOsuServerConnection.setEventCallback(mOsuServerCallbacks); assertTrue(mOsuServerConnection.canValidateServer()); - assertTrue(mOsuServerConnection.connect(mValidServerUrl, mNetwork)); + assertTrue(mOsuServerConnection.connect(mServerUrl, mNetwork)); mLooper.dispatchAll(); @@ -216,13 +216,16 @@ public class OsuServerConnectionTest { @Test public void verifyInitAndConnectCertValidationFailure() throws Exception { establishServerConnection(); + List<X509Certificate> certificateList = PasspointProvisioningTestUtil.getOsuCertsForTest(); + X509Certificate[] certificates = new X509Certificate[1]; + certificates[0] = certificateList.get(0); TrustManager[] trustManagers = mTrustManagerCaptor.getValue(); X509TrustManager trustManager = (X509TrustManager) trustManagers[0]; doThrow(new CertificateException()).when(mDelegate) .getTrustedChainForServer(any(X509Certificate[].class), anyString(), (Socket) isNull()); - trustManager.checkServerTrusted(new X509Certificate[1], AUTH_TYPE); + trustManager.checkServerTrusted(certificates, AUTH_TYPE); verify(mOsuServerCallbacks).onServerValidationStatus(anyInt(), eq(false)); } @@ -475,13 +478,26 @@ public class OsuServerConnectionTest { } } + /** + * Verifies initialization and opening URL connection failure for an HTTP URL (not HTTPS) + */ + @Test + public void verifyInitAndNetworkOpenURLConnectionFailedWithHttpUrl() throws Exception { + mServerUrl = new URL(TEST_INVALID_URL); + mOsuServerConnection.init(mTlsContext, mDelegate); + mOsuServerConnection.setEventCallback(mOsuServerCallbacks); + + assertTrue(mOsuServerConnection.canValidateServer()); + assertFalse(mOsuServerConnection.connect(mServerUrl, mNetwork)); + } + private void establishServerConnection() throws Exception { mOsuServerConnection.init(mTlsContext, mDelegate); mOsuServerConnection.setEventCallback(mOsuServerCallbacks); verify(mTlsContext).init(isNull(), mTrustManagerCaptor.capture(), isNull()); assertTrue(mOsuServerConnection.canValidateServer()); - assertTrue(mOsuServerConnection.connect(mValidServerUrl, mNetwork)); + assertTrue(mOsuServerConnection.connect(mServerUrl, mNetwork)); mLooper.dispatchAll(); verify(mOsuServerCallbacks).onServerConnectionStatus(anyInt(), eq(true)); |