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