ScanOnlyModeManagerTest.java revision aba32c6808bc33bb9164bdc9bc13461abb0fc9e6
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 1926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport static org.mockito.Mockito.*; 2026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 2126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport android.net.wifi.IClientInterface; 2226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport android.os.IBinder; 23aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silbersteinimport android.os.INetworkManagementService; 2426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport android.os.RemoteException; 25eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinimport android.os.test.TestLooper; 26eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinimport android.test.suitebuilder.annotation.SmallTest; 2726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport android.util.Pair; 28eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 29aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silbersteinimport com.android.server.net.BaseNetworkObserver; 30aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 31eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinimport org.junit.Before; 32eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinimport org.junit.Test; 33aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silbersteinimport org.mockito.ArgumentCaptor; 3426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport org.mockito.Mock; 3526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport org.mockito.MockitoAnnotations; 36eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 37eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein/** 38eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * Unit tests for {@link ScanOnlyModeManager}. 39eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein */ 40eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein@SmallTest 41eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinpublic class ScanOnlyModeManagerTest { 42eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein private static final String TAG = "ScanOnlyModeManagerTest"; 4326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein private static final String TEST_INTERFACE_NAME = "testif0"; 44aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein private static final String OTHER_INTERFACE_NAME = "notTestIf"; 45eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 46eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein TestLooper mLooper; 47eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 48eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein ScanOnlyModeManager mScanOnlyModeManager; 49aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein BaseNetworkObserver mNetworkObserver; 50eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 5126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Mock IClientInterface mClientInterface; 5226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Mock IBinder mClientInterfaceBinder; 5326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Mock WifiMetrics mWifiMetrics; 5426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Mock WifiNative mWifiNative; 55aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein @Mock INetworkManagementService mNmService; 56aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 57aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein final ArgumentCaptor<BaseNetworkObserver> mNetworkObserverCaptor = 58aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein ArgumentCaptor.forClass(BaseNetworkObserver.class); 5926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 60eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein @Before 61eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein public void setUp() { 6226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein MockitoAnnotations.initMocks(this); 63eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mLooper = new TestLooper(); 6426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mClientInterface.asBinder()).thenReturn(mClientInterfaceBinder); 6526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 66eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mScanOnlyModeManager = createScanOnlyModeManager(); 6726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mLooper.dispatchAll(); 68eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein } 69eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 70eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein private ScanOnlyModeManager createScanOnlyModeManager() { 71aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein return new ScanOnlyModeManager(mLooper.getLooper(), mWifiNative, mNmService, mWifiMetrics); 7226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein } 7326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 7426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein private void startScanOnlyModeAndVerifyEnabled() throws Exception { 7526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 7626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mClientInterface.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 7726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME))) 7826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface)); 7926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mScanOnlyModeManager.start(); 8026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mLooper.dispatchAll(); 8126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 82aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein verify(mWifiNative).setupForClientMode(eq(TEST_INTERFACE_NAME)); 83aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein verify(mNmService).registerObserver(mNetworkObserverCaptor.capture()); 84aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mNetworkObserver = (BaseNetworkObserver) mNetworkObserverCaptor.getValue(); 85aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 86aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein // now mark the interface as up 87aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mNetworkObserver.interfaceLinkStateChanged(TEST_INTERFACE_NAME, true); 88aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mLooper.dispatchAll(); 89aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 90aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein // TODO: verify WifiScanner is notified about scan mode being ready 9126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein } 9226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 9326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein /** 9426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein * ScanMode start sets up an interface in ClientMode for scanning. 9526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein */ 9626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Test 9726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein public void scanModeStartCreatesClientInterface() throws Exception { 9826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein startScanOnlyModeAndVerifyEnabled(); 99eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein } 100eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 101eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein /** 10226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein * ScanMode increments failure metrics when failing to setup client mode interface due to hal 10326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein * error. 104eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein */ 105eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein @Test 10626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein public void detectAndReportErrorWhenSetupForClientModeHalFailure() throws Exception { 10726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 10826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME))) 10926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein .thenReturn(Pair.create(WifiNative.SETUP_FAILURE_HAL, null)); 110eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mScanOnlyModeManager.start(); 111eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mLooper.dispatchAll(); 11226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 11326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein verify(mWifiMetrics).incrementNumWifiOnFailureDueToHal(); 114eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein } 115eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 116eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein /** 11726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein * ScanMode increments failure metrics when failing to setup client mode interface due to 11826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein * wificond error. 119eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein */ 120eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein @Test 12126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein public void detectAndReportErrorWhenSetupForClientModeWificondFailure() throws Exception { 12226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 12326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME))) 12426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein .thenReturn(Pair.create(WifiNative.SETUP_FAILURE_WIFICOND, null)); 125eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mScanOnlyModeManager.start(); 12626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mLooper.dispatchAll(); 12726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 12826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein verify(mWifiMetrics).incrementNumWifiOnFailureDueToWificond(); 12926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein } 13026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 13126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein /** 13226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein * ScanMode start does not crash when interface creation reports success but returns a null 13326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein * interface. 13426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein */ 13526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Test 13626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein public void scanModeStartDoesNotCrashWhenClientInterfaceIsNull() throws Exception { 13726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 13826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME))) 13926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, null)); 140eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mScanOnlyModeManager.start(); 141eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mLooper.dispatchAll(); 142eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein } 143eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 144eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein /** 14526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein * ScanMode start does not crash when the call to get the interface name throws a 14626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein * RemoteException. 147eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein */ 148eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein @Test 14926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein public void scanModeStartDoesNotCrashWhenGetClientInterfaceNameThrowsException() 15026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein throws Exception { 15126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 15226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein doThrow(new RemoteException()).when(mClientInterface).getInterfaceName(); 15326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME))) 15426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface)); 155eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mScanOnlyModeManager.start(); 15626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mLooper.dispatchAll(); 15726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein } 15826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 15926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein /** 16026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein * ScanMode start does not crash when the interface name is null. 16126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein */ 16226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Test 16326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein public void scanModeStartDoesNotCrashWhenClientInterfaceNameNull() throws Exception { 16426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 16526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mClientInterface.getInterfaceName()).thenReturn(null); 16626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME))) 16726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface)); 16826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mScanOnlyModeManager.start(); 16926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mLooper.dispatchAll(); 17026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein } 17126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 17226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein /** 17326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein * ScanMode start does not crash when the interface name is empty. 17426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein */ 17526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Test 17626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein public void scanModeStartDoesNotCrashWhenClientInterfaceNameIsEmpty() throws Exception { 17726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 17826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mClientInterface.getInterfaceName()).thenReturn(""); 17926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME))) 18026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface)); 18126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mScanOnlyModeManager.start(); 18226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mLooper.dispatchAll(); 18326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein } 18426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 18526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein /** 186aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * Calling ScanOnlyModeManager.start twice does not crash or restart scan mode. 18726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein */ 18826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Test 189aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein public void scanOnlyModeStartCalledTwice() throws Exception { 19026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein startScanOnlyModeAndVerifyEnabled(); 191aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein reset(mWifiNative); 192aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mScanOnlyModeManager.start(); 193eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mLooper.dispatchAll(); 194aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein verifyNoMoreInteractions(mWifiNative); 195eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein } 196eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein 197eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein /** 198aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * ScanMode stop properly cleans up state 19926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein */ 20026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein @Test 201aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein public void scanModeStopCleansUpState() throws Exception { 20226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein startScanOnlyModeAndVerifyEnabled(); 203aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mScanOnlyModeManager.stop(); 20426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein mLooper.dispatchAll(); 205aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein verify(mNmService).unregisterObserver(eq(mNetworkObserver)); 206aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 207aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein //TODO: verify proper notification is sent to WifiScanning service 20826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein } 20926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein 21026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein /** 211eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * Calling stop when ScanMode is not started should not crash. 212eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein */ 213eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein @Test 21426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein public void scanModeStopWhenNotStartedDoesNotCrash() throws Exception { 215aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein startScanOnlyModeAndVerifyEnabled(); 216aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mScanOnlyModeManager.stop(); 217aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mLooper.dispatchAll(); 218aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein reset(mNmService); 219aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 220aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein // now call stop again 221eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mScanOnlyModeManager.stop(); 222eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein mLooper.dispatchAll(); 223aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein //TODO: add checks for broadcasts indicating scanning is disabled in a follow-on CL 224aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein //TODO: confirm callback is triggered with the scan mode failure. 225aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein } 226aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 227aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein /** 228aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * Triggering interface down when ScanOnlyMode is active properly exits the active state. 229aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein */ 230aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein @Test 231aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein public void scanModeStartedStopsWhenInterfaceDown() throws Exception { 232aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein startScanOnlyModeAndVerifyEnabled(); 233aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mNetworkObserver.interfaceLinkStateChanged(TEST_INTERFACE_NAME, false); 234aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mLooper.dispatchAll(); 235aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein verify(mNmService).unregisterObserver(eq(mNetworkObserver)); 236aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein } 237aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 238aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein /** 239aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * This is a basic test that will be enhanced as functionality is added to the class. 240aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * Test that failing to register the Networkobserver for the interface does not crash. Later 241aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * CLs will expand the test to verify proper failure reporting and other error signals. 242aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein */ 243aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein @Test 244aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein public void startScanModeNetworkObserverFailureReportsError() throws Exception { 245aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 246aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein when(mClientInterface.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 247aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME))) 248aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface)); 249aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein doThrow(new RemoteException()).when(mNmService).registerObserver(any()); 250aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 251aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mScanOnlyModeManager.start(); 252aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mLooper.dispatchAll(); 253aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein verify(mNmService).unregisterObserver(any()); 254aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein } 255aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 256aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 257aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein /** 258aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * Triggering interface down for a different interface when ScanOnlyMode is active dows not exit 259aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * the active state. 260aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein */ 261aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein @Test 262aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein public void scanModeStartedDoesNotStopForDifferentInterfaceDown() throws Exception { 263aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein startScanOnlyModeAndVerifyEnabled(); 264aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mNetworkObserver.interfaceLinkStateChanged(OTHER_INTERFACE_NAME, false); 265aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mLooper.dispatchAll(); 266aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein verify(mNmService, never()).unregisterObserver(eq(mNetworkObserver)); 267aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein } 268aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 269aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein /** 270aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * Triggering an interface up for a different interface does not trigger a notification to 271aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * Scanning service that ScanOnlyMode is ready. 272aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * This test will be enhanced when the broadcast is added. 273aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein */ 274aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein @Test 275aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein public void scanModeStartDoesNotNotifyScanningServiceForDifferentInterfaceUp() 276aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein throws Exception { 277aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein startScanOnlyModeAndVerifyEnabled(); 278aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 279aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein // now mark a different interface as up 280aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mNetworkObserver.interfaceLinkStateChanged(OTHER_INTERFACE_NAME, true); 281aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mLooper.dispatchAll(); 282aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 283aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein // TODO: verify WifiScanner is not notified until the proper interface is up 284aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 285aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein } 286aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 287aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein /** 288aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein * Callbacks from an old NetworkObserver do not trigger changes with a current NetworkObserver. 289aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein */ 290aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein @Test 291aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein public void scanModeNetworkObserverCallbacksOnlyForCurrentObserver() throws Exception { 292aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein startScanOnlyModeAndVerifyEnabled(); 293aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein BaseNetworkObserver firstObserver = mNetworkObserver; 294aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mScanOnlyModeManager.stop(); 295aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mLooper.dispatchAll(); 296aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein reset(mNmService, mClientInterfaceBinder, mWifiNative); 297aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein startScanOnlyModeAndVerifyEnabled(); 298aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein 299aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein firstObserver.interfaceLinkStateChanged(TEST_INTERFACE_NAME, false); 300aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein mLooper.dispatchAll(); 301aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein verify(mNmService, never()).unregisterObserver(eq(mNetworkObserver)); 302eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein } 303eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein} 304