109abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne/*
209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne * Copyright (C) 2016 The Android Open Source Project
309abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne *
409abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne * Licensed under the Apache License, Version 2.0 (the "License");
509abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne * you may not use this file except in compliance with the License.
609abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne * You may obtain a copy of the License at
709abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne *
809abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne *      http://www.apache.org/licenses/LICENSE-2.0
909abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne *
1009abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne * Unless required by applicable law or agreed to in writing, software
1109abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne * distributed under the License is distributed on an "AS IS" BASIS,
1209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1309abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne * See the License for the specific language governing permissions and
1409abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne * limitations under the License.
1509abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne */
1609abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne
1709abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhnepackage com.android.server.wifi;
1809abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne
1909abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhneimport static org.junit.Assert.assertEquals;
2091a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silbersteinimport static org.junit.Assert.assertTrue;
215f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhneimport static org.mockito.Mockito.*;
2211ad3437e833ead2c7c235f173824db16ee4ea02Rebecca Silbersteinimport static org.mockito.MockitoAnnotations.*;
2309abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne
2409abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhneimport android.net.wifi.WifiConfiguration;
2509abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhneimport android.net.wifi.WifiSsid;
2609abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhneimport android.test.suitebuilder.annotation.SmallTest;
2709abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhneimport android.util.Pair;
2809abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne
2909abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhneimport org.junit.Before;
3009abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhneimport org.junit.Test;
3111ad3437e833ead2c7c235f173824db16ee4ea02Rebecca Silbersteinimport org.mockito.Mock;
3209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne
3309abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhneimport java.util.ArrayList;
3409abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhneimport java.util.Arrays;
3509abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhneimport java.util.List;
3609abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne
3709abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne/**
3809abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne * Unit tests for {@link com.android.server.wifi.WifiLastResortWatchdog}.
3909abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne */
4009abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne@SmallTest
4109abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhnepublic class WifiLastResortWatchdogTest {
4209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    WifiLastResortWatchdog mLastResortWatchdog;
4311ad3437e833ead2c7c235f173824db16ee4ea02Rebecca Silberstein    @Mock WifiMetrics mWifiMetrics;
4496a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius    @Mock SelfRecovery mSelfRecovery;
458fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    private String[] mSsids = {"\"test1\"", "\"test2\"", "\"test3\"", "\"test4\""};
468fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    private String[] mBssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4", "de:ad:ba:b1:e5:55",
478fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            "c0:ff:ee:ee:e3:ee"};
488fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    private int[] mFrequencies = {2437, 5180, 5180, 2437};
498fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    private String[] mCaps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]",
508fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            "[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
518fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    private int[] mLevels = {-60, -86, -50, -62};
528fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    private boolean[] mIsEphemeral = {false, false, false, false};
538fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    private boolean[] mHasEverConnected = {false, false, false, false};
548fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
5509abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    @Before
5609abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    public void setUp() throws Exception {
5711ad3437e833ead2c7c235f173824db16ee4ea02Rebecca Silberstein        initMocks(this);
5896a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius        mLastResortWatchdog = new WifiLastResortWatchdog(mSelfRecovery, mWifiMetrics);
5909abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    }
6009abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne
6109abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    private List<Pair<ScanDetail, WifiConfiguration>> createFilteredQnsCandidates(String[] ssids,
6209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne            String[] bssids, int[] frequencies, String[] caps, int[] levels,
6309abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne            boolean[] isEphemeral) {
6409abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = new ArrayList<>();
6509abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        long timeStamp = System.currentTimeMillis();
6609abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        for (int index = 0; index < ssids.length; index++) {
678fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            String ssid = ssids[index].replaceAll("^\"+", "").replaceAll("\"+$", "");
688fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            ScanDetail scanDetail = new ScanDetail(WifiSsid.createFromAsciiEncoded(ssid),
698fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    bssids[index], caps[index], levels[index], frequencies[index], timeStamp,
708fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    0);
7109abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne            WifiConfiguration config = null;
7209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne            if (!isEphemeral[index]) {
7309abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne                config = mock(WifiConfiguration.class);
7409abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne                WifiConfiguration.NetworkSelectionStatus networkSelectionStatus =
7509abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne                        mock(WifiConfiguration.NetworkSelectionStatus.class);
7609abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne                when(config.getNetworkSelectionStatus()).thenReturn(networkSelectionStatus);
7709abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne                when(networkSelectionStatus.getHasEverConnected()).thenReturn(true);
7809abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne            }
7909abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne            candidates.add(Pair.create(scanDetail, config));
8009abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        }
8109abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        return candidates;
8209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    }
8309abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne
848fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    private List<Pair<ScanDetail, WifiConfiguration>> createFilteredQnsCandidates(String[] ssids,
858fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            String[] bssids, int[] frequencies, String[] caps, int[] levels,
868fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            boolean[] isEphemeral, boolean[] hasEverConnected) {
878fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates =
888fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                new ArrayList<Pair<ScanDetail, WifiConfiguration>>();
898fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        long timeStamp = System.currentTimeMillis();
908fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int index = 0; index < ssids.length; index++) {
918fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            String ssid = ssids[index].replaceAll("^\"+", "").replaceAll("\"+$", "");
928fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            ScanDetail scanDetail = new ScanDetail(WifiSsid.createFromAsciiEncoded(ssid),
938fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    bssids[index], caps[index], levels[index], frequencies[index], timeStamp,
948fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    0);
958fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            WifiConfiguration config = null;
968fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            if (!isEphemeral[index]) {
978fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                config = mock(WifiConfiguration.class);
988fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                WifiConfiguration.NetworkSelectionStatus networkSelectionStatus =
998fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                        mock(WifiConfiguration.NetworkSelectionStatus.class);
1008fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                when(config.getNetworkSelectionStatus()).thenReturn(networkSelectionStatus);
1018fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                when(networkSelectionStatus.getHasEverConnected())
1028fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                        .thenReturn(hasEverConnected[index]);
1038fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            }
1048fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            candidates.add(Pair.create(scanDetail, config));
1058fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
1068fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        return candidates;
1078fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    }
1088fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
1098fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    private void assertFailureCountEquals(
1108fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            String bssid, int associationRejections, int authenticationFailures, int dhcpFailures) {
1118fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertEquals(associationRejections, mLastResortWatchdog.getFailureCount(bssid,
1128fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION));
1138fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertEquals(authenticationFailures, mLastResortWatchdog.getFailureCount(bssid,
1148fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION));
1158fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertEquals(dhcpFailures, mLastResortWatchdog.getFailureCount(bssid,
1168fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                WifiLastResortWatchdog.FAILURE_CODE_DHCP));
1178fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    }
1188fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
11909abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    /**
12009abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     * Case #1: Test aging works in available network buffering
12109abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     * This test simulates 4 networks appearing in a scan result, and then only the first 2
12209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     * appearing in successive scans results.
12309abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     * Expected Behavior:
12409abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     * 4 networks appear in recentAvailalbeNetworks, after N=MAX_BSSID_AGE scans, only 2 remain
12509abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     */
12609abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    @Test
12709abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    public void testAvailableNetworkBuffering_ageCullingWorks() throws Exception {
12809abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
1298fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
1308fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral);
13109abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
13209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        assertEquals(mLastResortWatchdog.getRecentAvailableNetworks().size(), 4);
13309abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne
13409abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        // Repeatedly buffer candidates 1 & 2, MAX_BSSID_AGE - 1 times
1358fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        candidates = createFilteredQnsCandidates(Arrays.copyOfRange(mSsids, 0, 2),
1368fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                Arrays.copyOfRange(mBssids, 0, 2),
1378fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                Arrays.copyOfRange(mFrequencies, 0, 2),
1388fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                Arrays.copyOfRange(mCaps, 0, 2),
1398fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                Arrays.copyOfRange(mLevels, 0, 2),
1408fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                Arrays.copyOfRange(mIsEphemeral, 0, 2));
14109abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        for (int i = 0; i < WifiLastResortWatchdog.MAX_BSSID_AGE - 1; i++) {
14209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne            mLastResortWatchdog.updateAvailableNetworks(candidates);
1438fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(mLastResortWatchdog.getRecentAvailableNetworks().get(mBssids[0]).age, 0);
1448fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(mLastResortWatchdog.getRecentAvailableNetworks().get(mBssids[1]).age, 0);
1458fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(mLastResortWatchdog.getRecentAvailableNetworks().get(mBssids[2]).age,
1468fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    i + 1);
1478fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(mLastResortWatchdog.getRecentAvailableNetworks().get(mBssids[3]).age,
1488fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    i + 1);
14909abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        }
15009abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        assertEquals(mLastResortWatchdog.getRecentAvailableNetworks().size(), 4);
15109abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne
15209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        // One more buffering should age and cull candidates 2 & 3
15309abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
15409abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        assertEquals(mLastResortWatchdog.getRecentAvailableNetworks().size(), 2);
15509abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    };
15609abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne
15709abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    /**
15809abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     * Case #2: Culling of old networks
15909abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     * Part 1:
16009abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     * This test starts with 4 networks seen, it then buffers N=MAX_BSSID_AGE empty scans
16109abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     * Expected behaviour: All networks are culled from recentAvailableNetworks
16209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     *
16309abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     * Part 2:
16409abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     * Buffer some more empty scans just to make sure nothing breaks
16509abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     */
16609abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    @Test
16709abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    public void testAvailableNetworkBuffering_emptyBufferWithEmptyScanResults() throws Exception {
16809abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
1698fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
1708fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral);
17109abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
17209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        assertEquals(mLastResortWatchdog.getRecentAvailableNetworks().size(), 4);
17309abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne
17409abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        // Repeatedly buffer with no candidates
1758fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        candidates = createFilteredQnsCandidates(Arrays.copyOfRange(mSsids, 0, 0),
1768fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                Arrays.copyOfRange(mBssids, 0, 0),
1778fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                Arrays.copyOfRange(mFrequencies, 0, 0),
1788fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                Arrays.copyOfRange(mCaps, 0, 0),
1798fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                Arrays.copyOfRange(mLevels, 0, 0),
1808fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                Arrays.copyOfRange(mIsEphemeral, 0, 0));
18109abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        for (int i = 0; i < WifiLastResortWatchdog.MAX_BSSID_AGE; i++) {
18209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne            mLastResortWatchdog.updateAvailableNetworks(candidates);
18309abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        }
18409abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        assertEquals(mLastResortWatchdog.getRecentAvailableNetworks().size(), 0);
18509abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        for (int i = 0; i < WifiLastResortWatchdog.MAX_BSSID_AGE; i++) {
18609abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne            mLastResortWatchdog.updateAvailableNetworks(candidates);
18709abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        }
18809abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        assertEquals(mLastResortWatchdog.getRecentAvailableNetworks().size(), 0);
18909abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    };
19009abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne
19109abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    /**
1928fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Case 3: Adding more networks over time
1938fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * In this test, each successive (4 total) scan result buffers one more network.
1948fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Expected behavior: recentAvailableNetworks grows with number of scan results
19509abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     */
19609abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    @Test
19709abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    public void testAvailableNetworkBuffering_addNewNetworksOverTime() throws Exception {
19809abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates;
19909abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        // Buffer (i) scan results with each successive scan result
2008fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 1; i <= mSsids.length; i++) {
2018fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            candidates = createFilteredQnsCandidates(Arrays.copyOfRange(mSsids, 0, i),
2028fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    Arrays.copyOfRange(mBssids, 0, i),
2038fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    Arrays.copyOfRange(mFrequencies, 0, i),
2048fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    Arrays.copyOfRange(mCaps, 0, i),
2058fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    Arrays.copyOfRange(mLevels, 0, i),
2068fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    Arrays.copyOfRange(mIsEphemeral, 0, i));
20709abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne            mLastResortWatchdog.updateAvailableNetworks(candidates);
20809abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne            assertEquals(mLastResortWatchdog.getRecentAvailableNetworks().size(), i);
20909abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne            for (int j = 0; j < i; j++) {
21009abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne                assertEquals(
2118fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                        mLastResortWatchdog.getRecentAvailableNetworks().get(mBssids[j]).age, 0);
21209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne            }
21309abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        }
21409abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    };
21509abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne
21609abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    /**
21709abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     *  Case 4: Test buffering with ephemeral networks & toString()
21809abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     *  This test is the same as Case 1, but it also includes ephemeral networks. toString is also
21909abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     *  smoke tested at various places in this test
22009abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     *  Expected behaviour: 4 networks added initially (2 ephemeral). After MAX_BSSID_AGE more
22109abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     *  bufferings, 2 are culled (leaving 1 ephemeral, one normal). toString method should execute
22209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     *  without breaking anything.
22309abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne     */
22409abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    @Test
22509abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    public void testAvailableNetworkBuffering_multipleNetworksSomeEphemeral() throws Exception {
22609abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        boolean[] isEphemeral = {true, false, true, false};
22709abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne
22809abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
2298fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
2308fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, isEphemeral);
23109abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
23209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        assertEquals(mLastResortWatchdog.getRecentAvailableNetworks().size(), 4);
23309abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne
23409abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        // Repeatedly buffer candidates 1 & 2, MAX_BSSID_AGE - 1 times
2358fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        candidates = createFilteredQnsCandidates(Arrays.copyOfRange(mSsids, 0, 2),
2368fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                Arrays.copyOfRange(mBssids, 0, 2),
2378fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                Arrays.copyOfRange(mFrequencies, 0, 2),
2388fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                Arrays.copyOfRange(mCaps, 0, 2),
2398fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                Arrays.copyOfRange(mLevels, 0, 2),
24009abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne                Arrays.copyOfRange(isEphemeral, 0, 2));
24109abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        for (int i = 0; i < WifiLastResortWatchdog.MAX_BSSID_AGE - 1; i++) {
24209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne            mLastResortWatchdog.updateAvailableNetworks(candidates);
24309abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne            mLastResortWatchdog.toString();
2448fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(mLastResortWatchdog.getRecentAvailableNetworks().get(mBssids[0]).age, 0);
2458fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(mLastResortWatchdog.getRecentAvailableNetworks().get(mBssids[1]).age, 0);
2468fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(mLastResortWatchdog.getRecentAvailableNetworks().get(mBssids[2]).age,
2478fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    i + 1);
2488fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(mLastResortWatchdog.getRecentAvailableNetworks().get(mBssids[3]).age,
2498fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    i + 1);
25009abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        }
25109abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        assertEquals(mLastResortWatchdog.getRecentAvailableNetworks().size(), 4);
25209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne
25309abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        // One more buffering should age and cull candidates 2 & 3
25409abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
25509abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        assertEquals(mLastResortWatchdog.getRecentAvailableNetworks().size(), 2);
25609abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne        mLastResortWatchdog.toString();
25709abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne    };
2588fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
2598fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    /**
2608fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Case 5: Test failure counting, incrementing a specific BSSID
2618fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Test has 4 networks buffered, increment each different failure type on one of them
2628fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Expected behaviour: See failure counts for the specific failures rise to the appropriate
2638fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * level for the specific network
2648fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     */
2658fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    @Test
2668fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    public void testFailureCounting_countFailuresForSingleBssid() throws Exception {
2678fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int associationRejections = 5;
2688fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int authenticationFailures = 9;
2698fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int dhcpFailures = 11;
2708fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
2718fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
2728fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, mHasEverConnected);
2738fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
2748fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
2758fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Ensure new networks have zero'ed failure counts
2768fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < mSsids.length; i++) {
2778fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertFailureCountEquals(mBssids[i], 0, 0, 0);
2788fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
2798fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
2808fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        //Increment failure count for each network and failure type
2818fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int net = 0;
2828fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < associationRejections; i++) {
2838fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
2848fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
2858fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(i + 1, mLastResortWatchdog.getRecentAvailableNetworks()
2868fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    .get(mBssids[net]).associationRejection);
2878fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
2888fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 1;
2898fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < authenticationFailures; i++) {
2908fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
2918fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
2928fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(i + 1, mLastResortWatchdog.getRecentAvailableNetworks()
2938fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    .get(mBssids[net]).authenticationFailure);
2948fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
2958fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 2;
2968fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < dhcpFailures; i++) {
2978fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
2988fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_DHCP);
2998fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(i + 1, mLastResortWatchdog.getRecentAvailableNetworks()
3008fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    .get(mBssids[net]).dhcpFailure);
3018fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
3028fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[0], associationRejections, 0, 0);
3038fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[1], 0, authenticationFailures, 0);
3048fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[2], 0, 0, dhcpFailures);
3058fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[3], 0, 0, 0);
3068fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    }
3078fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
3088fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    /**
3098fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Case 6: Test failure counting, incrementing a specific BSSID, with some ephemeral networks
3108fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Almost identical to test case 5.
3118fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Test has 4 networks buffered (two are ephemeral), increment each different failure type on
3128fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * one of them.
3138fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Expected behavior: See failure counts for the specific failures rise to the appropriate
3148fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * level for the specific network
3158fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     */
3168fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    @Test
3178fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    public void testFailureCounting_countFailuresForSingleBssidWithEphemeral() throws Exception {
3188fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int associationRejections = 5;
3198fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int authenticationFailures = 9;
3208fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int dhcpFailures = 11;
3218fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        boolean[] mIsEphemeral = {false, true, false, true};
3228fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
3238fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
3248fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, mHasEverConnected);
3258fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
3268fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
3278fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Ensure new networks have zero'ed failure counts
3288fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < mSsids.length; i++) {
3298fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertFailureCountEquals(mBssids[i], 0, 0, 0);
3308fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
3318fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
3328fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        //Increment failure count for each network and failure type
3338fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int net = 0;
3348fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < associationRejections; i++) {
3358fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
3368fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
3378fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(mLastResortWatchdog.getRecentAvailableNetworks()
3388fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    .get(mBssids[net]).associationRejection, i + 1);
3398fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
3408fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 1;
3418fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < authenticationFailures; i++) {
3428fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
3438fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
3448fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(mLastResortWatchdog.getRecentAvailableNetworks()
3458fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    .get(mBssids[net]).authenticationFailure, i + 1);
3468fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
3478fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 2;
3488fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < dhcpFailures; i++) {
3498fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
3508fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_DHCP);
3518fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(mLastResortWatchdog.getRecentAvailableNetworks()
3528fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    .get(mBssids[net]).dhcpFailure, i + 1);
3538fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
3548fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[0], associationRejections, 0, 0);
3558fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[1], 0, authenticationFailures, 0);
3568fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[2], 0, 0, dhcpFailures);
3578fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[3], 0, 0, 0);
3588fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    }
3598fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
3608fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    /**
3618fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Case 7: Test failure counting, incrementing a specific BSSID but with the wrong SSID given
3628fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Test has 4 networks buffered, increment each different failure type on one of them but using
3638fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * the wrong ssid.
3648fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Expected behavior: Failure counts will remain at zero for all networks
3658fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     */
3668fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    @Test
3678fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    public void testFailureCounting_countFailuresForSingleBssidWrongSsid() throws Exception {
3688fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        String badSsid = "ItHertzWhenIP";
3698fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int associationRejections = 5;
3708fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int authenticationFailures = 9;
3718fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int dhcpFailures = 11;
3728fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
3738fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
3748fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, mHasEverConnected);
3758fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
3768fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
3778fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Ensure new networks have zero'ed failure counts
3788fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < mSsids.length; i++) {
3798fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertFailureCountEquals(mBssids[i], 0, 0, 0);
3808fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
3818fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
3828fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        //Increment failure count for each network and failure type
3838fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int net = 0;
3848fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < associationRejections; i++) {
3858fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(badSsid, mBssids[net],
3868fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
3878fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
3888fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 1;
3898fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < authenticationFailures; i++) {
3908fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(badSsid, mBssids[net],
3918fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
3928fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
3938fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 2;
3948fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < dhcpFailures; i++) {
3958fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(badSsid, mBssids[net],
3968fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_DHCP);
3978fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
3988fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
3998fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Ensure all networks still have zero failure count
4008fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < mSsids.length; i++) {
4018fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertFailureCountEquals(mBssids[i], 0, 0, 0);
4028fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
4038fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    }
4048fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
4058fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    /**
4068fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Case 8: Test failure counting, increment a bssid that does not exist
4078fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Test has 4 networks buffered, increment each failure type, but using the wrong bssid
4088fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Expected behavior: Failure counts will remain at zero for all networks
4098fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     */
4108fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    @Test
4118fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    public void testFailureCounting_countFailuresForNonexistentBssid() throws Exception {
4128fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        String badBssid = "de:ad:be:ee:e3:ef";
4138fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int associationRejections = 5;
4148fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int authenticationFailures = 9;
4158fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int dhcpFailures = 11;
4168fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
4178fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
4188fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, mHasEverConnected);
4198fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
4208fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
4218fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Ensure new networks have zero'ed failure counts
4228fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < mSsids.length; i++) {
4238fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertFailureCountEquals(mBssids[i], 0, 0, 0);
4248fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
4258fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
4268fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        //Increment failure count for each network and failure type
4278fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int net = 0;
4288fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < associationRejections; i++) {
4298fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], badBssid,
4308fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
4318fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
4328fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 1;
4338fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < authenticationFailures; i++) {
4348fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], badBssid,
4358fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
4368fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
4378fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 2;
4388fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < dhcpFailures; i++) {
4398fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], badBssid,
4408fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_DHCP);
4418fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
4428fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
4438fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Ensure all networks still have zero failure count
4448fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < mSsids.length; i++) {
4458fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertFailureCountEquals(mBssids[i], 0, 0, 0);
4468fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
4478fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    }
4488fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
4498fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    /**
4508fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Case 9: Test Failure Counting, using the "Any" BSSID
45183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Test has 4 buffered networks, two of which share the same SSID (different mBssids)
4528fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Each failure type is incremented for the shared SSID, but with BSSID "any"
4538fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Expected Behavior: Both networks increment their counts in tandem
4548fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     */
4558fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    @Test
4568fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    public void testFailureCounting_countFailuresForAnyBssid() throws Exception {
4578fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        String[] ssids = {"\"test1\"", "\"test2\"", "\"test1\"", "\"test4\""};
4588fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int associationRejections = 5;
4598fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int authenticationFailures = 9;
4608fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int dhcpFailures = 11;
4618fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
4628fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(ssids,
4638fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, mHasEverConnected);
4648fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
4658fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
4668fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Ensure new networks have zero'ed failure counts
4678fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < ssids.length; i++) {
4688fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertFailureCountEquals(mBssids[i], 0, 0, 0);
4698fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
4708fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
4718fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        //Increment failure count for each network and failure type
4728fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int net = 0;
4738fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < associationRejections; i++) {
4748fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
4758fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    ssids[0], WifiLastResortWatchdog.BSSID_ANY,
4768fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
4778fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
4788fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 1;
4798fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < authenticationFailures; i++) {
4808fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
4818fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    ssids[0], WifiLastResortWatchdog.BSSID_ANY,
4828fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
4838fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
4848fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 2;
4858fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < dhcpFailures; i++) {
4868fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
4878fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    ssids[0], WifiLastResortWatchdog.BSSID_ANY,
4888fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_DHCP);
4898fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
4908fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[0], associationRejections, authenticationFailures,
4918fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                dhcpFailures);
4928fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[1], 0, 0, 0);
4938fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[2], associationRejections, authenticationFailures,
4948fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                dhcpFailures);
4958fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[3], 0, 0, 0);
4968fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    }
4978fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
4988fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    /**
4998fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Case 10: Test Failure Counting, using the "Any" BSSID for nonexistent SSID
5008fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Test has 4 buffered networks, two of which share the same SSID (different mBssids)
5018fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Each failure type is incremented for a bad SSID (doesn't exist), but with BSSID "any"
5028fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Expected Behavior: No Failures counted
5038fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     */
5048fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    @Test
5058fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    public void testFailureCounting_countFailuresForAnyBssidNonexistentSsid() throws Exception {
5068fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int associationRejections = 5;
5078fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int authenticationFailures = 9;
5088fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int dhcpFailures = 11;
5098fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        String badSsid = "DropItLikeIt'sHotSpot";
5108fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
5118fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
5128fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, mHasEverConnected);
5138fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
5148fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
5158fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Ensure new networks have zero'ed failure counts
5168fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < mSsids.length; i++) {
5178fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertFailureCountEquals(mBssids[i], 0, 0, 0);
5188fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
5198fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
5208fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        //Increment failure count for each network and failure type
5218fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int net = 0;
5228fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < associationRejections; i++) {
5238fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
5248fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    badSsid, WifiLastResortWatchdog.BSSID_ANY,
5258fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
5268fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
5278fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 1;
5288fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < authenticationFailures; i++) {
5298fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
5308fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    badSsid, WifiLastResortWatchdog.BSSID_ANY,
5318fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
5328fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
5338fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 2;
5348fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < dhcpFailures; i++) {
5358fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
5368fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    badSsid, WifiLastResortWatchdog.BSSID_ANY,
5378fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_DHCP);
5388fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
5398fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Check that all network failure counts are still zero
5408fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < mSsids.length; i++) {
5418fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertFailureCountEquals(mBssids[i], 0, 0, 0);
5428fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
5438fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    }
5448fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
5458fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    /**
5468fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Case 11: Test Failure Counting, over failure Threshold check
5478fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Test has 4 buffered networks, cause FAILURE_THRESHOLD failures for each failure type to one
5488fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * of each network (leaving one unfailed).
5498fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Expected Behavior: 3 of the Available Networks report OverFailureThreshold
5508fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     */
5518fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    @Test
5528fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    public void testFailureCounting_failureOverThresholdCheck() throws Exception {
5538fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int associationRejections = WifiLastResortWatchdog.FAILURE_THRESHOLD;
5548fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int authenticationFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD;
5558fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int dhcpFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD;
5568fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
5578fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
5588fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, mHasEverConnected);
5598fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
5608fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
5618fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Ensure new networks have zero'ed failure counts
5628fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < mSsids.length; i++) {
5638fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertFailureCountEquals(mBssids[i], 0, 0, 0);
5648fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
5658fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
5668fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        //Increment failure count for each network and failure type
5678fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int net = 0;
5688fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < associationRejections; i++) {
5698fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
5708fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
5718fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
5728fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 1;
5738fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < authenticationFailures; i++) {
5748fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
5758fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
5768fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
5778fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 2;
5788fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < dhcpFailures; i++) {
5798fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
5808fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_DHCP);
5818fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
5828fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertEquals(true, mLastResortWatchdog.isOverFailureThreshold(mBssids[0]));
5838fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertEquals(true, mLastResortWatchdog.isOverFailureThreshold(mBssids[1]));
5848fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertEquals(true, mLastResortWatchdog.isOverFailureThreshold(mBssids[2]));
5858fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertEquals(false, mLastResortWatchdog.isOverFailureThreshold(mBssids[3]));
5868fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    }
5878fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
5888fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    /**
5898fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Case 12: Test Failure Counting, under failure Threshold check
5908fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Test has 4 buffered networks, cause FAILURE_THRESHOLD - 1 failures for each failure type to
5918fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * one of each network (leaving one unfailed).
5928fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Expected Behavior: 0 of the Available Networks report OverFailureThreshold
5938fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     */
5948fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    @Test
5958fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    public void testFailureCounting_failureUnderThresholdCheck() throws Exception {
5968fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int associationRejections = WifiLastResortWatchdog.FAILURE_THRESHOLD - 1;
5978fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int authenticationFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD - 1;
5988fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int dhcpFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD - 1;
5998fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
6008fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
6018fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, mHasEverConnected);
6028fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
6038fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
6048fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Ensure new networks have zero'ed failure counts
6058fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < mSsids.length; i++) {
6068fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertFailureCountEquals(mBssids[i], 0, 0, 0);
6078fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
6088fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
6098fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        //Increment failure count for each network and failure type
6108fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int net = 0;
6118fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < associationRejections; i++) {
6128fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
6138fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
6148fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
6158fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 1;
6168fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < authenticationFailures; i++) {
6178fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
6188fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
6198fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
6208fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 2;
6218fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < dhcpFailures; i++) {
6228fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
6238fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_DHCP);
6248fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
6258fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertEquals(false, mLastResortWatchdog.isOverFailureThreshold(mBssids[0]));
6268fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertEquals(false, mLastResortWatchdog.isOverFailureThreshold(mBssids[1]));
6278fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertEquals(false, mLastResortWatchdog.isOverFailureThreshold(mBssids[2]));
6288fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertEquals(false, mLastResortWatchdog.isOverFailureThreshold(mBssids[3]));
6298fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    }
6308fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
6318fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    /**
6328fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Case 13: Test Failure Counting, available network buffering does not affect counts
6338fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * In this test:
6348fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     *   4 networks are buffered
6358fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     *   Some number of failures are counted
6368fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     *   networks are buffered again
6378fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Expected Behavior: Failure counts are not modified by buffering
6388fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     */
6398fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    @Test
64083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    public void testAvailableNetworkBuffering_doesNotAffectFailureCounts() throws Exception {
6418fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int associationRejections = 5;
6428fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int authenticationFailures = 9;
6438fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int dhcpFailures = 11;
6448fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
6458fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
6468fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, mHasEverConnected);
6478fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
6488fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
6498fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Ensure new networks have zero'ed failure counts
6508fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < mSsids.length; i++) {
6518fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertFailureCountEquals(mBssids[i], 0, 0, 0);
6528fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
6538fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
6548fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        //Increment failure count for each network and failure type
6558fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int net = 0;
6568fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < associationRejections; i++) {
6578fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
6588fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
6598fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(i + 1, mLastResortWatchdog.getRecentAvailableNetworks()
6608fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    .get(mBssids[net]).associationRejection);
6618fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
6628fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 1;
6638fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < authenticationFailures; i++) {
6648fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
6658fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
6668fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(i + 1, mLastResortWatchdog.getRecentAvailableNetworks()
6678fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    .get(mBssids[net]).authenticationFailure);
6688fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
6698fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 2;
6708fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < dhcpFailures; i++) {
6718fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
6728fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_DHCP);
6738fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(i + 1, mLastResortWatchdog.getRecentAvailableNetworks()
6748fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    .get(mBssids[net]).dhcpFailure);
6758fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
6768fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Check Each Network has appropriate failure count
6778fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[0], associationRejections, 0, 0);
6788fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[1], 0, authenticationFailures, 0);
6798fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[2], 0, 0, dhcpFailures);
6808fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[3], 0, 0, 0);
6818fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
6828fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Re-buffer all networks
6838fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < WifiLastResortWatchdog.MAX_BSSID_AGE; i++) {
6848fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.updateAvailableNetworks(candidates);
6858fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
6868fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
6878fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Check Each Network still has appropriate failure count
6888fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[0], associationRejections, 0, 0);
6898fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[1], 0, authenticationFailures, 0);
6908fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[2], 0, 0, dhcpFailures);
6918fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[3], 0, 0, 0);
6928fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    }
6938fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
6948fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    /**
6958fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Case 14: Test Failure Counting, culling of an old network will remove its failure counts
6968fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * In this test:
6978fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     *   4 networks are buffered
6988fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     *   Some number of failures are counted for all networks
6998fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     *   3 of the networks are buffered until the 4th dies of old age
7008fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     *   The 4th network is re-buffered
7018fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Expected Behavior: Failure counts for the 4th network are cleared after re-buffering
7028fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     */
7038fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    @Test
70483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    public void testAvailableNetworkBuffering_rebufferWipesCounts() throws Exception {
7058fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int associationRejections = 5;
7068fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int authenticationFailures = 9;
7078fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int dhcpFailures = 11;
7088fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
7098fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
7108fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, mHasEverConnected);
7118fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
7128fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
7138fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Ensure new networks have zero'ed failure counts
7148fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < mSsids.length; i++) {
7158fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertFailureCountEquals(mBssids[i], 0, 0, 0);
7168fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
7178fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
7188fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        //Increment failure count for each network and failure type
7198fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int net = 0;
7208fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < associationRejections; i++) {
7218fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
7228fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
7238fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(i + 1, mLastResortWatchdog.getRecentAvailableNetworks()
7248fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    .get(mBssids[net]).associationRejection);
7258fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
7268fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 1;
7278fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < authenticationFailures; i++) {
7288fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
7298fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
7308fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(i + 1, mLastResortWatchdog.getRecentAvailableNetworks()
7318fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    .get(mBssids[net]).authenticationFailure);
7328fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
7338fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 2;
7348fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < dhcpFailures; i++) {
7358fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
7368fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_DHCP);
7378fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertEquals(i + 1, mLastResortWatchdog.getRecentAvailableNetworks()
7388fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    .get(mBssids[net]).dhcpFailure);
7398fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
7408fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Check Each Network has appropriate failure count
7418fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[0], associationRejections, 0, 0);
7428fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[1], 0, authenticationFailures, 0);
7438fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[2], 0, 0, dhcpFailures);
7448fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[3], 0, 0, 0);
7458fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
7468fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Re-buffer all networks except 'test1' until it dies of old age
7478fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        candidates = createFilteredQnsCandidates(Arrays.copyOfRange(mSsids, 1, 4),
7488fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                Arrays.copyOfRange(mBssids, 1, 4),
7498fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                Arrays.copyOfRange(mFrequencies, 1, 4),
7508fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                Arrays.copyOfRange(mCaps, 1, 4),
7518fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                Arrays.copyOfRange(mLevels, 1, 4),
7528fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                Arrays.copyOfRange(mIsEphemeral, 1, 4));
7538fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < WifiLastResortWatchdog.MAX_BSSID_AGE; i++) {
7548fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.updateAvailableNetworks(candidates);
7558fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
7568fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertEquals(3, mLastResortWatchdog.getRecentAvailableNetworks().size());
7578fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Re-buffer All networks, with 'test1' again
7588fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        candidates = createFilteredQnsCandidates(mSsids,
7598fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, mHasEverConnected);
7608fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
7618fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
7628fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Check Each Network has appropriate failure count (network 1 should be zero'd)
7638fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[0], 0, 0, 0);
7648fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[1], 0, authenticationFailures, 0);
7658fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[2], 0, 0, dhcpFailures);
7668fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(mBssids[3], 0, 0, 0);
7678fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    }
7688fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
7698fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    /**
7708fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Case 26: Test Failure Counting, null failure incrementation
7718fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * In this test:
7728fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     *   4 networks are buffered
7738fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     *   Attempt to increment failures with null BSSID & SSID
7748fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Expected behavior: Nothing breaks, no counts incremented
7758fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     */
7768fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    @Test
7778fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    public void testFailureCounting_nullInputsNoBreaky() {
7788fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int associationRejections = 5;
7798fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int authenticationFailures = 9;
7808fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int dhcpFailures = 11;
7818fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
7828fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
7838fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, mHasEverConnected);
7848fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
7858fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
7868fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Ensure new networks have zero'ed failure counts
7878fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < mSsids.length; i++) {
7888fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertFailureCountEquals(mBssids[i], 0, 0, 0);
7898fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
7908fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
7918fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        //Increment failure count for each network and failure type
7928fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int net = 0;
7938fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < associationRejections; i++) {
7948fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(null, mBssids[net],
7958fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
7968fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
7978fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 1;
7988fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < authenticationFailures; i++) {
7998fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], null,
8008fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
8018fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
8028fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        net = 2;
8038fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < dhcpFailures; i++) {
8048fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(null, null,
8058fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_DHCP);
8068fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
8078fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
8088fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Ensure new networks have zero'ed failure counts
8098fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < mSsids.length; i++) {
8108fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertFailureCountEquals(mBssids[i], 0, 0, 0);
8118fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
8128fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    }
8138fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
8148fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    /**
8158fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Case 27: Test Failure Counting, test all failures are counted across SSID
8168fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * In this test there are 8 networks,
8178fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * the first 4 networks have unique SSIDs amongst themselves,
8188fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * the last 4 networks share these SSIDs respectively, so there are 2 networks per SSID
8198fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * In this test we increment failure counts for the 'test1' ssid for a specific BSSID, and for
8208fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * the 'test2' ssid for BSSID_ANY.
8218fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * Expected behaviour: Failure counts for both networks on the same SSID are mirrored via both
8228fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     * incrementation methods
8238fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne     */
8248fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    @Test
8258fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    public void testFailureCounting_countFailuresAcrossSsids() throws Exception {
8268fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        String[] ssids = {"\"test1\"", "\"test2\"", "\"test3\"", "\"test4\"",
8278fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                "\"test1\"", "\"test2\"", "\"test3\"", "\"test4\""};
8288fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4", "de:ad:ba:b1:e5:55",
8298fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                "c0:ff:ee:ee:e3:ee", "6c:f3:7f:ae:3c:f3", "6c:f3:7f:ae:3c:f4", "d3:ad:ba:b1:35:55",
8308fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                "c0:ff:ee:ee:33:ee"};
8318fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int[] frequencies = {2437, 5180, 5180, 2437, 2437, 5180, 5180, 2437};
8328fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]",
8338fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                "[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]",
8348fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                "[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
8358fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int[] levels = {-60, -86, -50, -62, -60, -86, -50, -62};
8368fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        boolean[] isEphemeral = {false, false, false, false, false, false, false, false};
8378fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        boolean[] hasEverConnected = {false, false, false, false, false, false, false,
8388fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                false};
8398fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int firstNetFails = 13;
8408fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        int secondNetFails = 8;
8418fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
8428fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(ssids,
8438fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                bssids, frequencies, caps, levels, isEphemeral, hasEverConnected);
8448fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
8458fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
8468fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        // Ensure new networks have zero'ed failure counts
8478fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < ssids.length; i++) {
8488fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            assertFailureCountEquals(bssids[i], 0, 0, 0);
8498fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
8508fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne
8518fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        //Increment failure count for the first test network ssid & bssid
8528fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < firstNetFails; i++) {
8538fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
8548fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    ssids[0], bssids[0], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
8558fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
8568fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    ssids[0], bssids[0], WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
8578fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
8588fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    ssids[0], bssids[0], WifiLastResortWatchdog.FAILURE_CODE_DHCP);
8598fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
8608fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        //Increment failure count for the first test network ssid & BSSID_ANY
8618fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        for (int i = 0; i < secondNetFails; i++) {
8628fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
8638fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    ssids[1], WifiLastResortWatchdog.BSSID_ANY,
8648fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
8658fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
8668fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    ssids[1], WifiLastResortWatchdog.BSSID_ANY,
8678fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
8688fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
8698fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    ssids[1], WifiLastResortWatchdog.BSSID_ANY,
8708fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_DHCP);
8718fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        }
8728fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(bssids[0], firstNetFails, firstNetFails, firstNetFails);
8738fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(bssids[1], secondNetFails, secondNetFails, secondNetFails);
8748fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(bssids[2], 0, 0, 0);
8758fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(bssids[3], 0, 0, 0);
8768fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(bssids[4], firstNetFails, firstNetFails, firstNetFails);
8778fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(bssids[5], secondNetFails, secondNetFails, secondNetFails);
8788fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(bssids[6], 0, 0, 0);
8798fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne        assertFailureCountEquals(bssids[7], 0, 0, 0);
8808fe3e3497daf08b71ffc8c33cb7b139df6667448Glen Kuhne    }
88183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
88283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    /**
88383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Case 15: Test failure counting, ensure failures still counted while connected
88483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Although failures should not occur while wifi is connected, race conditions are a thing, and
88583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * I'd like the count to be incremented even while connected (Later test verifies that this
88683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * can't cause a trigger though)
88783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Expected behavior: Failure counts increment like normal
88883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     */
88983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    @Test
89083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    public void testFailureCounting_wifiIsConnectedDoesNotAffectCounting() throws Exception {
89183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int associationRejections = 5;
89283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int authenticationFailures = 9;
89383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int dhcpFailures = 11;
89483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
89583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Set Watchdogs internal wifi state tracking to 'connected'
89683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        mLastResortWatchdog.connectedStateTransition(true);
89783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
89883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
89983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
90083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, mHasEverConnected);
90183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
90283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
90383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Ensure new networks have zero'ed failure counts
90483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < mSsids.length; i++) {
90583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertFailureCountEquals(mBssids[i], 0, 0, 0);
90683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
90783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
90883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        //Increment failure count for each network and failure type
90983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int net = 0;
91083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < associationRejections; i++) {
91183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
91283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
91383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(i + 1, mLastResortWatchdog.getRecentAvailableNetworks()
91483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    .get(mBssids[net]).associationRejection);
91583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
91683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        net = 1;
91783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < authenticationFailures; i++) {
91883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
91983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
92083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(i + 1, mLastResortWatchdog.getRecentAvailableNetworks()
92183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    .get(mBssids[net]).authenticationFailure);
92283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
92383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        net = 2;
92483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < dhcpFailures; i++) {
92583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
92683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_DHCP);
92783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(i + 1, mLastResortWatchdog.getRecentAvailableNetworks()
92883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    .get(mBssids[net]).dhcpFailure);
92983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
93083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        assertFailureCountEquals(mBssids[0], associationRejections, 0, 0);
93183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        assertFailureCountEquals(mBssids[1], 0, authenticationFailures, 0);
93283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        assertFailureCountEquals(mBssids[2], 0, 0, dhcpFailures);
93383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        assertFailureCountEquals(mBssids[3], 0, 0, 0);
93483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    }
93583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
93683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    /**
93783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Case 16: Test Failure Counting, entering ConnectedState clears all failure counts
93883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * 4 Networks are buffered, cause various failures to 3 of them. Transition to ConnectedState
93983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Expected behavior: After transitioning, failure counts are reset to 0
94083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     */
94183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    @Test
94283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    public void testFailureCounting_enteringWifiConnectedStateClearsCounts() throws Exception {
94383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int associationRejections = 5;
94483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int authenticationFailures = 9;
94583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int dhcpFailures = 11;
94683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
94783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
94883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
94983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, mHasEverConnected);
95083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
95183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
95283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        //Increment failure count for each network and failure type
95383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int net = 0;
95483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < associationRejections; i++) {
95583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
95683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
95783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
95883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        net = 1;
95983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < authenticationFailures; i++) {
96083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
96183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
96283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
96383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        net = 2;
96483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < dhcpFailures; i++) {
96583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(mSsids[net], mBssids[net],
96683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_DHCP);
96783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
96883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
96983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Check that we have Failures
97083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        assertFailureCountEquals(mBssids[0], associationRejections, 0, 0);
97183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        assertFailureCountEquals(mBssids[1], 0, authenticationFailures, 0);
97283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        assertFailureCountEquals(mBssids[2], 0, 0, dhcpFailures);
97383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
97483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Transition to 'ConnectedState'
97583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        mLastResortWatchdog.connectedStateTransition(true);
97683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
97783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Check that we have no failures
97883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < mSsids.length; i++) {
97983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertFailureCountEquals(mBssids[i], 0, 0, 0);
98083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
98183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    }
98283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
98383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    /**
98483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Case 17: Test Trigger Condition, only some networks over threshold
98583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * We have 4 buffered networks, increment failure counts on 3 of them, until all 3 are over
98683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * threshold.
98783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Expected Behavior: Watchdog does not trigger
98883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     */
98983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    @Test
99083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    public void testTriggerCondition_someNetworksOverFailureThreshold_allHaveEverConnected()
99183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            throws Exception {
99283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int associationRejections = WifiLastResortWatchdog.FAILURE_THRESHOLD;
99383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int authenticationFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD + 2;
99483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int dhcpFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD + 3;
9955f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        boolean[] hasEverConnected = {true, true, true, true};
99683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
99783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
99883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
9995f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, hasEverConnected);
100083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
100183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
100283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Increment failure count for 3 networks and failure types, asserting each time that it
100383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // does not trigger, with only 3 over threshold
100483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        boolean watchdogTriggered = false;
100583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int net = 0;
100683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < associationRejections; i++) {
100783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
100883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
100983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
101083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
101183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        net = 1;
101283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < authenticationFailures; i++) {
101383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
101483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
101583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
101683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
101783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        net = 2;
101883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < dhcpFailures; i++) {
101983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
102083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_DHCP);
102183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
102283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
102383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
102483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Check that we have Failures
102583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        assertFailureCountEquals(mBssids[0], associationRejections, 0, 0);
102683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        assertFailureCountEquals(mBssids[1], 0, authenticationFailures, 0);
102783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        assertFailureCountEquals(mBssids[2], 0, 0, dhcpFailures);
102883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
102983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Add one more failure to one of the already over threshold networks, assert that it
103083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // does not trigger
103183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
103283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[0], mBssids[0], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
103383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        assertEquals(false, watchdogTriggered);
103483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    }
103583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
103683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    /**
103783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Case 18: Test Trigger Condition, watchdog fires once, then deactivates
103883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * In this test we have 4 networks, which we have connected to in the past. Failures are
103983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * incremented until all networks but one are over failure threshold, and then a few more times.
104083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     *
104183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Expected behavior: The watchdog triggers once as soon as all failures are over threshold,
104283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * but stops triggering for subsequent failures
104383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     */
104483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    @Test
104583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    public void testTriggerCondition_allNetworksOverFailureThreshold_allHaveEverConnected()
104683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            throws Exception {
104783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int associationRejections = WifiLastResortWatchdog.FAILURE_THRESHOLD;
104883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int authenticationFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD + 2;
104983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int dhcpFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD + 3;
10505f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        boolean[] hasEverConnected = {true, true, true, true};
105183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
105283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
105383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
10545f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, hasEverConnected);
105583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
105683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
105783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Bring 3 of the 4 networks over failure Threshold without triggering watchdog
105883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        boolean watchdogTriggered = false;
105983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int net = 0;
106083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < associationRejections; i++) {
106183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
106283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
106383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
106483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
106583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        net = 1;
106683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < authenticationFailures; i++) {
106783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
106883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
106983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
107083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
107183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        net = 2;
107283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < dhcpFailures; i++) {
107383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
107483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_DHCP);
107583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
107683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
107783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
107883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Bring the remaining unfailed network upto 1 less than the failure threshold
107983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        net = 3;
108083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < WifiLastResortWatchdog.FAILURE_THRESHOLD - 1; i++) {
108183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
108283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
108383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
108483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
108583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Increment failure count once more, check that watchdog triggered this time
108683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
108783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
108883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
108983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        assertEquals(true, watchdogTriggered);
109083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
109183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Increment failure count 5 more times, watchdog should not trigger
109283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < 5; i++) {
109383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
109483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                        mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
109583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
109683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
109783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    }
109883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
109983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    /**
110083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Case 19: Test Trigger Condition, all networks over failure threshold, one has ever connected
110183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * In this test we have 4 networks, only one has connected in the past. Failures are
110283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * incremented until all networks but one are over failure threshold, and then a few more times.
110383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     *
110483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Expected behavior: The watchdog triggers once as soon as all failures are over threshold,
110583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * but stops triggering for subsequent failures
110683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     */
110783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    @Test
110883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    public void testTriggerCondition_allNetworksOverFailureThreshold_oneHaveEverConnected()
110983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            throws Exception {
111083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int associationRejections = WifiLastResortWatchdog.FAILURE_THRESHOLD;
111183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int authenticationFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD + 2;
111283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int dhcpFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD + 3;
11135f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        boolean[] hasEverConnected = {false, true, false, false};
111483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
111583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
111683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
11175f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, hasEverConnected);
111883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
111983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
112083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Bring 3 of the 4 networks over failure Threshold without triggering watchdog
112183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        boolean watchdogTriggered = false;
112283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int net = 0;
112383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < associationRejections; i++) {
112483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
112583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
112683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
112783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
112883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        net = 1;
112983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < authenticationFailures; i++) {
113083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
113183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
113283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
113383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
113483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        net = 2;
113583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < dhcpFailures; i++) {
113683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
113783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_DHCP);
113883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
113983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
114083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
114183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Bring the remaining unfailed network upto 1 less than the failure threshold
114283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        net = 3;
114383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < WifiLastResortWatchdog.FAILURE_THRESHOLD - 1; i++) {
114483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
114583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
114683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
114783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
114883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Increment failure count once more, check that watchdog triggered this time
114983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
115083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
115183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
115283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        assertEquals(true, watchdogTriggered);
115383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
115483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Increment failure count 5 more times, watchdog should not trigger
115583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < 5; i++) {
115683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
115783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                        mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
115883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
115983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
116083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    }
116183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
116283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    /**
116383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Case 20: Test Trigger Condition, all networks over failure threshold, 0 have ever connected
116483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * In this test we have 4 networks, none have ever connected. Failures are
116583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * incremented until all networks but one are over failure threshold, and then a few more times.
116683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     *
116783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Expected behavior: The watchdog does not trigger
116883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     */
116983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    @Test
117083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    public void testTriggerCondition_allNetworksOverFailureThreshold_zeroHaveEverConnected()
117183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            throws Exception {
117283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int associationRejections = WifiLastResortWatchdog.FAILURE_THRESHOLD + 1;
117383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int authenticationFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD + 2;
117483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int dhcpFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD + 3;
117583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
117683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
117783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
117883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, mHasEverConnected);
117983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
118083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
118183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Count failures on all 4 networks until all of them are over the failure threshold
118283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        boolean watchdogTriggered = false;
118383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int net = 0;
118483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < associationRejections; i++) {
118583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
118683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
118783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
118883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
118983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        net = 1;
119083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < authenticationFailures; i++) {
119183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
119283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
119383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
119483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
119583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        net = 2;
119683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < dhcpFailures; i++) {
119783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
119883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_DHCP);
119983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
120083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
120183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        net = 3;
120283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < WifiLastResortWatchdog.FAILURE_THRESHOLD + 1; i++) {
120383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
120483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
120583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
120683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
120783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    }
120883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
120983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    /**
121083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Case 21: Test Trigger Condition, Conditions right to trigger, but wifi is connected
121183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * In this test we have 4 networks, all have connected in the past
121283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * incremented until all networks but one are over failure threshold, and then a few more times.
121383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     *
121483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Expected behavior: The watchdog does not trigger
121583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     */
121683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    @Test
121783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    public void testTriggerCondition_allNetworksOverFailureThreshold_isConnected()
121883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        throws Exception {
121983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int associationRejections = WifiLastResortWatchdog.FAILURE_THRESHOLD + 1;
122083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int authenticationFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD + 2;
122183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int dhcpFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD + 3;
122283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
122383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
122483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
122583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, mHasEverConnected);
122683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
122783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
122883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Set Watchdogs internal wifi state tracking to 'connected'
122983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        mLastResortWatchdog.connectedStateTransition(true);
123083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
123183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Count failures on all 4 networks until all of them are over the failure threshold
123283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        boolean watchdogTriggered = false;
123383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int net = 0;
123483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < associationRejections; i++) {
123583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
123683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
123783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
123883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
123983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        net = 1;
124083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < authenticationFailures; i++) {
124183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
124283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
124383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
124483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
124583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        net = 2;
124683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < dhcpFailures; i++) {
124783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
124883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_DHCP);
124983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
125083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
125183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        net = 3;
125283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < WifiLastResortWatchdog.FAILURE_THRESHOLD + 1; i++) {
125383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
125483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[net], mBssids[net], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
125583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
125683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
125783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    }
125883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
125983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    private void incrementFailuresUntilTrigger(String[] ssids, String[] bssids) {
126083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Bring 3 of the 4 networks over failure Threshold without triggering watchdog
126183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        boolean watchdogTriggered = false;
126283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < WifiLastResortWatchdog.FAILURE_THRESHOLD; i++) {
126383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            for (int j = 0; j < ssids.length - 1; j++) {
126483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                watchdogTriggered = mLastResortWatchdog
126583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                        .noteConnectionFailureAndTriggerIfNeeded(ssids[j], bssids[j],
126683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                        WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
126783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                assertEquals(false, watchdogTriggered);
126883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            }
126983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
127083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < WifiLastResortWatchdog.FAILURE_THRESHOLD - 1; i++) {
127183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog
127283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    .noteConnectionFailureAndTriggerIfNeeded(ssids[ssids.length - 1],
127383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    bssids[ssids.length - 1], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
127483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
127583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
127683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
127783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Increment failure count once more, check that watchdog triggered this time
127883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
127983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    ssids[ssids.length - 1], bssids[ssids.length - 1],
128083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
128183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        assertEquals(true, watchdogTriggered);
128296a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius        verify(mSelfRecovery).trigger(eq(SelfRecovery.REASON_LAST_RESORT_WATCHDOG));
128396a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius        reset(mSelfRecovery);
128483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    }
128583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
128683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    /**
128783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Case 22: Test enabling/disabling of Watchdog Trigger, disabled after triggering
128883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * In this test, we have 4 networks. Increment failures until Watchdog triggers. Increment some
128983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * more failures.
129083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Expected behavior: Watchdog trigger gets deactivated after triggering, and stops triggering
129183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     */
129283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    @Test
129383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    public void testTriggerEnabling_disabledAfterTriggering() throws Exception {
129483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int associationRejections = WifiLastResortWatchdog.FAILURE_THRESHOLD;
129583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int authenticationFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD + 2;
129683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int dhcpFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD + 3;
12975f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        boolean[] hasEverConnected = {false, true, false, false};
129883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
129983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
130083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
13015f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, hasEverConnected);
130283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
130383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
130483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        incrementFailuresUntilTrigger(mSsids, mBssids);
130583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
130683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Increment failure count 5 more times, watchdog should not trigger
130783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < 5; i++) {
130883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            boolean watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
130983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                        mSsids[3], mBssids[3], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
131083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
131183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
131283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    }
131383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
131483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    /**
131583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Case 23: Test enabling/disabling of Watchdog Trigger, trigger re-enabled after connecting
131683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * In this test, we have 4 networks. Increment failures until Watchdog triggers and deactivates,
131783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * transition wifi to connected state, then increment failures until all networks over threshold
131883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Expected behavior: Watchdog able to trigger again after transitioning to and from connected
131983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * state
132083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     */
132183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    @Test
132283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    public void testTriggerEnabling_enabledAfterConnecting() throws Exception {
132383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int associationRejections = WifiLastResortWatchdog.FAILURE_THRESHOLD;
132483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int authenticationFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD + 2;
132583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int dhcpFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD + 3;
13265f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        boolean[] hasEverConnected = {false, true, false, false};
132783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        boolean watchdogTriggered;
132883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Buffer potential candidates 1,2,3 & 4
132983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(mSsids,
13305f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                mBssids, mFrequencies, mCaps, mLevels, mIsEphemeral, hasEverConnected);
133183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
133283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
133383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        incrementFailuresUntilTrigger(mSsids, mBssids);
133483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
133583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Increment failure count 5 more times, ensure trigger is deactivated
133683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < 5; i++) {
133783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
133883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                        mSsids[3], mBssids[3], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
133983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            mLastResortWatchdog.updateAvailableNetworks(candidates);
134083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
134183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
134283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
134383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // transition Watchdog wifi state tracking to 'connected' then back to 'disconnected'
134483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        mLastResortWatchdog.connectedStateTransition(true);
134583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        mLastResortWatchdog.connectedStateTransition(false);
134683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
134783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Fail 3/4 networks until they're over threshold
134883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < WifiLastResortWatchdog.FAILURE_THRESHOLD + 1; i++) {
134983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
135083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[0], mBssids[0], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
135183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
135283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
135383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[1], mBssids[1], WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
135483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
135583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
135683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[2], mBssids[2], WifiLastResortWatchdog.FAILURE_CODE_DHCP);
135783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
135883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
135983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
136083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Bring the remaining unfailed network upto 1 less than the failure threshold
136183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < WifiLastResortWatchdog.FAILURE_THRESHOLD - 1; i++) {
136283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
136383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[3], mBssids[3], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
136483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
136583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
136683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Increment failure count once more, check that watchdog triggered this time
136783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
136883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                    mSsids[3], mBssids[3], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
136983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        assertEquals(true, watchdogTriggered);
137083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    }
137183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
137283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    /**
137383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * Case 24: Test enabling/disabling of Watchdog Trigger, trigger re-enabled after new network
137483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * In this test, we have 3 networks. Increment failures until Watchdog triggers and deactivates,
137583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * we then buffer a new network (network 4), then increment failures until all networks over
137683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     * threshold Expected behavior: Watchdog able to trigger again after discovering a new network
137783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne     */
137883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    @Test
137983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    public void testTriggerEnabling_enabledAfterNewNetwork() {
138083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int associationRejections = WifiLastResortWatchdog.FAILURE_THRESHOLD;
138183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int authenticationFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD + 2;
138283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        int dhcpFailures = WifiLastResortWatchdog.FAILURE_THRESHOLD + 3;
13835f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        boolean[] hasEverConnected = {false, true, false, false};
138483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        boolean watchdogTriggered;
138583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
138683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Buffer potential candidates 1,2,3
138783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(
138883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                Arrays.copyOfRange(mSsids, 0, 3),
138983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                Arrays.copyOfRange(mBssids, 0, 3),
139083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                Arrays.copyOfRange(mFrequencies, 0, 3),
139183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                Arrays.copyOfRange(mCaps, 0, 3),
139283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                Arrays.copyOfRange(mLevels, 0, 3),
13935f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                Arrays.copyOfRange(mIsEphemeral, 0, 3),
13945f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                Arrays.copyOfRange(hasEverConnected, 0, 3));
139583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
139683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
139783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        incrementFailuresUntilTrigger(Arrays.copyOfRange(mSsids, 0, 3),
139883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                Arrays.copyOfRange(mBssids, 0, 3));
139983f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
140083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        // Increment failure count 5 more times, ensure trigger is deactivated
140183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        for (int i = 0; i < 5; i++) {
140283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
140383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne                        mSsids[2], mBssids[2], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
140483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            mLastResortWatchdog.updateAvailableNetworks(candidates);
140583f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne            assertEquals(false, watchdogTriggered);
140683f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        }
140783f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
140883f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        candidates = createFilteredQnsCandidates(mSsids, mBssids, mFrequencies, mCaps, mLevels,
14095f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                mIsEphemeral, hasEverConnected);
141083f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
141183f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
141283f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne        incrementFailuresUntilTrigger(mSsids, mBssids);
141383f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne
141483f2b8087178705445e4d1618eaac832f9c633f4Glen Kuhne    }
14155f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne
14165f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
14175f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Case 26: Test Metrics collection
14185f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Setup 5 networks (unique SSIDs). Fail them until watchdog triggers, with 1 network failing
14195f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * association, 1 failing authentication, 2 failing dhcp and one failing both authentication and
14205f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * dhcp, (over threshold for all these failures)
14215f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Expected behavior: Metrics are updated as follows
14225f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     *  Triggers++
14235f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     *  # of Networks += 5
14245f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     *  Triggers with Bad association++
14255f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     *  Triggers with Bad authentication++
14265f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     *  Triggers with Bad dhcp++
14275f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     *  Number of networks with bad association += 1
14285f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     *  Number of networks with bad authentication += 2
14295f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     *  Number of networks with bad dhcp += 3
14305f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
14315f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    @Test
14325f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void testMetricsCollection() {
14335f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        String[] ssids = {"\"test1\"", "\"test2\"", "\"test3\"", "\"test4\"", "\"test5\""};
14345f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4", "de:ad:ba:b1:e5:55",
14355f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                "c0:ff:ee:ee:e3:ee", "6c:f3:7f:ae:3c:f3"};
14365f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        int[] frequencies = {2437, 5180, 5180, 2437, 2437};
14375f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]",
14385f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                "[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
14395f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        int[] levels = {-60, -86, -50, -62, -60};
14405f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        boolean[] isEphemeral = {false, false, false, false, false};
14415f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        boolean[] hasEverConnected = {true, false, false, false, false};
1442da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        // Buffer potential candidates 1,2,3,4 & 5
14435f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        List<Pair<ScanDetail, WifiConfiguration>> candidates = createFilteredQnsCandidates(ssids,
14445f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                bssids, frequencies, caps, levels, isEphemeral, hasEverConnected);
14455f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
14465f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne
14475f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        // Ensure new networks have zero'ed failure counts
14485f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        for (int i = 0; i < ssids.length; i++) {
14495f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            assertFailureCountEquals(bssids[i], 0, 0, 0);
14505f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
14515f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne
1452da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        //Increment failure counts
14535f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        for (int i = 0; i < WifiLastResortWatchdog.FAILURE_THRESHOLD; i++) {
14545f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
14555f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                    ssids[1], bssids[1], WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
14565f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
14575f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                    ssids[2], bssids[2], WifiLastResortWatchdog.FAILURE_CODE_DHCP);
14585f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
14595f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                    ssids[3], bssids[3], WifiLastResortWatchdog.FAILURE_CODE_DHCP);
14605f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
14615f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                    ssids[4], bssids[4], WifiLastResortWatchdog.FAILURE_CODE_DHCP);
14625f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
14635f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                    ssids[4], bssids[4], WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
14645f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
14655f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                    ssids[0], bssids[0], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
14665f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
14675f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne
14685f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        // Verify relevant WifiMetrics calls were made once with appropriate arguments
14695f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        verify(mWifiMetrics, times(1)).incrementNumLastResortWatchdogTriggers();
14705f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        verify(mWifiMetrics, times(1)).addCountToNumLastResortWatchdogAvailableNetworksTotal(5);
14715f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        verify(mWifiMetrics, times(1))
14725f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                .addCountToNumLastResortWatchdogBadAuthenticationNetworksTotal(2);
14735f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        verify(mWifiMetrics, times(1))
14745f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                .incrementNumLastResortWatchdogTriggersWithBadAuthentication();
14755f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        verify(mWifiMetrics, times(1))
14765f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                .addCountToNumLastResortWatchdogBadAssociationNetworksTotal(1);
14775f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        verify(mWifiMetrics, times(1)).incrementNumLastResortWatchdogTriggersWithBadAssociation();
14785f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        verify(mWifiMetrics, times(1)).addCountToNumLastResortWatchdogBadDhcpNetworksTotal(3);
14795f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        verify(mWifiMetrics, times(1)).incrementNumLastResortWatchdogTriggersWithBadDhcp();
1480da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne
1481da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        // Simulate wifi connecting after triggering
1482da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        mLastResortWatchdog.connectedStateTransition(true);
1483da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne
1484da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        // Verify that WifiMetrics counted this as a Watchdog success
1485da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        verify(mWifiMetrics, times(1)).incrementNumLastResortWatchdogSuccesses();
1486da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne
1487da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        // Simulate wifi disconnecting
1488da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        mLastResortWatchdog.connectedStateTransition(false);
1489da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne
1490da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        // Verify that WifiMetrics has still only counted one success
1491da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        verify(mWifiMetrics, times(1)).incrementNumLastResortWatchdogSuccesses();
1492da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne
1493da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        // Remove the fifth network from candidates
1494da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        candidates = createFilteredQnsCandidates(Arrays.copyOfRange(mSsids, 0, 4),
1495da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne            Arrays.copyOfRange(mBssids, 0, 4),
1496da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne            Arrays.copyOfRange(mFrequencies, 0, 4),
1497da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne            Arrays.copyOfRange(mCaps, 0, 4),
1498da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne            Arrays.copyOfRange(mLevels, 0, 4),
1499da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne            Arrays.copyOfRange(mIsEphemeral, 0, 4));
1500da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne
1501da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        // Age out the fifth network
1502da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        for (int i = 0; i < WifiLastResortWatchdog.MAX_BSSID_AGE; i++) {
1503da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne            mLastResortWatchdog.updateAvailableNetworks(candidates);
1504da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        }
1505da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne
1506da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        //Increment failure counts
1507da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        for (int i = 0; i < WifiLastResortWatchdog.FAILURE_THRESHOLD; i++) {
1508da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
1509da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne                    ssids[1], bssids[1], WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
1510da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
1511da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne                    ssids[2], bssids[2], WifiLastResortWatchdog.FAILURE_CODE_DHCP);
1512da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
1513da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne                    ssids[3], bssids[3], WifiLastResortWatchdog.FAILURE_CODE_DHCP);
1514da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne            mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
1515da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne                    ssids[0], bssids[0], WifiLastResortWatchdog.FAILURE_CODE_ASSOCIATION);
1516da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        }
1517da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne
1518da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        // Add network #5 back into the candidates
1519da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        candidates = createFilteredQnsCandidates(ssids,
1520da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne                bssids, frequencies, caps, levels, isEphemeral, hasEverConnected);
1521da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne
1522da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        // LastResortWatchdog should reactivate because there is a new network (#5) available,
1523da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        // Not because it was successful
1524da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        mLastResortWatchdog.updateAvailableNetworks(candidates);
1525da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne
1526da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        // Simulate wifi connecting
1527da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        mLastResortWatchdog.connectedStateTransition(true);
1528da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne
1529da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        // Verify that WifiMetrics did not count another success, as the connection could be due
1530da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        // to the newly available network #5
1531da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        verify(mWifiMetrics, times(1)).incrementNumLastResortWatchdogSuccesses();
15325f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
153391a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein
153491a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein    /**
153591a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     * Case 21: Test config updates where new config is null.
153691a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     * Create a scan result with an associated config and update the available networks list.
153791a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     * Repeat this with a second scan result where the config is null.
153891a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     * Expected behavior: The stored config should not be lost overwritten.
153991a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     */
154091a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein    @Test
154191a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein    public void testUpdateNetworkWithNullConfig() {
154291a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        List<Pair<ScanDetail, WifiConfiguration>> candidates =
154391a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                new ArrayList<Pair<ScanDetail, WifiConfiguration>>();
154491a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        String ssid = mSsids[0].replaceAll("^\"+", "").replaceAll("\"+$", "");
154591a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        ScanDetail scanDetail = new ScanDetail(WifiSsid.createFromAsciiEncoded(ssid),
154691a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                mBssids[0], mCaps[0], mLevels[0], mFrequencies[0], System.currentTimeMillis(), 0);
154791a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        WifiConfiguration config = mock(WifiConfiguration.class);
154891a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        WifiConfiguration.NetworkSelectionStatus networkSelectionStatus =
154991a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                mock(WifiConfiguration.NetworkSelectionStatus.class);
155091a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        when(config.getNetworkSelectionStatus()).thenReturn(networkSelectionStatus);
155191a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        when(networkSelectionStatus.getHasEverConnected())
155291a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                .thenReturn(true);
155391a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        candidates.add(Pair.create(scanDetail, config));
155491a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        mLastResortWatchdog.updateAvailableNetworks(candidates);
155591a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein
155691a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        candidates.clear();
155791a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein
155891a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        candidates.add(Pair.create(scanDetail, null));
155991a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        mLastResortWatchdog.updateAvailableNetworks(candidates);
156091a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein
156191a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        boolean watchdogTriggered = false;
156291a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        for (int i = 0; i < WifiLastResortWatchdog.FAILURE_THRESHOLD; i++) {
156391a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
156491a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                    mSsids[0], mBssids[0], WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
156591a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        }
156691a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        assertEquals(true, watchdogTriggered);
156791a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein    }
156891a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein
156991a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein    /**
157091a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     * Case 22: Test config updates where hasEverConnected goes from false to true.
157191a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     * Create a scan result with an associated config and update the available networks list.
157291a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     * Repeat this with a second scan result where the config value for hasEverConnected
157391a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     * is true.
157491a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     * Expected behavior: The stored config should not be lost overwritten.
157591a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     */
157691a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein    @Test
157791a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein    public void testUpdateNetworkWithHasEverConnectedTrue() {
157891a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        List<Pair<ScanDetail, WifiConfiguration>> candidates =
157991a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                new ArrayList<Pair<ScanDetail, WifiConfiguration>>();
158091a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        String ssid = mSsids[0].replaceAll("^\"+", "").replaceAll("\"+$", "");
158191a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        ScanDetail scanDetail = new ScanDetail(WifiSsid.createFromAsciiEncoded(ssid),
158291a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                mBssids[0], mCaps[0], mLevels[0], mFrequencies[0], System.currentTimeMillis(), 0);
158391a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        WifiConfiguration configHasEverConnectedFalse = mock(WifiConfiguration.class);
158491a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        WifiConfiguration.NetworkSelectionStatus networkSelectionStatusFalse =
158591a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                mock(WifiConfiguration.NetworkSelectionStatus.class);
158691a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        when(configHasEverConnectedFalse.getNetworkSelectionStatus())
158791a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                .thenReturn(networkSelectionStatusFalse);
158891a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        when(networkSelectionStatusFalse.getHasEverConnected())
158991a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                .thenReturn(false);
159091a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        candidates.add(Pair.create(scanDetail, configHasEverConnectedFalse));
159191a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        mLastResortWatchdog.updateAvailableNetworks(candidates);
159291a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein
159391a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        boolean watchdogTriggered = false;
159491a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        for (int i = 0; i < WifiLastResortWatchdog.FAILURE_THRESHOLD; i++) {
159591a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
159691a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                    mSsids[0], mBssids[0], WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
159791a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        }
159891a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        assertEquals(false, watchdogTriggered);
159991a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein
160091a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        candidates.clear();
160191a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein
160291a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        WifiConfiguration configHasEverConnectedTrue = mock(WifiConfiguration.class);
160391a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        WifiConfiguration.NetworkSelectionStatus networkSelectionStatusTrue =
160491a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                mock(WifiConfiguration.NetworkSelectionStatus.class);
160591a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        when(configHasEverConnectedTrue.getNetworkSelectionStatus())
160691a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                .thenReturn(networkSelectionStatusTrue);
160791a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        when(networkSelectionStatusTrue.getHasEverConnected())
160891a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                .thenReturn(true);
160991a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        candidates.add(Pair.create(scanDetail, configHasEverConnectedTrue));
161091a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        mLastResortWatchdog.updateAvailableNetworks(candidates);
161191a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein
161291a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
161391a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                mSsids[0], mBssids[0], WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
161491a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        assertEquals(true, watchdogTriggered);
161591a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein    }
161691a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein
161791a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein    /**
161891a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     * Case 23: Test config updates where hasEverConnected goes from true to false.
161991a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     * Create a scan result with an associated config and update the available networks list.
162091a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     * Repeat this with a second scan result where hasEverConnected is false.
162191a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     * Expected behavior: The stored config should not be lost overwritten.
162291a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     */
162391a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein    @Test
162491a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein    public void testUpdateNetworkWithHasEverConnectedFalse() {
162591a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        List<Pair<ScanDetail, WifiConfiguration>> candidates =
162691a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                new ArrayList<Pair<ScanDetail, WifiConfiguration>>();
162791a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        String ssid = mSsids[0].replaceAll("^\"+", "").replaceAll("\"+$", "");
162891a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        ScanDetail scanDetail = new ScanDetail(WifiSsid.createFromAsciiEncoded(ssid),
162991a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                mBssids[0], mCaps[0], mLevels[0], mFrequencies[0], System.currentTimeMillis(), 0);
163091a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein
163191a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        WifiConfiguration configHasEverConnectedTrue = mock(WifiConfiguration.class);
163291a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        WifiConfiguration.NetworkSelectionStatus networkSelectionStatusTrue =
163391a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                mock(WifiConfiguration.NetworkSelectionStatus.class);
163491a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        when(configHasEverConnectedTrue.getNetworkSelectionStatus())
163591a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                .thenReturn(networkSelectionStatusTrue);
163691a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        when(networkSelectionStatusTrue.getHasEverConnected())
163791a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                .thenReturn(true);
163891a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        candidates.add(Pair.create(scanDetail, configHasEverConnectedTrue));
163991a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        mLastResortWatchdog.updateAvailableNetworks(candidates);
164091a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein
164191a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        boolean watchdogTriggered = false;
164291a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        for (int i = 0; i < WifiLastResortWatchdog.FAILURE_THRESHOLD; i++) {
164391a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
164491a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                    mSsids[0], mBssids[0], WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
164591a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        }
164691a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        assertEquals(true, watchdogTriggered);
164791a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein
164891a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        candidates.clear();
164991a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein
165091a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        WifiConfiguration configHasEverConnectedFalse = mock(WifiConfiguration.class);
165191a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        WifiConfiguration.NetworkSelectionStatus networkSelectionStatusFalse =
165291a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                mock(WifiConfiguration.NetworkSelectionStatus.class);
165391a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        when(configHasEverConnectedFalse.getNetworkSelectionStatus())
165491a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                .thenReturn(networkSelectionStatusFalse);
165591a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        when(networkSelectionStatusFalse.getHasEverConnected())
165691a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                .thenReturn(false);
165791a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        candidates.add(Pair.create(scanDetail, configHasEverConnectedFalse));
165891a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        mLastResortWatchdog.updateAvailableNetworks(candidates);
165991a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein
166091a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        for (int i = 0; i < WifiLastResortWatchdog.FAILURE_THRESHOLD; i++) {
166191a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein            watchdogTriggered = mLastResortWatchdog.noteConnectionFailureAndTriggerIfNeeded(
166291a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                    mSsids[0], mBssids[0], WifiLastResortWatchdog.FAILURE_CODE_AUTHENTICATION);
166391a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        }
166491a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        assertEquals(false, watchdogTriggered);
166591a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein    }
166691a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein
166791a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein    /**
166891a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     * Case 24: Check toString method for accurate hasEverConnected value in
166991a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     * AvailableNetworkFailureCount objects.
167091a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     * Create an AvailableNetworkFailureCount instance and check output of toString method.
167191a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     * Expected behavior:  String contains HasEverConnected setting or null_config if there is not
167291a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     * an associated config.
167391a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein     */
167491a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein    @Test
167591a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein    public void testHasEverConnectedValueInAvailableNetworkFailureCountToString() {
167691a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        // Check with HasEverConnected true
167791a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        WifiConfiguration configHasEverConnectedTrue = mock(WifiConfiguration.class);
167891a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        WifiConfiguration.NetworkSelectionStatus networkSelectionStatusTrue =
167991a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                mock(WifiConfiguration.NetworkSelectionStatus.class);
168091a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        when(configHasEverConnectedTrue.getNetworkSelectionStatus())
168191a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                .thenReturn(networkSelectionStatusTrue);
168291a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        when(networkSelectionStatusTrue.getHasEverConnected()).thenReturn(true);
168391a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        WifiLastResortWatchdog.AvailableNetworkFailureCount withConfigHECTrue =
168491a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                new WifiLastResortWatchdog.AvailableNetworkFailureCount(configHasEverConnectedTrue);
168591a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        String output = withConfigHECTrue.toString();
168691a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        assertTrue(output.contains("HasEverConnected: true"));
168791a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein
168891a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        // check with HasEverConnected false
168991a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        WifiConfiguration configHasEverConnectedFalse = mock(WifiConfiguration.class);
169091a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        WifiConfiguration.NetworkSelectionStatus networkSelectionStatusFalse =
169191a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                mock(WifiConfiguration.NetworkSelectionStatus.class);
169291a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        when(configHasEverConnectedFalse.getNetworkSelectionStatus())
169391a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                .thenReturn(networkSelectionStatusFalse);
169491a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        when(networkSelectionStatusFalse.getHasEverConnected()).thenReturn(false);
169591a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        WifiLastResortWatchdog.AvailableNetworkFailureCount withConfigHECFalse =
169691a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                new WifiLastResortWatchdog.AvailableNetworkFailureCount(
169791a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                        configHasEverConnectedFalse);
169891a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        output = withConfigHECFalse.toString();
169991a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        assertTrue(output.contains("HasEverConnected: false"));
170091a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein
170191a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        // Check with a null config
170291a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        WifiLastResortWatchdog.AvailableNetworkFailureCount withNullConfig =
170391a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein                new WifiLastResortWatchdog.AvailableNetworkFailureCount(null);
170491a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        output = withNullConfig.toString();
170591a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein        assertTrue(output.contains("HasEverConnected: null_config"));
170691a8893f047b8a193e4516ab772b6f43882777f5Rebecca Silberstein    }
170709abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne}
1708