Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fde900db authored by Stephen Chen's avatar Stephen Chen
Browse files

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
parent 1534b978
Loading
Loading
Loading
Loading
+31 −6
Original line number Diff line number Diff line
@@ -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;
+78 −0
Original line number Diff line number Diff line
@@ -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);
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -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);
                }

+4 −1
Original line number Diff line number Diff line
@@ -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);
                }
            }
        }

+67 −0
Original line number Diff line number Diff line
@@ -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 =