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