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

Commit 2b51cc30 authored by Jason Monk's avatar Jason Monk
Browse files

Fix crash from WPS

Also fix the tests to handle the new threadedness while here.

Bug: 20067687
Change-Id: I116bf14c71886b251c2e8bcaeb2c9b0e5f9ec817
parent cf304fb3
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -826,6 +826,9 @@ public class AccessPoint implements Comparable<AccessPoint> {
    }

    static String removeDoubleQuotes(String string) {
        if (TextUtils.isEmpty(string)) {
            return "";
        }
        int length = string.length();
        if ((length > 1) && (string.charAt(0) == '"')
                && (string.charAt(length - 1) == '"')) {
+9 −5
Original line number Diff line number Diff line
@@ -95,20 +95,20 @@ public class WifiTracker {
    public WifiTracker(Context context, WifiListener wifiListener, Looper workerLooper,
            boolean includeSaved, boolean includeScans, boolean includePasspoints) {
        this(context, wifiListener, workerLooper, includeSaved, includeScans, includePasspoints,
                (WifiManager) context.getSystemService(Context.WIFI_SERVICE));
                (WifiManager) context.getSystemService(Context.WIFI_SERVICE), Looper.myLooper());
    }

    @VisibleForTesting
    WifiTracker(Context context, WifiListener wifiListener, Looper workerLooper,
            boolean includeSaved, boolean includeScans, boolean includePasspoints,
            WifiManager wifiManager) {
            WifiManager wifiManager, Looper currentLooper) {
        if (!includeSaved && !includeScans) {
            throw new IllegalArgumentException("Must include either saved or scans");
        }
        mContext = context;
        mMainHandler = new MainHandler();
        mMainHandler = new MainHandler(currentLooper);
        mWorkHandler = new WorkHandler(
                workerLooper != null ? workerLooper : Looper.myLooper());
                workerLooper != null ? workerLooper : currentLooper);
        mWifiManager = wifiManager;
        mIncludeSaved = includeSaved;
        mIncludeScans = includeScans;
@@ -439,6 +439,10 @@ public class WifiTracker {
        private static final int MSG_WIFI_STATE_CHANGED = 1;
        private static final int MSG_ACCESS_POINT_CHANGED = 2;

        public MainHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            if (mListener == null) {
@@ -481,7 +485,7 @@ public class WifiTracker {

    @VisibleForTesting
    class Scanner extends Handler {
        private static final int MSG_SCAN = 0;
        static final int MSG_SCAN = 0;

        private int mRetry = 0;

+51 −13
Original line number Diff line number Diff line
@@ -23,9 +23,12 @@ import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiSsid;
import android.os.HandlerThread;
import android.os.Looper;
import android.util.Log;

import com.android.settingslib.BaseTest;
import com.android.settingslib.wifi.WifiTracker.Scanner;
import com.android.settingslib.wifi.WifiTracker.WifiListener;

import org.mockito.ArgumentCaptor;
@@ -54,13 +57,25 @@ public class WifiTrackerTest extends BaseTest {

    private WifiTracker mWifiTracker;

    private HandlerThread mWorkerThread;
    private Looper mLooper;
    private HandlerThread mMainThread;
    private Looper mMainLooper;

    @Override
    protected void setUp() throws Exception {
        super.setUp();

        mWifiManager = Mockito.mock(WifiManager.class);
        mWifiListener = Mockito.mock(WifiListener.class);
        mWifiTracker = new WifiTracker(mContext, mWifiListener, true, true, mWifiManager);
        mWorkerThread = new HandlerThread("TestHandlerThread");
        mWorkerThread.start();
        mLooper = mWorkerThread.getLooper();
        mMainThread = new HandlerThread("TestHandlerThread");
        mMainThread.start();
        mMainLooper = mMainThread.getLooper();
        mWifiTracker = new WifiTracker(mContext, mWifiListener, mLooper, true, true, true,
                mWifiManager, mMainLooper);
        mWifiTracker.mScanner = mWifiTracker.new Scanner();
        Mockito.when(mWifiManager.isWifiEnabled()).thenReturn(true);
    }
@@ -76,13 +91,14 @@ public class WifiTrackerTest extends BaseTest {
    }

    public void testAccessPointsCallback() {
        sendScanResultsAvailable();
        sendScanResultsAndProcess(false);

        Mockito.verify(mWifiListener, Mockito.atLeastOnce()).onAccessPointsChanged();
    }

    public void testConnectedCallback() {
        sendConnected();
        waitForThreads();

        Mockito.verify(mWifiListener, Mockito.atLeastOnce()).onConnectedChanged();
        assertEquals(true, mWifiTracker.isConnected());
@@ -94,6 +110,7 @@ public class WifiTrackerTest extends BaseTest {
        Intent i = new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION);
        i.putExtra(WifiManager.EXTRA_WIFI_STATE, TEST_WIFI_STATE);
        mWifiTracker.mReceiver.onReceive(mContext, i);
        waitForThreads();

        ArgumentCaptor<Integer> wifiState = ArgumentCaptor.forClass(Integer.class);
        Mockito.verify(mWifiListener, Mockito.atLeastOnce())
@@ -106,7 +123,7 @@ public class WifiTrackerTest extends BaseTest {
        // Make scans be successful.
        Mockito.when(mWifiManager.startScan()).thenReturn(true);

        mWifiTracker.mScanner.handleMessage(null);
        mWifiTracker.mScanner.handleMessage(mWifiTracker.mScanner.obtainMessage(Scanner.MSG_SCAN));
        Mockito.verify(mWifiManager, Mockito.atLeastOnce()).startScan();
    }

@@ -121,7 +138,7 @@ public class WifiTrackerTest extends BaseTest {
        // Send all of the configs and scan results to the tracker.
        Mockito.when(mWifiManager.getConfiguredNetworks()).thenReturn(wifiConfigs);
        Mockito.when(mWifiManager.getScanResults()).thenReturn(scanResults);
        sendScanResultsAvailable();
        sendScanResultsAndProcess(false);

        List<AccessPoint> accessPoints = mWifiTracker.getAccessPoints();
        assertEquals("Expected number of results", NUM_NETWORKS, accessPoints.size());
@@ -131,7 +148,8 @@ public class WifiTrackerTest extends BaseTest {
    }

    public void testSavedOnly() {
        mWifiTracker = new WifiTracker(mContext, mWifiListener, true, false, mWifiManager);
        mWifiTracker = new WifiTracker(mContext, mWifiListener, mLooper, true, false, true,
                mWifiManager, mMainLooper);
        mWifiTracker.mScanner = mWifiTracker.new Scanner();

        List<WifiConfiguration> wifiConfigs = new ArrayList<WifiConfiguration>();
@@ -144,7 +162,7 @@ public class WifiTrackerTest extends BaseTest {
        // Send all of the configs and scan results to the tracker.
        Mockito.when(mWifiManager.getConfiguredNetworks()).thenReturn(wifiConfigs);
        Mockito.when(mWifiManager.getScanResults()).thenReturn(scanResults);
        sendScanResultsAvailable();
        sendScanResultsAndProcess(false);

        List<AccessPoint> accessPoints = mWifiTracker.getAccessPoints();
        // Only expect the first two to come back in the results.
@@ -154,7 +172,8 @@ public class WifiTrackerTest extends BaseTest {
    }

    public void testAvailableOnly() {
        mWifiTracker = new WifiTracker(mContext, mWifiListener, false, true, mWifiManager);
        mWifiTracker = new WifiTracker(mContext, mWifiListener, mLooper, false, true, true,
                mWifiManager, mMainLooper);
        mWifiTracker.mScanner = mWifiTracker.new Scanner();

        List<WifiConfiguration> wifiConfigs = new ArrayList<WifiConfiguration>();
@@ -167,7 +186,7 @@ public class WifiTrackerTest extends BaseTest {
        // Send all of the configs and scan results to the tracker.
        Mockito.when(mWifiManager.getConfiguredNetworks()).thenReturn(wifiConfigs);
        Mockito.when(mWifiManager.getScanResults()).thenReturn(scanResults);
        sendScanResultsAvailable();
        sendScanResultsAndProcess(false);

        // Expect the last one (sorted order) to be left off since its only saved.
        List<AccessPoint> accessPoints = mWifiTracker.getAccessPoints();
@@ -178,12 +197,13 @@ public class WifiTrackerTest extends BaseTest {
    }

    public void testNonEphemeralConnected() {
        mWifiTracker = new WifiTracker(mContext, mWifiListener, false, true, mWifiManager);
        mWifiTracker = new WifiTracker(mContext, mWifiListener, mLooper, false, true, true,
                mWifiManager, mMainLooper);
        mWifiTracker.mScanner = mWifiTracker.new Scanner();

        List<WifiConfiguration> wifiConfigs = new ArrayList<WifiConfiguration>();
        List<ScanResult> scanResults = new ArrayList<ScanResult>();
        String[] expectedSsids = generateTestNetworks(wifiConfigs, scanResults, false);
        generateTestNetworks(wifiConfigs, scanResults, false);

        // Tell WifiTracker we are connected now.
        sendConnected();
@@ -191,9 +211,8 @@ public class WifiTrackerTest extends BaseTest {
        // Send all of the configs and scan results to the tracker.
        Mockito.when(mWifiManager.getConfiguredNetworks()).thenReturn(wifiConfigs);
        Mockito.when(mWifiManager.getScanResults()).thenReturn(scanResults);
        sendScanResultsAvailable();
        // Do this twice to catch a bug that was happening in the caching, making things ephemeral.
        sendScanResultsAvailable();
        sendScanResultsAndProcess(true);

        List<AccessPoint> accessPoints = mWifiTracker.getAccessPoints();
        assertEquals("Expected number of results", NUM_NETWORKS - 1, accessPoints.size());
@@ -299,9 +318,28 @@ public class WifiTrackerTest extends BaseTest {
        mWifiTracker.mReceiver.onReceive(mContext, intent);
    }

    private void sendScanResultsAvailable() {
    private void sendScanResultsAndProcess(boolean sendTwice) {
        Intent i = new Intent(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
        mWifiTracker.mReceiver.onReceive(mContext, i);
        if (sendTwice) {
            mWifiTracker.mReceiver.onReceive(mContext, i);
        }
        waitForThreads();
    }

    private void waitForThreads() {
        // Run all processing.
        mWorkerThread.quitSafely();
        try {
            mWorkerThread.join();
        } catch (InterruptedException e) {
        }
        // Send all callbacks.
        mMainThread.quitSafely();
        try {
            mMainThread.join();
        } catch (InterruptedException e) {
        }
    }

}