18ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silberstein/* 28ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silberstein * Copyright (C) 2016 The Android Open Source Project 38ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silberstein * 48ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silberstein * Licensed under the Apache License, Version 2.0 (the "License"); 58ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silberstein * you may not use this file except in compliance with the License. 68ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silberstein * You may obtain a copy of the License at 78ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silberstein * 88ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silberstein * http://www.apache.org/licenses/LICENSE-2.0 98ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silberstein * 108ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silberstein * Unless required by applicable law or agreed to in writing, software 118ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silberstein * distributed under the License is distributed on an "AS IS" BASIS, 128ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silberstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silberstein * See the License for the specific language governing permissions and 148ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silberstein * limitations under the License. 158ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silberstein */ 1679a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 1779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpandepackage com.android.server.wifi; 1879a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 199563500603c158373e2ee512c4d451783c104660Rebecca Silbersteinimport static android.net.wifi.WifiManager.WIFI_MODE_FULL; 209563500603c158373e2ee512c4d451783c104660Rebecca Silberstein 21191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silbersteinimport static com.android.server.wifi.WifiController.CMD_AP_STOPPED; 229563500603c158373e2ee512c4d451783c104660Rebecca Silbersteinimport static com.android.server.wifi.WifiController.CMD_DEVICE_IDLE; 238ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silbersteinimport static com.android.server.wifi.WifiController.CMD_EMERGENCY_CALL_STATE_CHANGED; 248ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silbersteinimport static com.android.server.wifi.WifiController.CMD_EMERGENCY_MODE_CHANGED; 255f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silbersteinimport static com.android.server.wifi.WifiController.CMD_RESTART_WIFI; 26191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silbersteinimport static com.android.server.wifi.WifiController.CMD_SET_AP; 278ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silbersteinimport static com.android.server.wifi.WifiController.CMD_WIFI_TOGGLED; 288ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silberstein 298ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silbersteinimport static org.junit.Assert.assertEquals; 308ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silbersteinimport static org.mockito.Matchers.*; 318ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silbersteinimport static org.mockito.Mockito.*; 3279a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 3379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpandeimport android.content.ContentResolver; 3479a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpandeimport android.content.Context; 359563500603c158373e2ee512c4d451783c104660Rebecca Silbersteinimport android.os.WorkSource; 3679a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpandeimport android.test.suitebuilder.annotation.SmallTest; 3779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpandeimport android.util.Log; 3879a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 3979a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpandeimport com.android.internal.util.IState; 4079a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpandeimport com.android.internal.util.StateMachine; 4179a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 4279a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpandeimport org.junit.After; 4379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpandeimport org.junit.Before; 4479a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpandeimport org.junit.Test; 45191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silbersteinimport org.mockito.InOrder; 4679a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpandeimport org.mockito.Mock; 4779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpandeimport org.mockito.MockitoAnnotations; 4879a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 4979a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpandeimport java.io.ByteArrayOutputStream; 5079a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpandeimport java.io.PrintWriter; 5179a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpandeimport java.lang.reflect.Method; 5279a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 538ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silberstein/** 548ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silberstein * Test WifiController for changes in and out of ECM and SoftAP modes. 558ec7811cb6db1d605ed95060f3f792f2221cee88Rebecca Silberstein */ 5679a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande@SmallTest 5779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpandepublic class WifiControllerTest { 5879a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 5979a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande private static final String TAG = "WifiControllerTest"; 6079a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 6179a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande private void dumpState() { 6279a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande ByteArrayOutputStream stream = new ByteArrayOutputStream(); 6379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande PrintWriter writer = new PrintWriter(stream); 6479a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.dump(null, writer, null); 6579a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande writer.flush(); 6679a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande Log.d(TAG, "WifiStateMachine state -" + stream.toString()); 6779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande } 6879a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 6979a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande private IState getCurrentState() throws Exception { 7079a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande Method method = StateMachine.class.getDeclaredMethod("getCurrentState"); 7179a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande method.setAccessible(true); 7279a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande return (IState) method.invoke(mWifiController); 7379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande } 7479a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 7579a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande private void initializeSettingsStore() throws Exception { 7679a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande when(mSettingsStore.isAirplaneModeOn()).thenReturn(false); 7779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande when(mSettingsStore.isWifiToggleEnabled()).thenReturn(false); 7879a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande when(mSettingsStore.isScanAlwaysAvailable()).thenReturn(true); 7979a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande } 8079a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 8179a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande MockLooper mLooper; 8279a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande @Mock Context mContext; 8379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande @Mock WifiServiceImpl mService; 8479a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande @Mock FrameworkFacade mFacade; 8579a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande @Mock WifiSettingsStore mSettingsStore; 8679a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande @Mock WifiStateMachine mWifiStateMachine; 879563500603c158373e2ee512c4d451783c104660Rebecca Silberstein @Mock WifiLockManager mWifiLockManager; 8879a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 8979a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande WifiController mWifiController; 9079a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 9179a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande @Before 9279a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande public void setUp() throws Exception { 9379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande MockitoAnnotations.initMocks(this); 9479a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 9579a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper = new MockLooper(); 9679a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 9779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande initializeSettingsStore(); 9879a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 9979a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande when(mContext.getContentResolver()).thenReturn(mock(ContentResolver.class)); 10079a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 10179a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController = new WifiController(mContext, mWifiStateMachine, 1029563500603c158373e2ee512c4d451783c104660Rebecca Silberstein mSettingsStore, mWifiLockManager, mLooper.getLooper(), mFacade); 10379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 10479a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.start(); 10579a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 10679a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande } 10779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 10879a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande @After 10979a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande public void cleanUp() { 11079a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 11179a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande } 11279a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 11379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande @Test 11479a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande public void enableWifi() throws Exception { 11579a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande assertEquals("StaDisabledWithScanState", getCurrentState().getName()); 11679a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 11779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande when(mSettingsStore.isWifiToggleEnabled()).thenReturn(true); 11879a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_WIFI_TOGGLED); 11979a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 12079a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande assertEquals("DeviceActiveState", getCurrentState().getName()); 12179a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 12279a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande when(mSettingsStore.isWifiToggleEnabled()).thenReturn(false); 12379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_WIFI_TOGGLED); 12479a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 12579a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande assertEquals("StaDisabledWithScanState", getCurrentState().getName()); 12679a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 12779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande when(mSettingsStore.isWifiToggleEnabled()).thenReturn(true); 12879a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_WIFI_TOGGLED); 12979a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 13079a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande assertEquals("DeviceActiveState", getCurrentState().getName()); 13179a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande } 13279a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 13379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande @Test 1342225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt public void testEcmOn() throws Exception { 13579a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande enableWifi(); 13679a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 1372225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt // Test with WifiDisableInECBM turned on: 1382225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt when(mFacade.getConfigWiFiDisableInECBM(mContext)).thenReturn(true); 1392225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt doTestEcm(true); 1402225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt } 1412225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt 1422225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt @Test 1432225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt public void testEcmOff() throws Exception { 1442225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt enableWifi(); 1452225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt 1462225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt // Test with WifiDisableInECBM turned off 1472225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt when(mFacade.getConfigWiFiDisableInECBM(mContext)).thenReturn(false); 1482225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt doTestEcm(false); 1492225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt } 1502225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt 1512225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt private void assertInEcm(boolean ecmEnabled) throws Exception { 1522225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt if (ecmEnabled) { 1532225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt assertEquals("EcmState", getCurrentState().getName()); 1542225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt } else { 1552225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt assertEquals("DeviceActiveState", getCurrentState().getName()); 1562225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt } 1572225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt } 1582225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt 1592225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt 1602225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt private void doTestEcm(boolean ecmEnabled) throws Exception { 1612225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt 16279a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande // test ecm changed 16379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_EMERGENCY_MODE_CHANGED, 1); 16479a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 1652225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt assertInEcm(ecmEnabled); 16679a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 16779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_EMERGENCY_MODE_CHANGED, 0); 16879a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 16979a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande assertEquals("DeviceActiveState", getCurrentState().getName()); 17079a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 17179a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande // test call state changed 17279a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_EMERGENCY_CALL_STATE_CHANGED, 1); 17379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 1742225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt assertInEcm(ecmEnabled); 17579a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 17679a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_EMERGENCY_CALL_STATE_CHANGED, 0); 17779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 17879a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande assertEquals("DeviceActiveState", getCurrentState().getName()); 17979a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 18079a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 18179a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande // test both changed (variation 1 - the good case) 18279a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_EMERGENCY_CALL_STATE_CHANGED, 1); 18379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 1842225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt assertInEcm(ecmEnabled); 18579a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 18679a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_EMERGENCY_MODE_CHANGED, 1); 18779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 1882225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt assertInEcm(ecmEnabled); 18979a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 19079a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_EMERGENCY_CALL_STATE_CHANGED, 0); 19179a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 1922225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt assertInEcm(ecmEnabled); 19379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 19479a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_EMERGENCY_MODE_CHANGED, 0); 19579a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 19679a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande assertEquals("DeviceActiveState", getCurrentState().getName()); 19779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 19879a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande // test both changed (variation 2 - emergency call in ecm) 19979a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_EMERGENCY_MODE_CHANGED, 1); 20079a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 2012225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt assertInEcm(ecmEnabled); 20279a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 20379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_EMERGENCY_CALL_STATE_CHANGED, 1); 20479a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 2052225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt assertInEcm(ecmEnabled); 20679a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 20779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_EMERGENCY_CALL_STATE_CHANGED, 0); 20879a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 2092225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt assertInEcm(ecmEnabled); 21079a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 21179a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_EMERGENCY_MODE_CHANGED, 0); 21279a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 21379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande assertEquals("DeviceActiveState", getCurrentState().getName()); 21479a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 21579a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande // test both changed (variation 3 - not so good order of events) 21679a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_EMERGENCY_CALL_STATE_CHANGED, 1); 21779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 2182225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt assertInEcm(ecmEnabled); 21979a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 22079a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_EMERGENCY_MODE_CHANGED, 1); 22179a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 2222225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt assertInEcm(ecmEnabled); 22379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 22479a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_EMERGENCY_MODE_CHANGED, 0); 22579a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 2262225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt assertInEcm(ecmEnabled); 22779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 22879a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_EMERGENCY_CALL_STATE_CHANGED, 0); 22979a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 23079a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande assertEquals("DeviceActiveState", getCurrentState().getName()); 23179a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 23279a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande // test that Wifi toggle doesn't exit Ecm 23379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_EMERGENCY_CALL_STATE_CHANGED, 1); 23479a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 2352225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt assertInEcm(ecmEnabled); 23679a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 23779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande when(mSettingsStore.isWifiToggleEnabled()).thenReturn(true); 23879a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_WIFI_TOGGLED); 23979a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 2402225e1eb8c27a2f0c8bb650d248cd2e041517941Robert Greenwalt assertInEcm(ecmEnabled); 24179a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande 24279a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mWifiController.sendMessage(CMD_EMERGENCY_CALL_STATE_CHANGED, 0); 24379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande mLooper.dispatchAll(); 24479a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande assertEquals("DeviceActiveState", getCurrentState().getName()); 24579a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande } 246191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein 247191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein /** 248191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein * When AP mode is enabled and wifi was previously in AP mode, we should return to 249191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein * DeviceActiveState after the AP is disabled. 250191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein * Enter DeviceActiveState, activate AP mode, disable AP mode. 251191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein * <p> 252191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein * Expected: AP should successfully start and exit, then return to DeviceActiveState. 253191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein */ 254191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein @Test 255191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein public void testReturnToDeviceActiveStateAfterAPModeShutdown() throws Exception { 256191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein enableWifi(); 257191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein assertEquals("DeviceActiveState", getCurrentState().getName()); 258191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein 259191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein mWifiController.obtainMessage(CMD_SET_AP, 1, 0).sendToTarget(); 260191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein mLooper.dispatchAll(); 261191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein assertEquals("ApEnabledState", getCurrentState().getName()); 262191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein 263191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein when(mSettingsStore.getWifiSavedState()).thenReturn(1); 264191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein mWifiController.obtainMessage(CMD_AP_STOPPED).sendToTarget(); 265191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein mLooper.dispatchAll(); 26624750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein 26724750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein InOrder inOrder = inOrder(mWifiStateMachine); 26824750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein inOrder.verify(mWifiStateMachine).setSupplicantRunning(true); 26924750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein inOrder.verify(mWifiStateMachine).setOperationalMode(WifiStateMachine.CONNECT_MODE); 27024750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein inOrder.verify(mWifiStateMachine).setDriverStart(true); 27124750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein assertEquals("DeviceActiveState", getCurrentState().getName()); 27224750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein } 27324750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein 27424750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein /** 27524750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein * When AP mode is enabled and wifi is toggled on, we should transition to 27624750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein * DeviceActiveState after the AP is disabled. 27724750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein * Enter DeviceActiveState, activate AP mode, toggle WiFi. 27824750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein * <p> 27924750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein * Expected: AP should successfully start and exit, then return to DeviceActiveState. 28024750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein */ 28124750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein @Test 28224750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein public void testReturnToDeviceActiveStateAfterWifiEnabledShutdown() throws Exception { 28324750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein enableWifi(); 28424750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein assertEquals("DeviceActiveState", getCurrentState().getName()); 28524750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein 28624750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein mWifiController.obtainMessage(CMD_SET_AP, 1, 0).sendToTarget(); 28724750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein mLooper.dispatchAll(); 28824750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein assertEquals("ApEnabledState", getCurrentState().getName()); 28924750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein 29024750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein when(mSettingsStore.isWifiToggleEnabled()).thenReturn(true); 29124750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein mWifiController.obtainMessage(CMD_WIFI_TOGGLED).sendToTarget(); 29224750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein mWifiController.obtainMessage(CMD_AP_STOPPED).sendToTarget(); 29324750cd1f8148d6a935bda96f3b17f22b0c1d8bdRebecca Silberstein mLooper.dispatchAll(); 294191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein 295191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein InOrder inOrder = inOrder(mWifiStateMachine); 296191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein inOrder.verify(mWifiStateMachine).setSupplicantRunning(true); 297191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein inOrder.verify(mWifiStateMachine).setOperationalMode(WifiStateMachine.CONNECT_MODE); 298191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein inOrder.verify(mWifiStateMachine).setDriverStart(true); 299191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein assertEquals("DeviceActiveState", getCurrentState().getName()); 300191fa5b445e8cfd0fa2c4aa7458776ab7a3972f7Rebecca Silberstein } 3019563500603c158373e2ee512c4d451783c104660Rebecca Silberstein 3029563500603c158373e2ee512c4d451783c104660Rebecca Silberstein /** 3039563500603c158373e2ee512c4d451783c104660Rebecca Silberstein * When the wifi device is idle, AP mode is enabled and disabled 3049563500603c158373e2ee512c4d451783c104660Rebecca Silberstein * we should return to the appropriate Idle state. 3059563500603c158373e2ee512c4d451783c104660Rebecca Silberstein * Enter DeviceActiveState, indicate idle device, activate AP mode, disable AP mode. 3069563500603c158373e2ee512c4d451783c104660Rebecca Silberstein * <p> 3079563500603c158373e2ee512c4d451783c104660Rebecca Silberstein * Expected: AP should successfully start and exit, then return to a device idle state. 3089563500603c158373e2ee512c4d451783c104660Rebecca Silberstein */ 3099563500603c158373e2ee512c4d451783c104660Rebecca Silberstein @Test 3109563500603c158373e2ee512c4d451783c104660Rebecca Silberstein public void testReturnToDeviceIdleStateAfterAPModeShutdown() throws Exception { 3119563500603c158373e2ee512c4d451783c104660Rebecca Silberstein enableWifi(); 3129563500603c158373e2ee512c4d451783c104660Rebecca Silberstein assertEquals("DeviceActiveState", getCurrentState().getName()); 3139563500603c158373e2ee512c4d451783c104660Rebecca Silberstein 3149563500603c158373e2ee512c4d451783c104660Rebecca Silberstein // make sure mDeviceIdle is set to true 3159563500603c158373e2ee512c4d451783c104660Rebecca Silberstein when(mWifiLockManager.getStrongestLockMode()).thenReturn(WIFI_MODE_FULL); 3169563500603c158373e2ee512c4d451783c104660Rebecca Silberstein when(mWifiLockManager.createMergedWorkSource()).thenReturn(new WorkSource()); 3179563500603c158373e2ee512c4d451783c104660Rebecca Silberstein mWifiController.sendMessage(CMD_DEVICE_IDLE); 3189563500603c158373e2ee512c4d451783c104660Rebecca Silberstein mLooper.dispatchAll(); 3199563500603c158373e2ee512c4d451783c104660Rebecca Silberstein assertEquals("FullLockHeldState", getCurrentState().getName()); 3209563500603c158373e2ee512c4d451783c104660Rebecca Silberstein 3219563500603c158373e2ee512c4d451783c104660Rebecca Silberstein mWifiController.obtainMessage(CMD_SET_AP, 1, 0).sendToTarget(); 3229563500603c158373e2ee512c4d451783c104660Rebecca Silberstein mLooper.dispatchAll(); 3239563500603c158373e2ee512c4d451783c104660Rebecca Silberstein assertEquals("ApEnabledState", getCurrentState().getName()); 3249563500603c158373e2ee512c4d451783c104660Rebecca Silberstein 3259563500603c158373e2ee512c4d451783c104660Rebecca Silberstein when(mSettingsStore.getWifiSavedState()).thenReturn(1); 3269563500603c158373e2ee512c4d451783c104660Rebecca Silberstein mWifiController.obtainMessage(CMD_AP_STOPPED).sendToTarget(); 3279563500603c158373e2ee512c4d451783c104660Rebecca Silberstein mLooper.dispatchAll(); 3289563500603c158373e2ee512c4d451783c104660Rebecca Silberstein 3299563500603c158373e2ee512c4d451783c104660Rebecca Silberstein InOrder inOrder = inOrder(mWifiStateMachine); 3309563500603c158373e2ee512c4d451783c104660Rebecca Silberstein inOrder.verify(mWifiStateMachine).setSupplicantRunning(true); 3319563500603c158373e2ee512c4d451783c104660Rebecca Silberstein inOrder.verify(mWifiStateMachine).setOperationalMode(WifiStateMachine.CONNECT_MODE); 3329563500603c158373e2ee512c4d451783c104660Rebecca Silberstein inOrder.verify(mWifiStateMachine).setDriverStart(true); 3339563500603c158373e2ee512c4d451783c104660Rebecca Silberstein assertEquals("FullLockHeldState", getCurrentState().getName()); 3349563500603c158373e2ee512c4d451783c104660Rebecca Silberstein } 3355f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein 3365f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein /** 3375f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * The command to trigger a WiFi reset should not trigger any action by WifiController if we 3385f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * are not in STA mode. 3395f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * WiFi is not in connect mode, so any calls to reset the wifi stack due to connection failures 3405f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * should be ignored. 3415f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * Create and start WifiController in ApStaDisabledState, send command to restart WiFi 3425f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * <p> 3435f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * Expected: WiFiController should not call WifiStateMachine.setSupplicantRunning(false) 3445f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein */ 3455f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein @Test 3465f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein public void testRestartWifiStackInApStaDisabledState() throws Exception { 3475f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein // Start a new WifiController with wifi disabled 3485f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein when(mSettingsStore.isAirplaneModeOn()).thenReturn(false); 3495f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein when(mSettingsStore.isWifiToggleEnabled()).thenReturn(false); 3505f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein when(mSettingsStore.isScanAlwaysAvailable()).thenReturn(false); 3515f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein 3525f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein when(mContext.getContentResolver()).thenReturn(mock(ContentResolver.class)); 3535f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein 3545f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein mWifiController = new WifiController(mContext, mWifiStateMachine, 3555f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein mSettingsStore, mWifiLockManager, mLooper.getLooper(), mFacade); 3565f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein 3575f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein mWifiController.start(); 3585f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein mLooper.dispatchAll(); 3595f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein 3605f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein reset(mWifiStateMachine); 3615f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein assertEquals("ApStaDisabledState", getCurrentState().getName()); 3625f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein mWifiController.sendMessage(CMD_RESTART_WIFI); 3635f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein mLooper.dispatchAll(); 3645f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein verifyZeroInteractions(mWifiStateMachine); 3655f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein } 3665f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein 3675f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein /** 3685f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * The command to trigger a WiFi reset should not trigger any action by WifiController if we 3695f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * are not in STA mode, even if scans are allowed. 3705f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * WiFi is not in connect mode, so any calls to reset the wifi stack due to connection failures 3715f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * should be ignored. 3725f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * Create and start WifiController in StaDisablediWithScanState, send command to restart WiFi 3735f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * <p> 3745f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * Expected: WiFiController should not call WifiStateMachine.setSupplicantRunning(false) 3755f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein */ 3765f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein @Test 3775f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein public void testRestartWifiStackInStaDisabledWithScanState() throws Exception { 3785f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein reset(mWifiStateMachine); 3795f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein assertEquals("StaDisabledWithScanState", getCurrentState().getName()); 3805f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein mWifiController.sendMessage(CMD_RESTART_WIFI); 3815f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein mLooper.dispatchAll(); 3825f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein verifyZeroInteractions(mWifiStateMachine); 3835f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein } 3845f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein 3855f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein /** 3865f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * The command to trigger a WiFi reset should trigger a wifi reset in WifiStateMachine through 3875f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * the WifiStateMachine.setSupplicantRunning(false) call when in STA mode. 3885f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * WiFi is in connect mode, calls to reset the wifi stack due to connection failures 3895f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * should trigger a supplicant stop, and subsequently, a driver reload. 3905f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * Create and start WifiController in DeviceActiveState, send command to restart WiFi 3915f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * <p> 3925f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * Expected: WiFiController should call WifiStateMachine.setSupplicantRunning(false), 3935f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * WifiStateMachine should enter CONNECT_MODE and the wifi driver should be started. 3945f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein */ 3955f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein @Test 3965f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein public void testRestartWifiStackInStaEnabledState() throws Exception { 3975f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein enableWifi(); 3985f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein 3995f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein reset(mWifiStateMachine); 4005f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein assertEquals("DeviceActiveState", getCurrentState().getName()); 4015f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein mWifiController.sendMessage(CMD_RESTART_WIFI); 4025f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein mLooper.dispatchAll(); 4035f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein InOrder inOrder = inOrder(mWifiStateMachine); 4045f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein inOrder.verify(mWifiStateMachine).setSupplicantRunning(false); 4055f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein inOrder.verify(mWifiStateMachine).setSupplicantRunning(true); 4065f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein inOrder.verify(mWifiStateMachine).setOperationalMode(WifiStateMachine.CONNECT_MODE); 4075f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein inOrder.verify(mWifiStateMachine).setDriverStart(true); 4085f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein assertEquals("DeviceActiveState", getCurrentState().getName()); 4095f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein } 4105f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein 4115f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein /** 4125f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * The command to trigger a WiFi reset should not trigger a reset when in ECM mode. 4135f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * Enable wifi and enter ECM state, send command to restart wifi. 4145f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * <p> 4155f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * Expected: The command to trigger a wifi reset should be ignored and we should remain in ECM 4165f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * mode. 4175f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein */ 4185f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein @Test 4195f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein public void testRestartWifiStackDoesNotExitECMMode() throws Exception { 4205f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein enableWifi(); 4215f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein assertEquals("DeviceActiveState", getCurrentState().getName()); 4225f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein when(mFacade.getConfigWiFiDisableInECBM(mContext)).thenReturn(true); 4235f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein 4245f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein mWifiController.sendMessage(CMD_EMERGENCY_CALL_STATE_CHANGED, 1); 4255f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein mLooper.dispatchAll(); 4265f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein assertInEcm(true); 4275f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein 4285f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein reset(mWifiStateMachine); 4295f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein mWifiController.sendMessage(CMD_RESTART_WIFI); 4305f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein mLooper.dispatchAll(); 4315f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein assertInEcm(true); 4325f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein verifyZeroInteractions(mWifiStateMachine); 4335f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein } 4345f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein 4355f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein /** 4365f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * The command to trigger a WiFi reset should not trigger a reset when in AP mode. 4375f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * Enter AP mode, send command to restart wifi. 4385f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * <p> 4395f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * Expected: The command to trigger a wifi reset should be ignored and we should remain in AP 4405f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein * mode. 4415f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein */ 4425f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein @Test 4435f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein public void testRestartWifiStackDoesNotExitAPMode() throws Exception { 4445f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein mWifiController.obtainMessage(CMD_SET_AP, 1).sendToTarget(); 4455f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein mLooper.dispatchAll(); 4465f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein assertEquals("ApEnabledState", getCurrentState().getName()); 4475f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein 4485f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein reset(mWifiStateMachine); 4495f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein mWifiController.sendMessage(CMD_RESTART_WIFI); 4505f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein mLooper.dispatchAll(); 4515f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein verifyZeroInteractions(mWifiStateMachine); 4525f0238c0d7b4b037dcb1c397217eb65dcfbf53ceRebecca Silberstein } 45379a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande} 454