ScanOnlyModeManagerTest.java revision d09f94469f1e130ba4b6a4b48976b13558267ed3
1eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein/* 2eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * Copyright 2018 The Android Open Source Project 3eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * 4eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * Licensed under the Apache License, Version 2.0 (the "License"); 5eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * you may not use this file except in compliance with the License. 6eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * You may obtain a copy of the License at 7eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * 8eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * http://www.apache.org/licenses/LICENSE-2.0 9eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * 10eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * Unless required by applicable law or agreed to in writing, software 11eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * distributed under the License is distributed on an "AS IS" BASIS, 12eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * See the License for the specific language governing permissions and 14eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * limitations under the License. 15eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein */ 16eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 17eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinpackage com.android.server.wifi; 18eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 19d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silbersteinimport static android.net.wifi.WifiManager.EXTRA_SCAN_AVAILABLE; 20d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silbersteinimport static android.net.wifi.WifiManager.WIFI_SCAN_AVAILABLE; 21d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silbersteinimport static android.net.wifi.WifiManager.WIFI_STATE_DISABLED; 22d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silbersteinimport static android.net.wifi.WifiManager.WIFI_STATE_ENABLED; 23d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silbersteinimport static android.net.wifi.WifiManager.WIFI_STATE_UNKNOWN; 24d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein 25d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silbersteinimport static org.junit.Assert.assertEquals; 2626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport static org.mockito.Mockito.*; 2726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 28d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silbersteinimport android.content.Context; 29d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silbersteinimport android.content.Intent; 3026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport android.net.wifi.IClientInterface; 3126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport android.os.IBinder; 32aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silbersteinimport android.os.INetworkManagementService; 3326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport android.os.RemoteException; 34d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silbersteinimport android.os.UserHandle; 35eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinimport android.os.test.TestLooper; 36eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinimport android.test.suitebuilder.annotation.SmallTest; 3726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport android.util.Pair; 38eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 39aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silbersteinimport com.android.server.net.BaseNetworkObserver; 40aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 41eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinimport org.junit.Before; 42eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinimport org.junit.Test; 43aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silbersteinimport org.mockito.ArgumentCaptor; 4426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport org.mockito.Mock; 4526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport org.mockito.MockitoAnnotations; 46eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 47eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein/** 48eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * Unit tests for {@link ScanOnlyModeManager}. 49eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein */ 50eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein@SmallTest 51eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinpublic class ScanOnlyModeManagerTest { 52eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein private static final String TAG = "ScanOnlyModeManagerTest"; 5326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein private static final String TEST_INTERFACE_NAME = "testif0"; 54aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein private static final String OTHER_INTERFACE_NAME = "notTestIf"; 55eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 56eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein TestLooper mLooper; 57eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 58eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein ScanOnlyModeManager mScanOnlyModeManager; 59aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein BaseNetworkObserver mNetworkObserver; 60eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 61d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein @Mock Context mContext; 6226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Mock IClientInterface mClientInterface; 6326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Mock IBinder mClientInterfaceBinder; 6426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Mock WifiMetrics mWifiMetrics; 6526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Mock WifiNative mWifiNative; 66aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein @Mock INetworkManagementService mNmService; 679f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein @Mock ScanOnlyModeManager.Listener mListener; 68d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein @Mock WifiMonitor mWifiMonitor; 69aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 70aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein final ArgumentCaptor<BaseNetworkObserver> mNetworkObserverCaptor = 71aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein ArgumentCaptor.forClass(BaseNetworkObserver.class); 7226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 73eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein @Before 74eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein public void setUp() { 7526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein MockitoAnnotations.initMocks(this); 76eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mLooper = new TestLooper(); 7726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mClientInterface.asBinder()).thenReturn(mClientInterfaceBinder); 7826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 79eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mScanOnlyModeManager = createScanOnlyModeManager(); 8026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mLooper.dispatchAll(); 81eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein } 82eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 83eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein private ScanOnlyModeManager createScanOnlyModeManager() { 849f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein return new ScanOnlyModeManager(mContext, mLooper.getLooper(), mWifiNative, mListener, 85d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein mNmService, mWifiMetrics, mWifiMonitor); 8626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein } 8726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 8826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein private void startScanOnlyModeAndVerifyEnabled() throws Exception { 8926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 9026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mClientInterface.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 9126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME))) 9226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface)); 93d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein when(mWifiNative.enableSupplicant()).thenReturn(true); 9426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mScanOnlyModeManager.start(); 9526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mLooper.dispatchAll(); 9626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 97aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein verify(mWifiNative).setupForClientMode(eq(TEST_INTERFACE_NAME)); 98aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein verify(mNmService).registerObserver(mNetworkObserverCaptor.capture()); 99aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mNetworkObserver = (BaseNetworkObserver) mNetworkObserverCaptor.getValue(); 100aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 101aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein // now mark the interface as up 102aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mNetworkObserver.interfaceLinkStateChanged(TEST_INTERFACE_NAME, true); 103aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mLooper.dispatchAll(); 104aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 105d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); 106d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein verify(mContext).sendStickyBroadcastAsUser(intentCaptor.capture(), 107d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein eq(UserHandle.ALL)); 108d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein 109d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_ENABLED); 1109f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein checkWifiStateChangeListenerUpdate(WIFI_STATE_ENABLED); 111d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein } 112d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein 113d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein private void checkWifiScanStateChangedBroadcast(Intent intent, int expectedCurrentState) { 114d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein String action = intent.getAction(); 115d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein assertEquals(WIFI_SCAN_AVAILABLE, action); 116d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein int currentState = intent.getIntExtra(EXTRA_SCAN_AVAILABLE, WIFI_STATE_UNKNOWN); 117d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein assertEquals(expectedCurrentState, currentState); 11826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein } 11926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 1209f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein private void checkWifiStateChangeListenerUpdate(int expectedCurrentState) { 1219f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein verify(mListener).onStateChanged(eq(expectedCurrentState)); 1229f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein } 1239f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein 12426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein /** 12526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein * ScanMode start sets up an interface in ClientMode for scanning. 12626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein */ 12726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Test 12826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein public void scanModeStartCreatesClientInterface() throws Exception { 12926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein startScanOnlyModeAndVerifyEnabled(); 130eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein } 131eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 132eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein /** 13326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein * ScanMode increments failure metrics when failing to setup client mode interface due to hal 13426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein * error. 135eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein */ 136eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein @Test 13726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein public void detectAndReportErrorWhenSetupForClientModeHalFailure() throws Exception { 13826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 13926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME))) 14026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein .thenReturn(Pair.create(WifiNative.SETUP_FAILURE_HAL, null)); 141eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mScanOnlyModeManager.start(); 142eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mLooper.dispatchAll(); 14326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 14426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein verify(mWifiMetrics).incrementNumWifiOnFailureDueToHal(); 145d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); 146d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein verify(mContext, atLeastOnce()).sendStickyBroadcastAsUser(intentCaptor.capture(), 147d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein eq(UserHandle.ALL)); 148d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED); 1499f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein checkWifiStateChangeListenerUpdate(WIFI_STATE_UNKNOWN); 150eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein } 151eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 152eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein /** 15326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein * ScanMode increments failure metrics when failing to setup client mode interface due to 15426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein * wificond error. 155eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein */ 156eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein @Test 15726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein public void detectAndReportErrorWhenSetupForClientModeWificondFailure() throws Exception { 15826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 15926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME))) 16026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein .thenReturn(Pair.create(WifiNative.SETUP_FAILURE_WIFICOND, null)); 161eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mScanOnlyModeManager.start(); 16226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mLooper.dispatchAll(); 16326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 16426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein verify(mWifiMetrics).incrementNumWifiOnFailureDueToWificond(); 165d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); 166d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein verify(mContext, atLeastOnce()).sendStickyBroadcastAsUser(intentCaptor.capture(), 167d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein eq(UserHandle.ALL)); 168d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED); 1699f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein checkWifiStateChangeListenerUpdate(WIFI_STATE_UNKNOWN); 17026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein } 17126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 17226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein /** 1739f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein * ScanMode start does not report scan mode as available to WifiScanningService when 1749f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein * interface creation reports success but returns a null interface. 17526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein */ 17626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Test 1779f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein public void scanModeStartDoesNotActivateScannerWhenClientInterfaceIsNull() throws Exception { 17826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 17926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME))) 18026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, null)); 181eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mScanOnlyModeManager.start(); 182eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mLooper.dispatchAll(); 1839f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein 184d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); 185d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein verify(mContext, atLeastOnce()).sendStickyBroadcastAsUser(intentCaptor.capture(), 186d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein eq(UserHandle.ALL)); 187d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED); 1889f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein checkWifiStateChangeListenerUpdate(WIFI_STATE_UNKNOWN); 189eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein } 190eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 191eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein /** 1929f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein * ScanMode start does not report scan mode as available to WifiScanningService 1939f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein * when the call to get the interface name throws a RemoteException. 194eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein */ 195eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein @Test 1969f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein public void scanModeStartDoesNotActivateScannerWhenGetClientInterfaceNameThrowsException() 19726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein throws Exception { 19826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 19926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein doThrow(new RemoteException()).when(mClientInterface).getInterfaceName(); 20026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME))) 20126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface)); 202eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mScanOnlyModeManager.start(); 20326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mLooper.dispatchAll(); 2049f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein 205d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); 206d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein verify(mContext, atLeastOnce()).sendStickyBroadcastAsUser(intentCaptor.capture(), 207d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein eq(UserHandle.ALL)); 208d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED); 2099f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein checkWifiStateChangeListenerUpdate(WIFI_STATE_UNKNOWN); 21026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein } 21126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 21226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein /** 2139f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein * ScanMode start does not report scan mode as available to WifiScanningService 2149f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein * when the interface name is null. 21526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein */ 21626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Test 2179f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein public void scanModeStartDoesNotActivateScannerWhenClientInterfaceNameNull() throws Exception { 21826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 21926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mClientInterface.getInterfaceName()).thenReturn(null); 22026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME))) 22126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface)); 22226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mScanOnlyModeManager.start(); 22326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mLooper.dispatchAll(); 2249f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein 2259f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); 2269f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein verify(mContext, atLeastOnce()).sendStickyBroadcastAsUser(intentCaptor.capture(), 2279f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein eq(UserHandle.ALL)); 2289f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED); 2299f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein checkWifiStateChangeListenerUpdate(WIFI_STATE_UNKNOWN); 23026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein } 23126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 23226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein /** 2339f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein * ScanMode start does not indicate scanning is available when the interface name is empty. 23426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein */ 23526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Test 2369f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein public void scanModeStartDoesNotSendScanningActiveWhenClientInterfaceNameIsEmpty() 2379f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein throws Exception { 23826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 23926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mClientInterface.getInterfaceName()).thenReturn(""); 24026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME))) 24126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface)); 24226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mScanOnlyModeManager.start(); 24326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mLooper.dispatchAll(); 2449f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein 2459f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); 2469f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein verify(mContext, atLeastOnce()).sendStickyBroadcastAsUser(intentCaptor.capture(), 2479f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein eq(UserHandle.ALL)); 2489f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED); 2499f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein checkWifiStateChangeListenerUpdate(WIFI_STATE_UNKNOWN); 25026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein } 25126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 25226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein /** 253aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * Calling ScanOnlyModeManager.start twice does not crash or restart scan mode. 25426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein */ 25526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Test 256aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein public void scanOnlyModeStartCalledTwice() throws Exception { 25726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein startScanOnlyModeAndVerifyEnabled(); 2589f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein reset(mWifiNative, mContext); 259aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mScanOnlyModeManager.start(); 260eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mLooper.dispatchAll(); 2619f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein verifyNoMoreInteractions(mWifiNative, mContext); 262eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein } 263eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 264eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein /** 265aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * ScanMode stop properly cleans up state 26626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein */ 26726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Test 268aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein public void scanModeStopCleansUpState() throws Exception { 26926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein startScanOnlyModeAndVerifyEnabled(); 270d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein reset(mContext); 271aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mScanOnlyModeManager.stop(); 27226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mLooper.dispatchAll(); 273aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein verify(mNmService).unregisterObserver(eq(mNetworkObserver)); 274d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); 275d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein verify(mContext, atLeastOnce()).sendStickyBroadcastAsUser(intentCaptor.capture(), 276d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein eq(UserHandle.ALL)); 277d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED); 2789f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein checkWifiStateChangeListenerUpdate(WIFI_STATE_DISABLED); 27926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein } 28026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 28126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein /** 2829f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein * Calling stop when ScanMode is not started should not send scan state updates 283eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein */ 284eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein @Test 2859f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein public void scanModeStopWhenNotStartedDoesNotUpdateScanStateUpdates() throws Exception { 286aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein startScanOnlyModeAndVerifyEnabled(); 287aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mScanOnlyModeManager.stop(); 288aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mLooper.dispatchAll(); 2899f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein reset(mNmService, mContext, mListener); 290aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 291aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein // now call stop again 292eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mScanOnlyModeManager.stop(); 293eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mLooper.dispatchAll(); 294d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein verify(mContext, never()).sendStickyBroadcastAsUser(any(), any()); 2959f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein verify(mListener, never()).onStateChanged(anyInt()); 296aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein } 297aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 298aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein /** 299aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * Triggering interface down when ScanOnlyMode is active properly exits the active state. 300aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein */ 301aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein @Test 302aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein public void scanModeStartedStopsWhenInterfaceDown() throws Exception { 303aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein startScanOnlyModeAndVerifyEnabled(); 304d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein reset(mContext); 305aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mNetworkObserver.interfaceLinkStateChanged(TEST_INTERFACE_NAME, false); 306aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mLooper.dispatchAll(); 307aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein verify(mNmService).unregisterObserver(eq(mNetworkObserver)); 308d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); 309d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein verify(mContext).sendStickyBroadcastAsUser(intentCaptor.capture(), eq(UserHandle.ALL)); 310d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED); 3119f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein checkWifiStateChangeListenerUpdate(WIFI_STATE_DISABLED); 312aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein } 313aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 314aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein /** 315d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein * Test that failing to start supplicant cleans up any set state and does not proceed to the 316d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein * active state. 317d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein */ 318d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein @Test 319d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein public void startScanModeSupplicantStartFails() throws Exception { 320d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 321d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein when(mClientInterface.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 322d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME))) 323d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface)); 324d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein when(mWifiNative.enableSupplicant()).thenReturn(false); 325d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein 326d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein mScanOnlyModeManager.start(); 327d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein mLooper.dispatchAll(); 328d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); 329d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein verify(mContext).sendStickyBroadcastAsUser(intentCaptor.capture(), eq(UserHandle.ALL)); 330d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED); 331d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein checkWifiStateChangeListenerUpdate(WIFI_STATE_UNKNOWN); 332d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein } 333d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein 334d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein /** 335aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * This is a basic test that will be enhanced as functionality is added to the class. 336aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * Test that failing to register the Networkobserver for the interface does not crash. Later 337aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * CLs will expand the test to verify proper failure reporting and other error signals. 338aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein */ 339aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein @Test 340aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein public void startScanModeNetworkObserverFailureReportsError() throws Exception { 341aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 342aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein when(mClientInterface.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 343aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME))) 344aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface)); 345d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein when(mWifiNative.enableSupplicant()).thenReturn(true); 346aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein doThrow(new RemoteException()).when(mNmService).registerObserver(any()); 347aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 348aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mScanOnlyModeManager.start(); 349aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mLooper.dispatchAll(); 350aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein verify(mNmService).unregisterObserver(any()); 351d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein verify(mWifiNative).disableSupplicant(); 352d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); 353d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein verify(mContext).sendStickyBroadcastAsUser(intentCaptor.capture(), eq(UserHandle.ALL)); 354d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED); 355d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein checkWifiStateChangeListenerUpdate(WIFI_STATE_UNKNOWN); 356aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein } 357aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 358aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 359aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein /** 360aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * Triggering interface down for a different interface when ScanOnlyMode is active dows not exit 361aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * the active state. 362aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein */ 363aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein @Test 364aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein public void scanModeStartedDoesNotStopForDifferentInterfaceDown() throws Exception { 365aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein startScanOnlyModeAndVerifyEnabled(); 3669f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein reset(mContext, mListener); 367aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mNetworkObserver.interfaceLinkStateChanged(OTHER_INTERFACE_NAME, false); 368aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mLooper.dispatchAll(); 369aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein verify(mNmService, never()).unregisterObserver(eq(mNetworkObserver)); 370d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein verify(mContext, never()).sendStickyBroadcastAsUser(any(), eq(UserHandle.ALL)); 3719f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein verify(mListener, never()).onStateChanged(anyInt()); 372aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein } 373aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 374aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein /** 375aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * Triggering an interface up for a different interface does not trigger a notification to 376aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * Scanning service that ScanOnlyMode is ready. 377aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * This test will be enhanced when the broadcast is added. 378aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein */ 379aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein @Test 380aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein public void scanModeStartDoesNotNotifyScanningServiceForDifferentInterfaceUp() 381aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein throws Exception { 382aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein startScanOnlyModeAndVerifyEnabled(); 3839f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein reset(mContext, mListener); 384aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 385aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein // now mark a different interface as up 386aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mNetworkObserver.interfaceLinkStateChanged(OTHER_INTERFACE_NAME, true); 387aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mLooper.dispatchAll(); 388aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 389d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein verify(mContext, never()).sendStickyBroadcastAsUser(any(), any()); 3909f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein verify(mListener, never()).onStateChanged(anyInt()); 391aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein } 392aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 393aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein /** 394aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * Callbacks from an old NetworkObserver do not trigger changes with a current NetworkObserver. 395aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein */ 396aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein @Test 397aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein public void scanModeNetworkObserverCallbacksOnlyForCurrentObserver() throws Exception { 398aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein startScanOnlyModeAndVerifyEnabled(); 399aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein BaseNetworkObserver firstObserver = mNetworkObserver; 4009f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein 401aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mScanOnlyModeManager.stop(); 402aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mLooper.dispatchAll(); 4039f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein 4049f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein reset(mNmService, mWifiNative, mContext, mListener); 405aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein startScanOnlyModeAndVerifyEnabled(); 4069f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein 4079f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein // trigger ScanOnlyMode to repeat setup 4089f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein mScanOnlyModeManager.start(); 4099f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein mLooper.dispatchAll(); 4109f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein verify(mNmService).registerObserver(mNetworkObserverCaptor.capture()); 4119f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein mNetworkObserver = (BaseNetworkObserver) mNetworkObserverCaptor.getValue(); 4129f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein // now mark the interface as up 4139f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein mNetworkObserver.interfaceLinkStateChanged(TEST_INTERFACE_NAME, true); 4149f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein mLooper.dispatchAll(); 4159f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein 4169f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein reset(mNmService, mWifiNative, mContext, mListener); 417aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 418aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein firstObserver.interfaceLinkStateChanged(TEST_INTERFACE_NAME, false); 419aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mLooper.dispatchAll(); 420aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein verify(mNmService, never()).unregisterObserver(eq(mNetworkObserver)); 421d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein verify(mContext, never()).sendStickyBroadcastAsUser(any(), any()); 4229f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein verify(mListener, never()).onStateChanged(anyInt()); 423eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein } 424eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein} 425