blob: 1e06773163dd14814d2691f3326c4d0814e47445 [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.wifi;
import static android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID;
import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus
.NETWORK_SELECTION_TEMPORARY_DISABLED;
import static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_EAP;
import static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_PSK;
import static com.android.server.wifi.WifiConfigurationTestUtil.generateWifiConfig;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiEnterpriseConfig;
import android.net.wifi.WifiNetworkSuggestion;
import android.net.wifi.WifiSsid;
import android.util.LocalLog;
import android.util.Pair;
import androidx.test.filters.SmallTest;
import com.android.server.wifi.WifiNetworkSuggestionsManager.ExtendedWifiNetworkSuggestion;
import com.android.server.wifi.WifiNetworkSuggestionsManager.PerAppInfo;
import com.android.server.wifi.hotspot2.PasspointNetworkNominateHelper;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Unit tests for {@link NetworkSuggestionNominator}.
*/
@SmallTest
public class NetworkSuggestionNominatorTest extends WifiBaseTest {
private static final int TEST_UID = 3555;
private static final int TEST_UID_OTHER = 3545;
private static final int TEST_NETWORK_ID = 55;
private static final String TEST_PACKAGE = "com.test";
private static final String TEST_PACKAGE_OTHER = "com.test.other";
private static final String TEST_FQDN = "fqdn";
private static final int TEST_CARRIER_ID = 1911;
private static final String TEST_CARRIER_NAME = "testCarrier";
private static final int TEST_SUB_ID = 2020;
private @Mock WifiConfigManager mWifiConfigManager;
private @Mock WifiNetworkSuggestionsManager mWifiNetworkSuggestionsManager;
private @Mock PasspointNetworkNominateHelper mPasspointNetworkNominateHelper;
private @Mock Clock mClock;
private @Mock
WifiCarrierInfoManager mWifiCarrierInfoManager;
private NetworkSuggestionNominator mNetworkSuggestionNominator;
/** Sets up test. */
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mNetworkSuggestionNominator = new NetworkSuggestionNominator(
mWifiNetworkSuggestionsManager, mWifiConfigManager, mPasspointNetworkNominateHelper,
new LocalLog(100), mWifiCarrierInfoManager);
}
/**
* Ensure that we ignore all scan results not matching the network suggestion.
* Expected connectable Networks: {}
*/
@Test
public void testSelectNetworkSuggestionForNoMatch() {
String[] scanSsids = {"test1", "test2"};
String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
int[] freqs = {2470, 2437};
String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
int[] levels = {-67, -76};
String[] suggestionSsids = {};
int[] securities = {};
boolean[] appInteractions = {};
boolean[] meteredness = {};
int[] priorities = {};
int[] uids = {};
String[] packageNames = {};
boolean[] autojoin = {};
boolean[] shareWithUser = {};
ScanDetail[] scanDetails =
buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
securities, appInteractions, meteredness, priorities, uids,
packageNames, autojoin, shareWithUser);
// Link the scan result with suggestions.
linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
mNetworkSuggestionNominator.nominateNetworks(
Arrays.asList(scanDetails), null, null, true, false,
(ScanDetail scanDetail, WifiConfiguration configuration) -> {
connectableNetworks.add(Pair.create(scanDetail, configuration));
});
assertTrue(connectableNetworks.isEmpty());
}
/**
* Ensure that we nominate the only matching network suggestion.
* Expected connectable Networks: {suggestionSsids[0]}
*/
@Test
public void testSelectNetworkSuggestionForOneMatch() {
String[] scanSsids = {"test1", "test2"};
String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
int[] freqs = {2470, 2437};
String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
int[] levels = {-67, -76};
String[] suggestionSsids = {"\"" + scanSsids[0] + "\""};
int[] securities = {SECURITY_PSK};
boolean[] appInteractions = {true};
boolean[] meteredness = {true};
int[] priorities = {-1};
int[] uids = {TEST_UID};
String[] packageNames = {TEST_PACKAGE};
boolean[] autojoin = {true};
boolean[] shareWithUser = {true};
ScanDetail[] scanDetails =
buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
securities, appInteractions, meteredness, priorities, uids,
packageNames, autojoin, shareWithUser);
// Link the scan result with suggestions.
linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
// setup config manager interactions.
setupAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration);
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
mNetworkSuggestionNominator.nominateNetworks(
Arrays.asList(scanDetails), null, null, true, false,
(ScanDetail scanDetail, WifiConfiguration configuration) -> {
connectableNetworks.add(Pair.create(scanDetail, configuration));
});
validateConnectableNetworks(connectableNetworks, scanSsids[0]);
verifyAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration);
}
@Test
public void testSelectNetworkSuggestionForOneMatchWithInsecureEnterpriseSuggestion() {
String[] scanSsids = {"test1"};
String[] bssids = {"6c:f3:7f:ae:8c:f3"};
int[] freqs = {2470};
String[] caps = {"[WPA2-EAP-CCMP][ESS]"};
int[] levels = {-67};
String[] suggestionSsids = {"\"" + scanSsids[0] + "\""};
int[] securities = {SECURITY_EAP};
boolean[] appInteractions = {true};
boolean[] meteredness = {true};
int[] priorities = {-1};
int[] uids = {TEST_UID};
String[] packageNames = {TEST_PACKAGE};
boolean[] autojoin = {true};
boolean[] shareWithUser = {true};
ScanDetail[] scanDetails =
buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
securities, appInteractions, meteredness, priorities, uids,
packageNames, autojoin, shareWithUser);
WifiConfiguration config = suggestions[0].wns.wifiConfiguration;
config.enterpriseConfig.setCaPath(null);
// Link the scan result with suggestions.
linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
// setup config manager interactions.
setupAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration);
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
mNetworkSuggestionNominator.nominateNetworks(
Arrays.asList(scanDetails), null, null, true, false,
(ScanDetail scanDetail, WifiConfiguration configuration) -> {
connectableNetworks.add(Pair.create(scanDetail, configuration));
});
// Verify no network is nominated.
assertTrue(connectableNetworks.isEmpty());
}
/**
* Ensure that we nominate the all network suggestion corresponding to the scan results
* Expected connectable Networks: {suggestionSsids[0], suggestionSsids[1]}
*/
@Test
public void testSelectNetworkSuggestionForMultipleMatch() {
String[] scanSsids = {"test1", "test2"};
String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
int[] freqs = {2470, 2437};
String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
int[] levels = {-56, -45};
String[] suggestionSsids = {"\"" + scanSsids[0] + "\"", "\"" + scanSsids[1] + "\""};
int[] securities = {SECURITY_PSK, SECURITY_PSK};
boolean[] appInteractions = {true, true};
boolean[] meteredness = {true, true};
int[] priorities = {-1, -1};
int[] uids = {TEST_UID, TEST_UID};
String[] packageNames = {TEST_PACKAGE, TEST_PACKAGE};
boolean[] autojoin = {true, true};
boolean[] shareWithUser = {true, true};
ScanDetail[] scanDetails =
buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
securities, appInteractions, meteredness, priorities, uids,
packageNames, autojoin, shareWithUser);
// Link the scan result with suggestions.
linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
// setup config manager interactions.
setupAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration,
suggestions[1].wns.wifiConfiguration);
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
mNetworkSuggestionNominator.nominateNetworks(
Arrays.asList(scanDetails), null, null, true, false,
(ScanDetail scanDetail, WifiConfiguration configuration) -> {
connectableNetworks.add(Pair.create(scanDetail, configuration));
});
validateConnectableNetworks(connectableNetworks, scanSsids[0], scanSsids[1]);
verifyAddToWifiConfigManager(suggestions[1].wns.wifiConfiguration,
suggestions[1].wns.wifiConfiguration);
}
/**
* Ensure that we nominate the network suggestion corresponding to the scan result with
* higest priority.
* Expected connectable Networks: {suggestionSsids[0]}
*/
@Test
public void testSelectNetworkSuggestionForMultipleMatchHighPriorityWins() {
String[] scanSsids = {"test1", "test2"};
String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
int[] freqs = {2470, 2437};
String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
int[] levels = {-56, -45};
String[] suggestionSsids = {"\"" + scanSsids[0] + "\"", "\"" + scanSsids[1] + "\""};
int[] securities = {SECURITY_PSK, SECURITY_PSK};
boolean[] appInteractions = {true, true};
boolean[] meteredness = {true, true};
int[] priorities = {5, 1};
int[] uids = {TEST_UID, TEST_UID};
String[] packageNames = {TEST_PACKAGE, TEST_PACKAGE};
boolean[] autojoin = {true, true};
boolean[] shareWithUser = {true, true};
ScanDetail[] scanDetails =
buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
securities, appInteractions, meteredness, priorities, uids,
packageNames, autojoin, shareWithUser);
// Link the scan result with suggestions.
linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
// setup config manager interactions.
setupAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration,
suggestions[1].wns.wifiConfiguration);
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
mNetworkSuggestionNominator.nominateNetworks(
Arrays.asList(scanDetails), null, null, true, false,
(ScanDetail scanDetail, WifiConfiguration configuration) -> {
connectableNetworks.add(Pair.create(scanDetail, configuration));
});
validateConnectableNetworks(connectableNetworks, scanSsids[0]);
verifyAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration);
}
/**
* Ensure that we nominate one network when multiple suggestor suggested same network.
*
* Expected connectable Networks: {suggestionSsids[0],
* (suggestionSsids[1] || suggestionSsids[2]}
*/
@Test
public void testSelectNetworkSuggestionForMultipleMatchWithMultipleSuggestions() {
String[] scanSsids = {"test1", "test2"};
String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
int[] freqs = {2470, 2437};
String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
int[] levels = {-23, -45};
String[] suggestionSsids = {"\"" + scanSsids[0] + "\"", "\"" + scanSsids[1] + "\"",
"\"" + scanSsids[1] + "\""};
int[] securities = {SECURITY_PSK, SECURITY_PSK, SECURITY_PSK};
boolean[] appInteractions = {true, true, false};
boolean[] meteredness = {true, true, false};
int[] priorities = {-1, -1, -1};
int[] uids = {TEST_UID, TEST_UID, TEST_UID_OTHER};
String[] packageNames = {TEST_PACKAGE, TEST_PACKAGE, TEST_PACKAGE_OTHER};
boolean[] autojoin = {true, true, true};
boolean[] shareWithUser = {true, true, true};
ScanDetail[] scanDetails =
buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
securities, appInteractions, meteredness, priorities, uids,
packageNames, autojoin, shareWithUser);
// Link the scan result with suggestions.
linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
// setup config manager interactions.
setupAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration,
suggestions[1].wns.wifiConfiguration, suggestions[2].wns.wifiConfiguration);
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
mNetworkSuggestionNominator.nominateNetworks(
Arrays.asList(scanDetails), null, null, true, false,
(ScanDetail scanDetail, WifiConfiguration configuration) -> {
connectableNetworks.add(Pair.create(scanDetail, configuration));
});
validateConnectableNetworks(connectableNetworks, scanSsids);
verifyAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration,
suggestions[1].wns.wifiConfiguration);
}
/**
* Ensure that we nominate the network suggestion with the higest priority among network
* suggestions from the same package. Among different packages, nominate all the suggestion
* corresponding to the scan result.
*
* The suggestion[1] has higher priority than suggestion[0].
*
* Expected connectable Networks: {suggestionSsids[1],
* (suggestionSsids[2],
* suggestionSsids[3]}
*/
@Test
public void
testSelectNetworkSuggestionForMultipleMatchWithMultipleSuggestionsHighPriorityWins() {
String[] scanSsids = {"test1", "test2", "test3", "test4"};
String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4", "6c:fc:de:34:12",
"6c:fd:a1:11:11:98"};
int[] freqs = {2470, 2437, 2470, 2437};
String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]",
"[WPA2-EAP-CCMP][ESS]"};
int[] levels = {-23, -45, -56, -65};
String[] suggestionSsids = {"\"" + scanSsids[0] + "\"", "\"" + scanSsids[1] + "\"",
"\"" + scanSsids[2] + "\"", "\"" + scanSsids[3] + "\""};
int[] securities = {SECURITY_PSK, SECURITY_PSK, SECURITY_PSK, SECURITY_PSK};
boolean[] appInteractions = {true, true, false, false};
boolean[] meteredness = {true, true, false, false};
int[] priorities = {0, 5, -1, -1};
int[] uids = {TEST_UID, TEST_UID, TEST_UID_OTHER, TEST_UID_OTHER};
String[] packageNames = {TEST_PACKAGE, TEST_PACKAGE, TEST_PACKAGE_OTHER,
TEST_PACKAGE_OTHER};
boolean[] autojoin = {true, true, true, true};
boolean[] shareWithUser = {true, true, true, true};
ScanDetail[] scanDetails =
buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
securities, appInteractions, meteredness, priorities, uids,
packageNames, autojoin, shareWithUser);
// Link the scan result with suggestions.
linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
// setup config manager interactions.
setupAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration,
suggestions[1].wns.wifiConfiguration, suggestions[2].wns.wifiConfiguration,
suggestions[3].wns.wifiConfiguration);
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
mNetworkSuggestionNominator.nominateNetworks(
Arrays.asList(scanDetails), null, null, true, false,
(ScanDetail scanDetail, WifiConfiguration configuration) -> {
connectableNetworks.add(Pair.create(scanDetail, configuration));
});
validateConnectableNetworks(connectableNetworks, scanSsids[1], scanSsids[2], scanSsids[3]);
verifyAddToWifiConfigManager(suggestions[1].wns.wifiConfiguration,
suggestions[2].wns.wifiConfiguration, suggestions[3].wns.wifiConfiguration);
}
/**
* Ensure that we nominate no candidate if the only matching network suggestion, but we failed
* the {@link WifiConfigManager} interactions.
*
* Expected connectable Networks: {}
*/
@Test
public void testSelectNetworkSuggestionForOneMatchButFailToAddToWifiConfigManager() {
String[] scanSsids = {"test1", "test2"};
String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
int[] freqs = {2470, 2437};
String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
int[] levels = {-67, -76};
String[] suggestionSsids = {"\"" + scanSsids[0] + "\""};
int[] securities = {SECURITY_PSK};
boolean[] appInteractions = {true};
boolean[] meteredness = {true};
int[] priorities = {-1};
int[] uids = {TEST_UID};
String[] packageNames = {TEST_PACKAGE};
boolean[] autojoin = {true};
boolean[] shareWithUser = {true};
ScanDetail[] scanDetails =
buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
securities, appInteractions, meteredness, priorities, uids,
packageNames, autojoin, shareWithUser);
// Link the scan result with suggestions.
linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
// Fail add to WifiConfigManager
when(mWifiConfigManager.addOrUpdateNetwork(any(), anyInt(), anyString()))
.thenReturn(new NetworkUpdateResult(INVALID_NETWORK_ID));
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
mNetworkSuggestionNominator.nominateNetworks(
Arrays.asList(scanDetails), null, null, true, false,
(ScanDetail scanDetail, WifiConfiguration configuration) -> {
connectableNetworks.add(Pair.create(scanDetail, configuration));
});
assertTrue(connectableNetworks.isEmpty());
verify(mWifiConfigManager, times(suggestionSsids.length))
.isNetworkTemporarilyDisabledByUser(anyString());
verify(mWifiConfigManager).getConfiguredNetwork(eq(
suggestions[0].wns.wifiConfiguration.getKey()));
verify(mWifiConfigManager).addOrUpdateNetwork(any(), anyInt(), anyString());
// Verify we did not try to add any new networks or other interactions with
// WifiConfigManager.
verifyNoMoreInteractions(mWifiConfigManager);
}
/**
* Ensure that we nominate the only matching network suggestion, but that matches an existing
* saved network (maybe saved or maybe it exists from a previous connection attempt) .
*
* Expected connectable Networks: {suggestionSsids[0]}
*/
@Test
public void testSelectNetworkSuggestionForOneMatchForExistingNetwork() {
String[] scanSsids = {"test1", "test2"};
String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
int[] freqs = {2470, 2437};
String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
int[] levels = {-67, -76};
String[] suggestionSsids = {"\"" + scanSsids[0] + "\""};
int[] securities = {SECURITY_PSK};
boolean[] appInteractions = {true};
boolean[] meteredness = {true};
int[] priorities = {-1};
int[] uids = {TEST_UID};
String[] packageNames = {TEST_PACKAGE};
boolean[] autojoin = {true};
boolean[] shareWithUser = {true};
ScanDetail[] scanDetails =
buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
securities, appInteractions, meteredness, priorities, uids,
packageNames, autojoin, shareWithUser);
// Link the scan result with suggestions.
linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
// setup config manager interactions.
suggestions[0].wns.wifiConfiguration.fromWifiNetworkSuggestion = true;
suggestions[0].wns.wifiConfiguration.ephemeral = true;
setupAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration);
// Existing saved network matching the credentials.
when(mWifiConfigManager.getConfiguredNetwork(suggestions[0].wns.wifiConfiguration.getKey()))
.thenReturn(suggestions[0].wns.wifiConfiguration);
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
mNetworkSuggestionNominator.nominateNetworks(
Arrays.asList(scanDetails), null, null, true, false,
(ScanDetail scanDetail, WifiConfiguration configuration) -> {
connectableNetworks.add(Pair.create(scanDetail, configuration));
});
validateConnectableNetworks(connectableNetworks, new String[] {scanSsids[0]});
// check for any saved networks.
verify(mWifiConfigManager, times(suggestionSsids.length))
.isNetworkTemporarilyDisabledByUser(anyString());
verify(mWifiConfigManager)
.getConfiguredNetwork(suggestions[0].wns.wifiConfiguration.getKey());
// Verify we did not try to add any new networks or other interactions with
// WifiConfigManager.
verifyNoMoreInteractions(mWifiConfigManager);
}
/**
* Ensure that we don't nominate the only matching network suggestion if it was previously
* disabled by the user.
*
* Expected connectable Networks: {}
*/
@Test
public void testSelectNetworkSuggestionForOneMatchButUserForgotTheNetwork() {
String[] scanSsids = {"test1", "test2"};
String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
int[] freqs = {2470, 2437};
String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
int[] levels = {-67, -76};
String[] suggestionSsids = {"\"" + scanSsids[0] + "\""};
int[] securities = {SECURITY_PSK};
boolean[] appInteractions = {true};
boolean[] meteredness = {true};
int[] priorities = {-1};
int[] uids = {TEST_UID};
String[] packageNames = {TEST_PACKAGE};
boolean[] autojoin = {true};
boolean[] shareWithUser = {true};
ScanDetail[] scanDetails =
buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
securities, appInteractions, meteredness, priorities, uids,
packageNames, autojoin, shareWithUser);
// Link the scan result with suggestions.
linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
// setup config manager interactions.
setupAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration);
// Network was disabled by the user.
when(mWifiConfigManager.isNetworkTemporarilyDisabledByUser(suggestionSsids[0]))
.thenReturn(true);
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
mNetworkSuggestionNominator.nominateNetworks(
Arrays.asList(scanDetails), null, null, true, false,
(ScanDetail scanDetail, WifiConfiguration configuration) ->
connectableNetworks.add(Pair.create(scanDetail, configuration)));
assertTrue(connectableNetworks.isEmpty());
verify(mWifiConfigManager, times(suggestionSsids.length))
.isNetworkTemporarilyDisabledByUser(anyString());
// Verify we did try to add any new networks or other interactions with
// WifiConfigManager.
verifyAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration);
}
/**
* Ensure that we don't nominate the only matching network suggestion if the network
* configuration already exists (maybe saved or maybe it exists from a previous connection
* attempt) and blacklisted.
*
* Expected connectable Networks: {}
*/
@Test
public void testSelectNetworkSuggestionForOneMatchForExistingNetworkButTempDisabled() {
String[] scanSsids = {"test1", "test2"};
String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
int[] freqs = {2470, 2437};
String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
int[] levels = {-67, -76};
String[] suggestionSsids = {"\"" + scanSsids[0] + "\""};
int[] securities = {SECURITY_PSK};
boolean[] appInteractions = {true};
boolean[] meteredness = {true};
int[] priorities = {-1};
int[] uids = {TEST_UID};
String[] packageNames = {TEST_PACKAGE};
boolean[] autojoin = {true};
boolean[] shareWithUser = {true};
ScanDetail[] scanDetails =
buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
securities, appInteractions, meteredness, priorities, uids,
packageNames, autojoin, shareWithUser);
// Link the scan result with suggestions.
linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
// setup config manager interactions.
suggestions[0].wns.wifiConfiguration.fromWifiNetworkSuggestion = true;
suggestions[0].wns.wifiConfiguration.ephemeral = true;
setupAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration);
// Mark the network disabled.
suggestions[0].wns.wifiConfiguration.getNetworkSelectionStatus().setNetworkSelectionStatus(
NETWORK_SELECTION_TEMPORARY_DISABLED);
// Existing network matching the credentials.
when(mWifiConfigManager.getConfiguredNetwork(suggestions[0].wns.wifiConfiguration.getKey()))
.thenReturn(suggestions[0].wns.wifiConfiguration);
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
mNetworkSuggestionNominator.nominateNetworks(
Arrays.asList(scanDetails), null, null, true, false,
(ScanDetail scanDetail, WifiConfiguration configuration) -> {
connectableNetworks.add(Pair.create(scanDetail, configuration));
});
assertTrue(connectableNetworks.isEmpty());
verify(mWifiConfigManager, times(suggestionSsids.length))
.isNetworkTemporarilyDisabledByUser(anyString());
verify(mWifiConfigManager).getConfiguredNetwork(eq(
suggestions[0].wns.wifiConfiguration.getKey()));
verify(mWifiConfigManager).tryEnableNetwork(eq(
suggestions[0].wns.wifiConfiguration.networkId));
// Verify we did not try to add any new networks or other interactions with
// WifiConfigManager.
verifyNoMoreInteractions(mWifiConfigManager);
}
/**
* Ensure that we do nominate the only matching network suggestion if the network configuration
* already exists (maybe saved or maybe it exists from a previous connection attempt) and a
* temporary blacklist expired.
*
* Expected connectable Networks: {suggestionSsids[0]}
*/
@Test
public void testSelectNetworkSuggestionForOneMatchForExistingNetworkButTempDisableExpired() {
String[] scanSsids = {"test1", "test2"};
String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
int[] freqs = {2470, 2437};
String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
int[] levels = {-67, -76};
String[] suggestionSsids = {"\"" + scanSsids[0] + "\""};
int[] securities = {SECURITY_PSK};
boolean[] appInteractions = {true};
boolean[] meteredness = {true};
int[] priorities = {-1};
int[] uids = {TEST_UID};
String[] packageNames = {TEST_PACKAGE};
boolean[] autojoin = {true};
boolean[] shareWithUser = {true};
ScanDetail[] scanDetails =
buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
securities, appInteractions, meteredness, priorities, uids,
packageNames, autojoin, shareWithUser);
// Link the scan result with suggestions.
linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
// setup config manager interactions.
suggestions[0].wns.wifiConfiguration.fromWifiNetworkSuggestion = true;
suggestions[0].wns.wifiConfiguration.ephemeral = true;
setupAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration);
// Mark the network disabled.
suggestions[0].wns.wifiConfiguration.getNetworkSelectionStatus().setNetworkSelectionStatus(
NETWORK_SELECTION_TEMPORARY_DISABLED);
// Existing network matching the credentials.
when(mWifiConfigManager.getConfiguredNetwork(suggestions[0].wns.wifiConfiguration.getKey()))
.thenReturn(suggestions[0].wns.wifiConfiguration);
when(mWifiConfigManager.tryEnableNetwork(suggestions[0].wns.wifiConfiguration.networkId))
.thenReturn(true);
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
mNetworkSuggestionNominator.nominateNetworks(
Arrays.asList(scanDetails), null, null, true, false,
(ScanDetail scanDetail, WifiConfiguration configuration) -> {
connectableNetworks.add(Pair.create(scanDetail, configuration));
});
validateConnectableNetworks(connectableNetworks, new String[] {scanSsids[0]});
verify(mWifiConfigManager, times(suggestionSsids.length))
.isNetworkTemporarilyDisabledByUser(anyString());
verify(mWifiConfigManager).getConfiguredNetwork(eq(
suggestions[0].wns.wifiConfiguration.getKey()));
verify(mWifiConfigManager).tryEnableNetwork(eq(
suggestions[0].wns.wifiConfiguration.networkId));
// Verify we did not try to add any new networks or other interactions with
// WifiConfigManager.
verifyNoMoreInteractions(mWifiConfigManager);
}
/**
* Ensure that we do nominate the only matching passponit network suggestion.
* Expected connectable Networks: {suggestionSsids[0]}
*/
@Test
public void testSuggestionPasspointNetworkCandidatesMatches() {
String[] scanSsids = {"test1", "test2"};
String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
int[] freqs = {2470, 2437};
String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
int[] levels = {-67, -76};
String[] suggestionSsids = {"\"" + scanSsids[0] + "\""};
int[] securities = {SECURITY_PSK};
boolean[] appInteractions = {true};
boolean[] meteredness = {true};
int[] priorities = {-1};
int[] uids = {TEST_UID};
String[] packageNames = {TEST_PACKAGE};
boolean[] autojoin = {true};
boolean[] shareWithUser = {true};
ScanDetail[] scanDetails =
buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
securities, appInteractions, meteredness, priorities, uids, packageNames,
autojoin, shareWithUser);
HashSet<ExtendedWifiNetworkSuggestion> matchedExtSuggestions = new HashSet<>();
matchedExtSuggestions.add(suggestions[0]);
List<Pair<ScanDetail, WifiConfiguration>> passpointCandidates = new ArrayList<>();
suggestions[0].wns.wifiConfiguration.FQDN = TEST_FQDN;
passpointCandidates.add(Pair.create(scanDetails[0], suggestions[0].wns.wifiConfiguration));
when(mPasspointNetworkNominateHelper
.getPasspointNetworkCandidates(Arrays.asList(scanDetails), true))
.thenReturn(passpointCandidates);
when(mWifiNetworkSuggestionsManager.getNetworkSuggestionsForFqdn(TEST_FQDN))
.thenReturn(matchedExtSuggestions);
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
mNetworkSuggestionNominator.nominateNetworks(
Arrays.asList(scanDetails), null, null, true, false,
(ScanDetail scanDetail, WifiConfiguration configuration) -> {
connectableNetworks.add(Pair.create(scanDetail, configuration));
});
assertEquals(1, connectableNetworks.size());
validateConnectableNetworks(connectableNetworks, new String[] {scanSsids[0]});
}
/**
* Ensure that we will not nominate the matching network suggestions which auto-join is
* disabled.
* Expected connectable Networks: {}
*/
@Test
public void testSelectNetworkSuggestionForOneMatchButAutojoinDisabled() {
String[] scanSsids = {"test1", "test2"};
String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
int[] freqs = {2470, 2437};
String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
int[] levels = {-67, -76};
String[] suggestionSsids = {"\"" + scanSsids[0] + "\"", "\"" + scanSsids[1] + "\""};
int[] securities = {SECURITY_PSK, SECURITY_PSK};
boolean[] appInteractions = {true, true};
boolean[] meteredness = {true, true};
int[] priorities = {-1, -1};
int[] uids = {TEST_UID, TEST_UID};
String[] packageNames = {TEST_PACKAGE, TEST_PACKAGE};
boolean[] autojoin = {false, false};
boolean[] shareWithUser = {true, false};
ScanDetail[] scanDetails =
buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
securities, appInteractions, meteredness, priorities, uids,
packageNames, autojoin, shareWithUser);
// Link the scan result with suggestions.
linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
// setup config manager interactions.
setupAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration,
suggestions[1].wns.wifiConfiguration);
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
mNetworkSuggestionNominator.nominateNetworks(
Arrays.asList(scanDetails), null, null, true, false,
(ScanDetail scanDetail, WifiConfiguration configuration) -> {
connectableNetworks.add(Pair.create(scanDetail, configuration));
});
// Verify no network is nominated.
assertTrue(connectableNetworks.isEmpty());
// Verify we only add network apps shared with user to WifiConfigManager
verifyAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration);
verify(mWifiConfigManager, never())
.addOrUpdateNetwork(argThat(new WifiConfigMatcher(
suggestions[1].wns.wifiConfiguration)), anyInt(), anyString());
}
@Test
public void testSelectNetworkSuggestionForOneMatchSimBasedWithNoSim() {
String[] scanSsids = {"test1"};
String[] bssids = {"6c:f3:7f:ae:8c:f3"};
int[] freqs = {2470};
String[] caps = {"[WPA2-EAP-CCMP][ESS]"};
int[] levels = {-67};
String[] suggestionSsids = {"\"" + scanSsids[0] + "\""};
int[] securities = {SECURITY_EAP};
boolean[] appInteractions = {true};
boolean[] meteredness = {true};
int[] priorities = {-1};
int[] uids = {TEST_UID};
String[] packageNames = {TEST_PACKAGE};
boolean[] autojoin = {true};
boolean[] shareWithUser = {true};
ScanDetail[] scanDetails =
buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
securities, appInteractions, meteredness, priorities, uids,
packageNames, autojoin, shareWithUser);
WifiConfiguration eapSimConfig = suggestions[0].wns.wifiConfiguration;
eapSimConfig.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM);
eapSimConfig.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE);
eapSimConfig.carrierId = TEST_CARRIER_ID;
when(mWifiCarrierInfoManager.getBestMatchSubscriptionId(eapSimConfig))
.thenReturn(TEST_SUB_ID);
when(mWifiCarrierInfoManager.isSimPresent(TEST_SUB_ID)).thenReturn(false);
// Link the scan result with suggestions.
linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
// setup config manager interactions.
setupAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration);
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
mNetworkSuggestionNominator.nominateNetworks(
Arrays.asList(scanDetails), null, null, true, false,
(ScanDetail scanDetail, WifiConfiguration configuration) -> {
connectableNetworks.add(Pair.create(scanDetail, configuration));
});
// Verify no network is nominated.
assertTrue(connectableNetworks.isEmpty());
verifyAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration);
}
@Test
public void testSelectNetworkSuggestionForOneMatchSimBasedWithEncryptionInfoNotAvailabele() {
String[] scanSsids = {"test1"};
String[] bssids = {"6c:f3:7f:ae:8c:f3"};
int[] freqs = {2470};
String[] caps = {"[WPA2-EAP-CCMP][ESS]"};
int[] levels = {-67};
String[] suggestionSsids = {"\"" + scanSsids[0] + "\""};
int[] securities = {SECURITY_EAP};
boolean[] appInteractions = {true};
boolean[] meteredness = {true};
int[] priorities = {-1};
int[] uids = {TEST_UID};
String[] packageNames = {TEST_PACKAGE};
boolean[] autojoin = {true};
boolean[] shareWithUser = {true};
ScanDetail[] scanDetails =
buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
securities, appInteractions, meteredness, priorities, uids,
packageNames, autojoin, shareWithUser);
WifiConfiguration eapSimConfig = suggestions[0].wns.wifiConfiguration;
eapSimConfig.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM);
eapSimConfig.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE);
eapSimConfig.carrierId = TEST_CARRIER_ID;
when(mWifiCarrierInfoManager.getBestMatchSubscriptionId(eapSimConfig))
.thenReturn(TEST_SUB_ID);
when(mWifiCarrierInfoManager.isSimPresent(TEST_SUB_ID)).thenReturn(true);
when(mWifiCarrierInfoManager.requiresImsiEncryption(TEST_SUB_ID)).thenReturn(true);
when(mWifiCarrierInfoManager.isImsiEncryptionInfoAvailable(TEST_SUB_ID)).thenReturn(false);
// Link the scan result with suggestions.
linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
// setup config manager interactions.
setupAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration);
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
mNetworkSuggestionNominator.nominateNetworks(
Arrays.asList(scanDetails), null, null, true, false,
(ScanDetail scanDetail, WifiConfiguration configuration) -> {
connectableNetworks.add(Pair.create(scanDetail, configuration));
});
// Verify no network is nominated.
assertTrue(connectableNetworks.isEmpty());
verifyAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration);
}
/**
* Ensure that we nominate the no matching network suggestion.
* Because the only matched suggestion is untrusted and untrusted is not allowed
* Expected connectable Networks: {}
*/
@Test
public void testSelectNetworkSuggestionForOneMatchUntrustedNotAllow() {
String[] scanSsids = {"test1", "test2"};
String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
int[] freqs = {2470, 2437};
String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
int[] levels = {-67, -76};
String[] suggestionSsids = {"\"" + scanSsids[0] + "\""};
int[] securities = {SECURITY_PSK};
boolean[] appInteractions = {true};
boolean[] meteredness = {true};
int[] priorities = {-1};
int[] uids = {TEST_UID};
String[] packageNames = {TEST_PACKAGE};
boolean[] autojoin = {true};
boolean[] shareWithUser = {true};
ScanDetail[] scanDetails =
buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
securities, appInteractions, meteredness, priorities, uids,
packageNames, autojoin, shareWithUser);
suggestions[0].wns.wifiConfiguration.trusted = false;
// Link the scan result with suggestions.
linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
mNetworkSuggestionNominator.nominateNetworks(
Arrays.asList(scanDetails), null, null, true, false,
(ScanDetail scanDetail, WifiConfiguration configuration) -> {
connectableNetworks.add(Pair.create(scanDetail, configuration));
});
assertTrue(connectableNetworks.isEmpty());
}
/**
* Ensure that we nominate the one matching network suggestion.
* Because the only matched suggestion is untrusted and untrusted is allowed
* Expected connectable Networks: {suggestionSsids[0]}
*/
@Test
public void testSelectNetworkSuggestionForOneMatchUntrustedAllow() {
String[] scanSsids = {"test1", "test2"};
String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
int[] freqs = {2470, 2437};
String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
int[] levels = {-67, -76};
String[] suggestionSsids = {"\"" + scanSsids[0] + "\""};
int[] securities = {SECURITY_PSK};
boolean[] appInteractions = {true};
boolean[] meteredness = {true};
int[] priorities = {-1};
int[] uids = {TEST_UID};
String[] packageNames = {TEST_PACKAGE};
boolean[] autojoin = {true};
boolean[] shareWithUser = {true};
ScanDetail[] scanDetails =
buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
securities, appInteractions, meteredness, priorities, uids,
packageNames, autojoin, shareWithUser);
suggestions[0].wns.wifiConfiguration.trusted = false;
// Link the scan result with suggestions.
linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
setupAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration);
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
mNetworkSuggestionNominator.nominateNetworks(
Arrays.asList(scanDetails), null, null, true, true,
(ScanDetail scanDetail, WifiConfiguration configuration) -> {
connectableNetworks.add(Pair.create(scanDetail, configuration));
});
validateConnectableNetworks(connectableNetworks, scanSsids[0]);
verifyAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration);
}
/**
* Ensure that we nominate the no matching network suggestion.
* Because the only matched suggestion is untrusted and untrusted is not allowed
* Expected connectable Networks: {}
*/
@Test
public void testSelectNetworkSuggestionForOneMatchMeteredNonDataSim() {
String[] scanSsids = {"test1", "test2"};
String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
int[] freqs = {2470, 2437};
String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
int[] levels = {-67, -76};
String[] suggestionSsids = {"\"" + scanSsids[0] + "\""};
int[] securities = {SECURITY_PSK};
boolean[] appInteractions = {true};
boolean[] meteredness = {true};
int[] priorities = {-1};
int[] uids = {TEST_UID};
String[] packageNames = {TEST_PACKAGE};
boolean[] autojoin = {true};
boolean[] shareWithUser = {true};
ScanDetail[] scanDetails =
buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
securities, appInteractions, meteredness, priorities, uids,
packageNames, autojoin, shareWithUser);
suggestions[0].wns.wifiConfiguration.meteredHint = true;
when(mWifiCarrierInfoManager.isCarrierNetworkFromNonDefaultDataSim(any())).thenReturn(true);
// Link the scan result with suggestions.
linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
mNetworkSuggestionNominator.nominateNetworks(
Arrays.asList(scanDetails), null, null, true, false,
(ScanDetail scanDetail, WifiConfiguration configuration) -> {
connectableNetworks.add(Pair.create(scanDetail, configuration));
});
assertTrue(connectableNetworks.isEmpty());
}
private void setupAddToWifiConfigManager(WifiConfiguration...candidates) {
for (int i = 0; i < candidates.length; i++) {
WifiConfiguration candidate = candidates[i];
// setup & verify the WifiConfigmanager interactions for adding/enabling the network.
when(mWifiConfigManager.addOrUpdateNetwork(
argThat(new WifiConfigMatcher(candidate)), anyInt(), anyString()))
.thenReturn(new NetworkUpdateResult(TEST_NETWORK_ID + i));
when(mWifiConfigManager.updateNetworkSelectionStatus(eq(TEST_NETWORK_ID + i), anyInt()))
.thenReturn(true);
candidate.networkId = TEST_NETWORK_ID + i;
when(mWifiConfigManager.getConfiguredNetwork(TEST_NETWORK_ID + i))
.thenReturn(candidate);
}
}
class WifiConfigMatcher implements ArgumentMatcher<WifiConfiguration> {
private final WifiConfiguration mConfig;
WifiConfigMatcher(WifiConfiguration config) {
assertNotNull(config);
mConfig = config;
}
@Override
public boolean matches(WifiConfiguration otherConfig) {
if (otherConfig == null) return false;
return mConfig.getKey().equals(otherConfig.getKey());
}
}
private void verifyAddToWifiConfigManager(WifiConfiguration...candidates) {
// check for any saved networks.
verify(mWifiConfigManager, atLeast(candidates.length)).getConfiguredNetwork(anyString());
ArgumentCaptor<WifiConfiguration> wifiConfigurationCaptor =
ArgumentCaptor.forClass(WifiConfiguration.class);
verify(mWifiConfigManager, times(candidates.length)).addOrUpdateNetwork(
wifiConfigurationCaptor.capture(), anyInt(), anyString());
verify(mWifiConfigManager, times(candidates.length)).allowAutojoin(anyInt(), anyBoolean());
for (int i = 0; i < candidates.length; i++) {
WifiConfiguration addedWifiConfiguration = null;
for (WifiConfiguration configuration : wifiConfigurationCaptor.getAllValues()) {
if (configuration.SSID.equals(candidates[i].SSID)) {
addedWifiConfiguration = configuration;
break;
}
}
assertNotNull(addedWifiConfiguration);
assertTrue(addedWifiConfiguration.ephemeral);
assertTrue(addedWifiConfiguration.fromWifiNetworkSuggestion);
}
verify(mWifiConfigManager, times(candidates.length)).updateNetworkSelectionStatus(
anyInt(), anyInt());
verify(mWifiConfigManager, times(candidates.length)).getConfiguredNetwork(anyInt());
}
/**
* Build an array of scanDetails based on the caller supplied network SSID, BSSID,
* frequency, capability and RSSI level information.
*/
private static ScanDetail[] buildScanDetails(String[] ssids, String[] bssids, int[] freqs,
String[] caps, int[] levels, Clock clock) {
if (ssids == null || ssids.length == 0) return new ScanDetail[0];
ScanDetail[] scanDetails = new ScanDetail[ssids.length];
long timeStamp = clock.getElapsedSinceBootMillis();
for (int index = 0; index < ssids.length; index++) {
scanDetails[index] = new ScanDetail(WifiSsid.createFromAsciiEncoded(ssids[index]),
bssids[index], caps[index], levels[index], freqs[index], timeStamp, 0);
}
return scanDetails;
}
/**
* Generate an array of {@link android.net.wifi.WifiConfiguration} based on the caller
* supplied network SSID and security information.
*/
private static WifiConfiguration[] buildWifiConfigurations(String[] ssids, int[] securities) {
if (ssids == null || ssids.length == 0) return new WifiConfiguration[0];
WifiConfiguration[] configs = new WifiConfiguration[ssids.length];
for (int index = 0; index < ssids.length; index++) {
configs[index] = generateWifiConfig(-1, 0, ssids[index], false, true, null,
null, securities[index]);
}
return configs;
}
private ExtendedWifiNetworkSuggestion[] buildNetworkSuggestions(
String[] ssids, int[] securities, boolean[] appInteractions, boolean[] meteredness,
int[] priorities, int[] uids, String[] packageNames, boolean[] autojoin,
boolean[] shareWithUser) {
WifiConfiguration[] configs = buildWifiConfigurations(ssids, securities);
ExtendedWifiNetworkSuggestion[] suggestions =
new ExtendedWifiNetworkSuggestion[configs.length];
for (int i = 0; i < configs.length; i++) {
configs[i].priority = priorities[i];
configs[i].creatorUid = uids[i];
configs[i].meteredOverride = meteredness[i]
? WifiConfiguration.METERED_OVERRIDE_METERED
: WifiConfiguration.METERED_OVERRIDE_NONE;
configs[i].creatorName = packageNames[i];
configs[i].ephemeral = true;
configs[i].fromWifiNetworkSuggestion = true;
PerAppInfo perAppInfo = new PerAppInfo(uids[i], packageNames[i], null);
WifiNetworkSuggestion suggestion =
new WifiNetworkSuggestion(configs[i], null, appInteractions[i], false,
shareWithUser[i], true);
suggestions[i] = new ExtendedWifiNetworkSuggestion(suggestion, perAppInfo, autojoin[i]);
}
return suggestions;
}
/**
* Link scan results to the network suggestions.
*
* The shorter of the 2 input params will be used to loop over so the inputs don't
* need to be of equal length.
* If there are more scan details than suggestions, the remaining
* scan details will be associated with a NULL suggestions.
* If there are more suggestions than scan details, the remaining
* suggestions will be associated with the last scan detail.
*/
private void linkScanDetailsWithNetworkSuggestions(
ScanDetail[] scanDetails, ExtendedWifiNetworkSuggestion[] suggestions) {
if (suggestions == null || scanDetails == null) {
return;
}
int minLength = Math.min(scanDetails.length, suggestions.length);
// 1 to 1 mapping from scan detail to suggestion.
for (int i = 0; i < minLength; i++) {
ScanDetail scanDetail = scanDetails[i];
final ExtendedWifiNetworkSuggestion matchingSuggestion = suggestions[i];
HashSet<ExtendedWifiNetworkSuggestion> matchingSuggestions =
new HashSet<ExtendedWifiNetworkSuggestion>() {{
add(matchingSuggestion);
}};
when(mWifiNetworkSuggestionsManager.getNetworkSuggestionsForScanDetail(eq(scanDetail)))
.thenReturn((matchingSuggestions));
}
if (scanDetails.length > suggestions.length) {
// No match for the remaining scan details.
for (int i = minLength; i < scanDetails.length; i++) {
ScanDetail scanDetail = scanDetails[i];
when(mWifiNetworkSuggestionsManager.getNetworkSuggestionsForScanDetail(
eq(scanDetail))).thenReturn(null);
}
} else if (suggestions.length > scanDetails.length) {
// All the additional suggestions match the last scan detail.
HashSet<ExtendedWifiNetworkSuggestion> matchingSuggestions = new HashSet<>();
for (int i = minLength; i < suggestions.length; i++) {
matchingSuggestions.add(suggestions[i]);
}
ScanDetail lastScanDetail = scanDetails[minLength - 1];
when(mWifiNetworkSuggestionsManager.getNetworkSuggestionsForScanDetail(
eq(lastScanDetail))).thenReturn((matchingSuggestions));
}
}
private void validateConnectableNetworks(List<Pair<ScanDetail, WifiConfiguration>> actual,
String...expectedSsids) {
Set<String> expectedSsidSet = new HashSet<>(Arrays.asList(expectedSsids));
assertEquals(expectedSsidSet.size(), actual.size());
for (Pair<ScanDetail, WifiConfiguration> candidate : actual) {
// check if the scan detail matches the wificonfiguration.
assertEquals("\"" + candidate.first.getSSID() + "\"", candidate.second.SSID);
// check if both match one of the expected ssid's.
assertTrue(expectedSsidSet.remove(candidate.first.getSSID()));
}
assertTrue(expectedSsidSet.isEmpty());
}
}