blob: f53711701de8d58c8766e11dc266b24e2c417a62 [file] [log] [blame]
/*
* Copyright (C) 2016 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 junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import android.content.ContentResolver;
import android.content.Context;
import android.net.NetworkKey;
import android.net.NetworkScoreManager;
import android.net.RecommendationRequest;
import android.net.RecommendationResult;
import android.net.WifiKey;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiConfiguration.NetworkSelectionStatus;
import android.net.wifi.WifiSsid;
import android.os.Looper;
import android.os.Process;
import android.provider.Settings;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.ArraySet;
import android.util.LocalLog;
import android.util.Pair;
import com.android.server.wifi.util.ScanResultUtil;
import com.google.android.collect.Lists;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* Unit tests for {@link RecommendedNetworkEvaluator}.
*/
@SmallTest
public class RecommendedNetworkEvaluatorTest {
private ScanDetail mTrustedScanDetail;
private ScanDetail mUntrustedScanDetail;
private ScanDetail mEphemeralScanDetail;
private WifiConfiguration mTrustedWifiConfiguration;
private WifiConfiguration mUntrustedWifiConfiguration;
private WifiConfiguration mEphemeralWifiConfiguration;
@Mock private Context mContext;
@Mock private ContentResolver mContentResolver;
@Mock private FrameworkFacade mFrameworkFacade;
@Mock private NetworkScoreManager mNetworkScoreManager;
@Mock private WifiConfigManager mWifiConfigManager;
@Captor private ArgumentCaptor<NetworkKey[]> mNetworkKeyArrayCaptor;
@Captor private ArgumentCaptor<RecommendationRequest> mRecommendationRequestCaptor;
private RecommendedNetworkEvaluator mRecommendedNetworkEvaluator;
@Before
public void setUp() throws Exception {
mTrustedScanDetail = buildScanDetail("ssid");
mUntrustedScanDetail = buildScanDetail("ssid1");
mEphemeralScanDetail = buildScanDetail("ssid2");
mTrustedWifiConfiguration = new WifiConfiguration();
mTrustedWifiConfiguration.networkId = 5;
mTrustedWifiConfiguration.SSID = mTrustedScanDetail.getSSID();
mTrustedWifiConfiguration.BSSID = mTrustedScanDetail.getBSSIDString();
mTrustedWifiConfiguration.getNetworkSelectionStatus().setCandidate(
mTrustedScanDetail.getScanResult());
mUntrustedWifiConfiguration = new WifiConfiguration();
mUntrustedWifiConfiguration.networkId = 6;
mUntrustedWifiConfiguration.SSID = mUntrustedScanDetail.getSSID();
mUntrustedWifiConfiguration.BSSID = mUntrustedScanDetail.getBSSIDString();
mEphemeralWifiConfiguration = new WifiConfiguration();
mEphemeralWifiConfiguration.SSID = mEphemeralScanDetail.getSSID();
mEphemeralWifiConfiguration.BSSID = mEphemeralScanDetail.getBSSIDString();
mEphemeralWifiConfiguration.ephemeral = true;
MockitoAnnotations.initMocks(this);
when(mFrameworkFacade.getIntegerSetting(mContext,
Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0))
.thenReturn(1);
long dayMillis = TimeUnit.DAYS.toMillis(1);
when(mFrameworkFacade.getLongSetting(mContext,
Settings.Global.RECOMMENDED_NETWORK_EVALUATOR_CACHE_EXPIRY_MS, dayMillis))
.thenReturn(dayMillis);
mRecommendedNetworkEvaluator = new RecommendedNetworkEvaluator(mContext, mContentResolver,
Looper.getMainLooper(), mFrameworkFacade, mNetworkScoreManager,
mWifiConfigManager, new LocalLog(0));
reset(mNetworkScoreManager);
when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(mTrustedScanDetail))
.thenReturn(mTrustedWifiConfiguration);
when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(mUntrustedScanDetail))
.thenReturn(null);
when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(mEphemeralScanDetail))
.thenReturn(mEphemeralWifiConfiguration);
when(mWifiConfigManager.getConfiguredNetwork(mTrustedWifiConfiguration.networkId))
.thenReturn(mTrustedWifiConfiguration);
when(mWifiConfigManager.getSavedNetworks())
.thenReturn(Lists.newArrayList(mTrustedWifiConfiguration));
}
@Test
public void testUpdate_recommendationsDisabled() {
ArrayList<ScanDetail> scanDetails = new ArrayList<>();
when(mFrameworkFacade.getIntegerSetting(mContext,
Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0))
.thenReturn(0);
mRecommendedNetworkEvaluator.mContentObserver.onChange(false /* unused */);
mRecommendedNetworkEvaluator.update(scanDetails);
verifyZeroInteractions(mNetworkScoreManager);
verify(mWifiConfigManager).updateNetworkNotRecommended(
mTrustedWifiConfiguration.networkId, false /* notRecommended */);
}
@Test
public void testUpdate_emptyScanList() {
mRecommendedNetworkEvaluator.update(new ArrayList<ScanDetail>());
verifyZeroInteractions(mNetworkScoreManager);
verify(mWifiConfigManager).updateNetworkNotRecommended(
mTrustedWifiConfiguration.networkId, false /* notRecommended */);
}
@Test
public void testUpdate_allNetworksUnscored() {
mRecommendedNetworkEvaluator.update(Lists.newArrayList(mTrustedScanDetail,
mUntrustedScanDetail));
verify(mWifiConfigManager).updateNetworkNotRecommended(
mTrustedWifiConfiguration.networkId, false /* notRecommended */);
verify(mNetworkScoreManager).requestScores(mNetworkKeyArrayCaptor.capture());
assertEquals(2, mNetworkKeyArrayCaptor.getValue().length);
NetworkKey expectedNetworkKey = new NetworkKey(new WifiKey(ScanResultUtil.createQuotedSSID(
mTrustedScanDetail.getSSID()), mTrustedScanDetail.getBSSIDString()));
assertEquals(expectedNetworkKey, mNetworkKeyArrayCaptor.getValue()[0]);
expectedNetworkKey = new NetworkKey(new WifiKey(ScanResultUtil.createQuotedSSID(
mUntrustedScanDetail.getSSID()), mUntrustedScanDetail.getBSSIDString()));
assertEquals(expectedNetworkKey, mNetworkKeyArrayCaptor.getValue()[1]);
}
@Test
public void testUpdate_oneScored_twoScored() {
mRecommendedNetworkEvaluator.update(Lists.newArrayList(mUntrustedScanDetail));
// Next scan should only trigger a request for the trusted network.
mRecommendedNetworkEvaluator.update(
Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail));
verify(mWifiConfigManager, times(2)).updateNetworkNotRecommended(
mTrustedWifiConfiguration.networkId, false /* notRecommended */);
verify(mNetworkScoreManager, times(2)).requestScores(mNetworkKeyArrayCaptor.capture());
NetworkKey[] requestedScores = mNetworkKeyArrayCaptor.getAllValues().get(0);
assertEquals(1, requestedScores.length);
NetworkKey expectedNetworkKey = new NetworkKey(new WifiKey(ScanResultUtil.createQuotedSSID(
mUntrustedScanDetail.getSSID()), mUntrustedScanDetail.getBSSIDString()));
assertEquals(expectedNetworkKey, requestedScores[0]);
requestedScores = mNetworkKeyArrayCaptor.getAllValues().get(1);
assertEquals(1, requestedScores.length);
expectedNetworkKey = new NetworkKey(new WifiKey(ScanResultUtil.createQuotedSSID(
mTrustedScanDetail.getSSID()), mTrustedScanDetail.getBSSIDString()));
assertEquals(expectedNetworkKey, requestedScores[0]);
}
@Test
public void testEvaluateNetworks_recommendationsDisabled() {
when(mFrameworkFacade.getIntegerSetting(mContext,
Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0))
.thenReturn(0);
mRecommendedNetworkEvaluator.mContentObserver.onChange(false /* unused */);
mRecommendedNetworkEvaluator.evaluateNetworks(null, null, null, false, false, null);
verifyZeroInteractions(mWifiConfigManager, mNetworkScoreManager);
}
@Test
public void testEvaluateNetworks_emptyScanList() {
WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks(
new ArrayList<ScanDetail>(), null, null, false,
false /* untrustedNetworkAllowed */, null);
assertNull(result);
verifyZeroInteractions(mWifiConfigManager, mNetworkScoreManager);
}
@Test
public void testEvaluateNetworks_onlyTrustedNetworksAllowed_noTrustedInScanList() {
WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks(
Lists.newArrayList(mUntrustedScanDetail), null, null, false,
false /* untrustedNetworkAllowed */, null);
assertNull(result);
verifyZeroInteractions(mNetworkScoreManager);
}
@Test
public void testEvaluateNetworks_untrustedNetworksAllowed_onlyDeletedEphemeral() {
when(mWifiConfigManager.wasEphemeralNetworkDeleted(ScanResultUtil
.createQuotedSSID(mUntrustedScanDetail.getScanResult().SSID)))
.thenReturn(true);
WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks(
Lists.newArrayList(mUntrustedScanDetail), null, null, false,
true /* untrustedNetworkAllowed */, null);
assertNull(result);
verifyZeroInteractions(mNetworkScoreManager);
}
@Test
public void testEvaluateNetworks_recommendation_onlyTrustedNetworkAllowed() {
when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false);
when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class)))
.thenReturn(RecommendationResult
.createConnectRecommendation(mTrustedWifiConfiguration));
WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks(
Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail),
null, null, false, false /* untrustedNetworkAllowed */, null);
assertEquals(mTrustedWifiConfiguration, result);
verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture());
assertEquals(1, mRecommendationRequestCaptor.getValue().getScanResults().length);
assertEquals(mTrustedScanDetail.getScanResult(),
mRecommendationRequestCaptor.getValue().getScanResults()[0]);
verify(mWifiConfigManager).setNetworkCandidateScanResult(
mTrustedWifiConfiguration.networkId, mTrustedScanDetail.getScanResult(), 0);
}
@Test
public void testEvaluateNetworks_trustedRecommendation_untrustedNetworksAllowed() {
when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false);
when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class)))
.thenReturn(RecommendationResult
.createConnectRecommendation(mTrustedWifiConfiguration));
WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks(
Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail),
null, null, false, true /* untrustedNetworkAllowed */, null);
assertEquals(mTrustedWifiConfiguration, result);
verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture());
assertEquals(2, mRecommendationRequestCaptor.getValue().getScanResults().length);
assertEquals(mTrustedScanDetail.getScanResult(),
mRecommendationRequestCaptor.getValue().getScanResults()[0]);
assertEquals(mUntrustedScanDetail.getScanResult(),
mRecommendationRequestCaptor.getValue().getScanResults()[1]);
verify(mWifiConfigManager).setNetworkCandidateScanResult(
mTrustedWifiConfiguration.networkId, mTrustedScanDetail.getScanResult(), 0);
}
@Test
public void testEvaluateNetworks_trustedRecommendation_anyBssidSpecified() {
WifiConfiguration recommendedNetwork = new WifiConfiguration();
recommendedNetwork.SSID = mTrustedWifiConfiguration.SSID;
recommendedNetwork.BSSID = "any";
when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false);
when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class)))
.thenReturn(RecommendationResult.createConnectRecommendation(recommendedNetwork));
WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks(
Lists.newArrayList(mTrustedScanDetail),
null, null, false, false /* untrustedNetworkAllowed */, null);
assertEquals(mTrustedWifiConfiguration, result);
verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture());
assertEquals(1, mRecommendationRequestCaptor.getValue().getScanResults().length);
assertEquals(mTrustedScanDetail.getScanResult(),
mRecommendationRequestCaptor.getValue().getScanResults()[0]);
verify(mWifiConfigManager).setNetworkCandidateScanResult(
mTrustedWifiConfiguration.networkId, mTrustedScanDetail.getScanResult(), 0);
}
@Test
public void testEvaluateNetworks_untrustedRecommendation_untrustedNetworksAllowed() {
NetworkUpdateResult networkUpdateResult = new NetworkUpdateResult(10);
when(mWifiConfigManager.addOrUpdateNetwork(mUntrustedWifiConfiguration, Process.WIFI_UID))
.thenReturn(networkUpdateResult);
when(mWifiConfigManager.getConfiguredNetwork(networkUpdateResult.getNetworkId()))
.thenReturn(mUntrustedWifiConfiguration);
when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false);
when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class)))
.thenReturn(RecommendationResult
.createConnectRecommendation(mUntrustedWifiConfiguration));
WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks(
Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail),
null, null, false, true /* untrustedNetworkAllowed */, null);
assertEquals(mUntrustedWifiConfiguration, result);
assertNull(result.BSSID);
verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture());
assertEquals(2, mRecommendationRequestCaptor.getValue().getScanResults().length);
assertEquals(mTrustedScanDetail.getScanResult(),
mRecommendationRequestCaptor.getValue().getScanResults()[0]);
assertEquals(mUntrustedScanDetail.getScanResult(),
mRecommendationRequestCaptor.getValue().getScanResults()[1]);
verify(mWifiConfigManager).setNetworkCandidateScanResult(
networkUpdateResult.getNetworkId(), mUntrustedScanDetail.getScanResult(), 0);
verify(mWifiConfigManager, never()).updateNetworkSelectionStatus(anyInt(), anyInt());
}
@Test
public void testEvaluateNetworks_untrustedRecommendation_updateFailed() {
NetworkUpdateResult networkUpdateResult = new NetworkUpdateResult(
WifiConfiguration.INVALID_NETWORK_ID);
when(mWifiConfigManager.addOrUpdateNetwork(mUntrustedWifiConfiguration, Process.WIFI_UID))
.thenReturn(networkUpdateResult);
when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false);
when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class)))
.thenReturn(RecommendationResult
.createConnectRecommendation(mUntrustedWifiConfiguration));
WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks(
Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail),
null, null, false, true /* untrustedNetworkAllowed */, null);
assertNull(result);
verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture());
assertEquals(2, mRecommendationRequestCaptor.getValue().getScanResults().length);
assertEquals(mTrustedScanDetail.getScanResult(),
mRecommendationRequestCaptor.getValue().getScanResults()[0]);
assertEquals(mUntrustedScanDetail.getScanResult(),
mRecommendationRequestCaptor.getValue().getScanResults()[1]);
verify(mWifiConfigManager, never())
.setNetworkCandidateScanResult(anyInt(), any(ScanResult.class), anyInt());
}
@Test
public void testEvaluateNetworks_doNotConnectRecommendation_untrustedNetworksAllowed() {
when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false);
when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class)))
.thenReturn(RecommendationResult.createDoNotConnectRecommendation());
WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks(
Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail),
null, null, false, true /* untrustedNetworkAllowed */, null);
assertNull(result);
verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture());
assertEquals(2, mRecommendationRequestCaptor.getValue().getScanResults().length);
assertEquals(mTrustedScanDetail.getScanResult(),
mRecommendationRequestCaptor.getValue().getScanResults()[0]);
assertEquals(mUntrustedScanDetail.getScanResult(),
mRecommendationRequestCaptor.getValue().getScanResults()[1]);
verify(mWifiConfigManager)
.updateNetworkNotRecommended(mTrustedWifiConfiguration.networkId, true);
}
@Test
public void testEvaluateNetworks_nullRecommendation() {
when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false);
when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class)))
.thenReturn(null);
WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks(
Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail),
null, null, false, false /* untrustedNetworkAllowed */, null);
assertNull(result);
verify(mNetworkScoreManager).requestRecommendation(any(RecommendationRequest.class));
verify(mWifiConfigManager, never()).updateNetworkSelectionStatus(anyInt(), anyInt());
}
@Test
public void testEvaluateNetworks_requestContainsCurrentNetwork() {
when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false);
when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class)))
.thenReturn(RecommendationResult.createDoNotConnectRecommendation());
mRecommendedNetworkEvaluator.evaluateNetworks(
Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail),
mTrustedWifiConfiguration, null, false, true /* untrustedNetworkAllowed */, null);
verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture());
assertSame(mTrustedWifiConfiguration,
mRecommendationRequestCaptor.getValue().getConnectedConfig());
verify(mWifiConfigManager)
.updateNetworkNotRecommended(mTrustedWifiConfiguration.networkId, true);
}
@Test
public void testEvaluateNetworks_requestConnectableNetworks() {
when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false);
when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class)))
.thenReturn(RecommendationResult.createDoNotConnectRecommendation());
mRecommendedNetworkEvaluator.evaluateNetworks(
Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail,
mEphemeralScanDetail),
null, null, false, true /* untrustedNetworkAllowed */, null);
verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture());
RecommendationRequest request = mRecommendationRequestCaptor.getValue();
assertEquals(2, request.getConnectableConfigs().length);
Set<String> ssids = new ArraySet<>();
for (WifiConfiguration config : request.getConnectableConfigs()) {
ssids.add(config.SSID);
}
Set<String> expectedSsids = new ArraySet<>();
expectedSsids.add(mTrustedWifiConfiguration.SSID);
expectedSsids.add(mEphemeralWifiConfiguration.SSID);
assertEquals(expectedSsids, ssids);
}
@Test
public void testEvaluateNetworks_requestConnectableNetworks_filterDisabledNetworks() {
WifiConfiguration disabledWifiConfiguration = mTrustedWifiConfiguration;
disabledWifiConfiguration.getNetworkSelectionStatus().setNetworkSelectionStatus(
NetworkSelectionStatus.NETWORK_SELECTION_TEMPORARY_DISABLED);
when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(mTrustedScanDetail))
.thenReturn(disabledWifiConfiguration);
when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class)))
.thenReturn(RecommendationResult.createDoNotConnectRecommendation());
mRecommendedNetworkEvaluator.evaluateNetworks(
Lists.newArrayList(mTrustedScanDetail, mEphemeralScanDetail),
null, null, false, true /* untrustedNetworkAllowed */, null);
verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture());
RecommendationRequest request = mRecommendationRequestCaptor.getValue();
assertEquals(1, request.getConnectableConfigs().length);
assertEquals(mEphemeralWifiConfiguration, request.getConnectableConfigs()[0]);
}
@Test
public void testEvaluateNetworks_scanResultMarkedAsUntrusted_configIsEphemeral() {
when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false);
when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class)))
.thenReturn(RecommendationResult.createDoNotConnectRecommendation());
mRecommendedNetworkEvaluator.evaluateNetworks(Lists.newArrayList(mEphemeralScanDetail),
null, null, false, true /* untrustedNetworkAllowed */, null);
verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture());
RecommendationRequest request = mRecommendationRequestCaptor.getValue();
assertEquals(1, request.getScanResults().length);
assertTrue(request.getScanResults()[0].untrusted);
}
@Test
public void testEvaluateNetworks_potentialConnectableNetworksPopulated() {
when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false);
when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class)))
.thenReturn(RecommendationResult.createDoNotConnectRecommendation());
List<Pair<ScanDetail, WifiConfiguration>> potentialConnectableNetworks = new ArrayList<>();
mRecommendedNetworkEvaluator.evaluateNetworks(
Lists.newArrayList(mTrustedScanDetail, mEphemeralScanDetail,
mUntrustedScanDetail), null, null, false,
true /* untrustedNetworkAllowed */, potentialConnectableNetworks);
assertEquals(3, potentialConnectableNetworks.size());
Pair<ScanDetail, WifiConfiguration> expectedTrustedPair =
Pair.create(mTrustedScanDetail, mTrustedWifiConfiguration);
Pair<ScanDetail, WifiConfiguration> expectedUntrustedPair =
Pair.create(mUntrustedScanDetail, null);
Pair<ScanDetail, WifiConfiguration> expectedEphemPair =
Pair.create(mEphemeralScanDetail, mEphemeralWifiConfiguration);
assertTrue(potentialConnectableNetworks.contains(expectedTrustedPair));
assertTrue(potentialConnectableNetworks.contains(expectedUntrustedPair));
assertTrue(potentialConnectableNetworks.contains(expectedEphemPair));
}
@Test
public void testEvaluateNetworks_potentialConnectableNetworksIsNull() {
when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false);
when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class)))
.thenReturn(RecommendationResult.createDoNotConnectRecommendation());
mRecommendedNetworkEvaluator.evaluateNetworks(
Lists.newArrayList(mTrustedScanDetail, mEphemeralScanDetail,
mUntrustedScanDetail),
null, null, false, true /* untrustedNetworkAllowed */, null);
// should not throw a NPE.
}
@Test
public void testEvaluateNetworks_requestContainsLastSelectedNetwork() {
int lastSelectedNetworkId = 5;
long lastSelectedTimestamp = 1000;
when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false);
when(mWifiConfigManager.getLastSelectedNetwork()).thenReturn(lastSelectedNetworkId);
when(mWifiConfigManager.getLastSelectedTimeStamp()).thenReturn(lastSelectedTimestamp);
mRecommendedNetworkEvaluator.evaluateNetworks(Lists.newArrayList(mTrustedScanDetail),
null, null, false, false /* untrustedNetworkAllowed */, null);
verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture());
RecommendationRequest request = mRecommendationRequestCaptor.getValue();
assertEquals(lastSelectedNetworkId, request.getLastSelectedNetworkId());
assertEquals(lastSelectedTimestamp, request.getLastSelectedNetworkTimestamp());
}
private static ScanDetail buildScanDetail(String ssid) {
return new ScanDetail(WifiSsid.createFromAsciiEncoded(ssid),
"00:00:00:00:00:00", "", 0, 0, 0, 0);
}
}