Fail safely on invalid ScanResults when creating NetworkKey

Added tests for NetworkKey#createFromScanResult

Bug: 34671341
Test: runtest --path
frameworks/base/core/tests/coretests/src/android/net/NetworkKeyTest.java
runtest --path
frameworks/base/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java

Change-Id: Ideac1615917649cd3934421228a82aeed37e7ad1
This commit is contained in:
Stephen Chen
2017-02-14 16:40:21 -08:00
parent 1534b978fd
commit fde900dbbd
5 changed files with 181 additions and 8 deletions

View File

@@ -24,6 +24,7 @@ import android.net.wifi.WifiSsid;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import android.util.Log;
import java.util.Objects;
@@ -41,6 +42,8 @@ import java.util.Objects;
// etc.) so that clients can pull out these details depending on the type of network.
public class NetworkKey implements Parcelable {
private static final String TAG = "NetworkKey";
/** A wifi network, for which {@link #wifiKey} will be populated. */
public static final int TYPE_WIFI = 1;
@@ -59,13 +62,28 @@ public class NetworkKey implements Parcelable {
/**
* Constructs a new NetworkKey for the given wifi {@link ScanResult}.
*
* @throws IllegalArgumentException if the given ScanResult is malformed
* @return A new {@link NetworkKey} instance or <code>null</code> if the given
* {@link ScanResult} instance is malformed.
* @hide
*/
public static NetworkKey createFromScanResult(ScanResult result) {
return new NetworkKey(
new WifiKey(
'"' + result.wifiSsid.toString() + '"', result.BSSID));
@Nullable
public static NetworkKey createFromScanResult(@Nullable ScanResult result) {
if (result != null && result.wifiSsid != null) {
final String ssid = result.wifiSsid.toString();
final String bssid = result.BSSID;
if (!TextUtils.isEmpty(ssid) && !ssid.equals(WifiSsid.NONE)
&& !TextUtils.isEmpty(bssid)) {
WifiKey wifiKey;
try {
wifiKey = new WifiKey(String.format("\"%s\"", ssid), bssid);
} catch (IllegalArgumentException e) {
Log.e(TAG, "Unable to create WifiKey.", e);
return null;
}
return new NetworkKey(wifiKey);
}
}
return null;
}
/**
@@ -83,7 +101,14 @@ public class NetworkKey implements Parcelable {
final String bssid = wifiInfo.getBSSID();
if (!TextUtils.isEmpty(ssid) && !ssid.equals(WifiSsid.NONE)
&& !TextUtils.isEmpty(bssid)) {
return new NetworkKey(new WifiKey(ssid, bssid));
WifiKey wifiKey;
try {
wifiKey = new WifiKey(ssid, bssid);
} catch (IllegalArgumentException e) {
Log.e(TAG, "Unable to create WifiKey.", e);
return null;
}
return new NetworkKey(wifiKey);
}
}
return null;

View File

@@ -4,6 +4,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.when;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiSsid;
import android.support.test.runner.AndroidJUnit4;
@@ -17,7 +18,9 @@ import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class)
public class NetworkKeyTest {
private static final String VALID_SSID = "\"ssid1\"";
private static final String VALID_UNQUOTED_SSID = "ssid1";
private static final String VALID_BSSID = "00:00:00:00:00:00";
private static final String INVALID_BSSID = "invalid_bssid";
@Mock private WifiInfo mWifiInfo;
@Before
@@ -63,6 +66,13 @@ public class NetworkKeyTest {
assertNull(NetworkKey.createFromWifiInfo(mWifiInfo));
}
@Test
public void createFromWifi_invalidBssid() throws Exception {
when(mWifiInfo.getSSID()).thenReturn(VALID_SSID);
when(mWifiInfo.getBSSID()).thenReturn(INVALID_BSSID);
assertNull(NetworkKey.createFromWifiInfo(mWifiInfo));
}
@Test
public void createFromWifi_validWifiInfo() throws Exception {
when(mWifiInfo.getSSID()).thenReturn(VALID_SSID);
@@ -72,4 +82,72 @@ public class NetworkKeyTest {
final NetworkKey actual = NetworkKey.createFromWifiInfo(mWifiInfo);
assertEquals(expected, actual);
}
@Test
public void createFromScanResult_nullInput() {
assertNull(NetworkKey.createFromScanResult(null));
}
@Test
public void createFromScanResult_nullWifiSsid() {
ScanResult scanResult = new ScanResult();
scanResult.BSSID = VALID_BSSID;
assertNull(NetworkKey.createFromScanResult(scanResult));
}
@Test
public void createFromScanResult_emptyWifiSsid() {
ScanResult scanResult = new ScanResult();
scanResult.wifiSsid = WifiSsid.createFromAsciiEncoded("");
scanResult.BSSID = VALID_BSSID;
assertNull(NetworkKey.createFromScanResult(scanResult));
}
@Test
public void createFromScanResult_noneWifiSsid() {
ScanResult scanResult = new ScanResult();
scanResult.wifiSsid = WifiSsid.createFromAsciiEncoded(WifiSsid.NONE);
scanResult.BSSID = VALID_BSSID;
assertNull(NetworkKey.createFromScanResult(scanResult));
}
@Test
public void createFromScanResult_nullBssid() {
ScanResult scanResult = new ScanResult();
scanResult.wifiSsid = WifiSsid.createFromAsciiEncoded(VALID_UNQUOTED_SSID);
assertNull(NetworkKey.createFromScanResult(scanResult));
}
@Test
public void createFromScanResult_emptyBssid() {
ScanResult scanResult = new ScanResult();
scanResult.wifiSsid = WifiSsid.createFromAsciiEncoded(VALID_UNQUOTED_SSID);
scanResult.BSSID = "";
assertNull(NetworkKey.createFromScanResult(scanResult));
}
@Test
public void createFromScanResult_invalidBssid() {
ScanResult scanResult = new ScanResult();
scanResult.wifiSsid = WifiSsid.createFromAsciiEncoded(VALID_UNQUOTED_SSID);
scanResult.BSSID = INVALID_BSSID;
assertNull(NetworkKey.createFromScanResult(scanResult));
}
@Test
public void createFromScanResult_validWifiSsid() {
ScanResult scanResult = new ScanResult();
scanResult.wifiSsid = WifiSsid.createFromAsciiEncoded(VALID_UNQUOTED_SSID);
scanResult.BSSID = VALID_BSSID;
NetworkKey expected = new NetworkKey(new WifiKey(VALID_SSID, VALID_BSSID));
NetworkKey actual = NetworkKey.createFromScanResult(scanResult);
assertEquals(expected, actual);
}
}

View File

@@ -510,7 +510,7 @@ public class WifiTracker {
}
NetworkKey key = NetworkKey.createFromScanResult(result);
if (!mRequestedScores.contains(key)) {
if (key != null && !mRequestedScores.contains(key)) {
scoresToRequest.add(key);
}

View File

@@ -603,7 +603,10 @@ public class NetworkScoreService extends INetworkScoreService.Stub {
mScanResultKeys = new ArraySet<>(size);
for (int i = 0; i < size; i++) {
ScanResult scanResult = scanResults.get(i);
mScanResultKeys.add(NetworkKey.createFromScanResult(scanResult));
NetworkKey key = NetworkKey.createFromScanResult(scanResult);
if (key != null) {
mScanResultKeys.add(key);
}
}
}

View File

@@ -117,6 +117,7 @@ public class NetworkScoreServiceTest {
private static final String SSID = "ssid";
private static final String SSID_2 = "ssid_2";
private static final String SSID_3 = "ssid_3";
private static final String INVALID_BSSID = "invalid_bssid";
private static final ComponentName RECOMMENDATION_SERVICE_COMP =
new ComponentName("newPackageName", "newScoringServiceClass");
private static final ScoredNetwork SCORED_NETWORK =
@@ -777,6 +778,54 @@ public class NetworkScoreServiceTest {
assertTrue(actualList.isEmpty());
}
@Test
public void testCurrentNetworkScoreCacheFilter_invalidWifiInfo_nullSsid() throws Exception {
when(mWifiInfo.getSSID()).thenReturn(null);
NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
List<ScoredNetwork> actualList =
cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
assertTrue(actualList.isEmpty());
}
@Test
public void testCurrentNetworkScoreCacheFilter_invalidWifiInfo_noneSsid() throws Exception {
when(mWifiInfo.getSSID()).thenReturn(WifiSsid.NONE);
NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
List<ScoredNetwork> actualList =
cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
assertTrue(actualList.isEmpty());
}
@Test
public void testCurrentNetworkScoreCacheFilter_invalidWifiInfo_emptySsid() throws Exception {
when(mWifiInfo.getSSID()).thenReturn("");
NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
List<ScoredNetwork> actualList =
cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
assertTrue(actualList.isEmpty());
}
@Test
public void testCurrentNetworkScoreCacheFilter_invalidWifiInfo_invalidBssid() throws Exception {
when(mWifiInfo.getBSSID()).thenReturn(INVALID_BSSID);
NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
List<ScoredNetwork> actualList =
cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
assertTrue(actualList.isEmpty());
}
@Test
public void testCurrentNetworkScoreCacheFilter_scoreFiltered() throws Exception {
NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
@@ -812,6 +861,24 @@ public class NetworkScoreServiceTest {
assertTrue(actualList.isEmpty());
}
@Test
public void testScanResultsScoreCacheFilter_invalidScanResults() throws Exception {
List<ScanResult> invalidScanResults = Lists.newArrayList(
new ScanResult(),
createScanResult("", SCORED_NETWORK.networkKey.wifiKey.bssid),
createScanResult(WifiSsid.NONE, SCORED_NETWORK.networkKey.wifiKey.bssid),
createScanResult(SSID, null),
createScanResult(SSID, INVALID_BSSID)
);
NetworkScoreService.ScanResultsScoreCacheFilter cacheFilter =
new NetworkScoreService.ScanResultsScoreCacheFilter(() -> invalidScanResults);
List<ScoredNetwork> actualList =
cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
assertTrue(actualList.isEmpty());
}
@Test
public void testScanResultsScoreCacheFilter_scoresFiltered() throws Exception {
NetworkScoreService.ScanResultsScoreCacheFilter cacheFilter =