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

Commit 0b6b10d1 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fail safely on invalid ScanResults when creating NetworkKey"

parents 4b7a7bed fde900db
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 =