1bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein/*
2bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein * Copyright (C) 2016 The Android Open Source Project
3bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein *
4bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein * Licensed under the Apache License, Version 2.0 (the "License");
5bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein * you may not use this file except in compliance with the License.
6bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein * You may obtain a copy of the License at
7bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein *
8bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein *      http://www.apache.org/licenses/LICENSE-2.0
9bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein *
10bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein * Unless required by applicable law or agreed to in writing, software
11bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein * distributed under the License is distributed on an "AS IS" BASIS,
12bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein * See the License for the specific language governing permissions and
14bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein * limitations under the License.
15bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein */
16bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
17bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silbersteinpackage com.android.server.wifi;
18bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
19bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silbersteinimport static org.junit.Assert.assertEquals;
20bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silbersteinimport static org.mockito.Mockito.*;
21bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
22bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silbersteinimport android.net.wifi.IApInterface;
23bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silbersteinimport android.net.wifi.IWificond;
24bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silbersteinimport android.net.wifi.WifiConfiguration;
25bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silbersteinimport android.net.wifi.WifiManager;
26bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silbersteinimport android.os.INetworkManagementService;
27bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silbersteinimport android.os.test.TestLooper;
28bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silbersteinimport android.test.suitebuilder.annotation.SmallTest;
29bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silbersteinimport android.util.Log;
30bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
31bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silbersteinimport org.junit.After;
32bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silbersteinimport org.junit.Before;
33bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silbersteinimport org.junit.Test;
34bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silbersteinimport org.mockito.Mock;
35bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silbersteinimport org.mockito.MockitoAnnotations;
36bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silbersteinimport org.mockito.invocation.InvocationOnMock;
37bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silbersteinimport org.mockito.stubbing.Answer;
38bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
39bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein/**
40bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein * Unit tests for {@link com.android.server.wifi.WifiStateMachinePrime}.
41bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein */
42bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein@SmallTest
43bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silbersteinpublic class WifiStateMachinePrimeTest {
44bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    public static final String TAG = "WifiStateMachinePrimeTest";
45bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
46bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    private static final String CLIENT_MODE_STATE_STRING = "ClientModeState";
47bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    private static final String SCAN_ONLY_MODE_STATE_STRING = "ScanOnlyModeState";
48bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    private static final String SOFT_AP_MODE_STATE_STRING = "SoftAPModeState";
49bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    private static final String WIFI_DISABLED_STATE_STRING = "WifiDisabledState";
50bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    private static final String CLIENT_MODE_ACTIVE_STATE_STRING = "ClientModeActiveState";
51bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    private static final String SCAN_ONLY_MODE_ACTIVE_STATE_STRING = "ScanOnlyModeActiveState";
52bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    private static final String SOFT_AP_MODE_ACTIVE_STATE_STRING = "SoftAPModeActiveState";
53bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
54bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    @Mock WifiInjector mWifiInjector;
55fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    @Mock WifiApConfigStore mWifiApConfigStore;
56bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    TestLooper mLooper;
57bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    @Mock IWificond mWificond;
58bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    @Mock IApInterface mApInterface;
59bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    @Mock INetworkManagementService mNMService;
60bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    @Mock SoftApManager mSoftApManager;
61bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    SoftApManager.Listener mSoftApListener;
62bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    WifiStateMachinePrime mWifiStateMachinePrime;
63bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
64bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    /**
65bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Set up the test environment.
66bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     */
67bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    @Before
68bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    public void setUp() throws Exception {
69bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        Log.d(TAG, "Setting up ...");
70bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
71bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        MockitoAnnotations.initMocks(this);
72bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        mLooper = new TestLooper();
73bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
74bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        mWifiInjector = mock(WifiInjector.class);
75bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        mWifiStateMachinePrime = createWifiStateMachinePrime();
76bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    }
77bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
78bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    private WifiStateMachinePrime createWifiStateMachinePrime() {
79bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        when(mWifiInjector.makeWificond()).thenReturn(null);
80bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        return new WifiStateMachinePrime(mWifiInjector, mLooper.getLooper(), mNMService);
81bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    }
82bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
83bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    /**
84bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Clean up after tests - explicitly set tested object to null.
85bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     */
86bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    @After
87bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    public void cleanUp() throws Exception {
88bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        mWifiStateMachinePrime = null;
89bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    }
90bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
91fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    private void enterSoftApActiveMode() throws Exception {
92fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        enterSoftApActiveMode(null);
93fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    }
94fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein
95bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    /**
96bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Helper method to enter the SoftApActiveMode for WifiStateMachinePrime.
97bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     *
98bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * This method puts the test object into the correct state and verifies steps along the way.
99bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     */
100fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    private void enterSoftApActiveMode(WifiConfiguration wifiConfig) throws Exception {
101bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        String fromState = mWifiStateMachinePrime.getCurrentMode();
102bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        when(mWifiInjector.makeWificond()).thenReturn(mWificond);
103bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        when(mWificond.createApInterface()).thenReturn(mApInterface);
104bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        doAnswer(
105bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein                new Answer<Object>() {
106bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein                    public SoftApManager answer(InvocationOnMock invocation) {
107fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein                        Object[] args = invocation.getArguments();
108fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein                        assertEquals(mNMService, (INetworkManagementService) args[0]);
109fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein                        mSoftApListener = (SoftApManager.Listener) args[1];
110fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein                        assertEquals(mApInterface, (IApInterface) args[2]);
111fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein                        assertEquals(wifiConfig, (WifiConfiguration) args[3]);
112bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein                        return mSoftApManager;
113bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein                    }
114bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein                }).when(mWifiInjector).makeSoftApManager(any(INetworkManagementService.class),
115bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein                                                         any(SoftApManager.Listener.class),
116bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein                                                         any(IApInterface.class),
117ca89072bcd5e04f1c7efec08545958751a49bab1Rebecca Silberstein                                                         any());
118fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mWifiStateMachinePrime.enterSoftAPMode(wifiConfig);
119fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mLooper.dispatchAll();
120bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        Log.e("WifiStateMachinePrimeTest", "check fromState: " + fromState);
121bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        if (!fromState.equals(WIFI_DISABLED_STATE_STRING)) {
122bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein            verify(mWificond).tearDownInterfaces();
123bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        }
124bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        assertEquals(SOFT_AP_MODE_ACTIVE_STATE_STRING, mWifiStateMachinePrime.getCurrentMode());
125bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        verify(mSoftApManager).start();
126bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    }
127bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
128bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    /**
129bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Test that when a new instance of WifiStateMachinePrime is created, any existing interfaces in
130bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * the retrieved Wificond instance are cleaned up.
131bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Expectations:  When the new WifiStateMachinePrime instance is created a call to
132bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Wificond.tearDownInterfaces() is made.
133bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     */
134bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    @Test
135bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    public void testWificondExistsOnStartup() throws Exception {
136bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        when(mWifiInjector.makeWificond()).thenReturn(mWificond);
137bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        WifiStateMachinePrime testWifiStateMachinePrime =
138bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein                new WifiStateMachinePrime(mWifiInjector, mLooper.getLooper(), mNMService);
139bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        verify(mWificond).tearDownInterfaces();
140bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    }
141bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
142bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    /**
143bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Test that WifiStateMachinePrime properly enters the SoftApModeActiveState from the
144bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * WifiDisabled state.
145bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     */
146bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    @Test
147bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    public void testEnterSoftApModeFromDisabled() throws Exception {
148bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        enterSoftApActiveMode();
149bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    }
150bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
151bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    /**
152bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Test that WifiStateMachinePrime properly enters the SoftApModeActiveState from another state.
153bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Expectations: When going from one state to another, any interfaces that are still up are torn
154bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * down.
155bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     */
156bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    @Test
157bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    public void testEnterSoftApModeFromDifferentState() throws Exception {
158bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        when(mWifiInjector.makeWificond()).thenReturn(mWificond);
159bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        mWifiStateMachinePrime.enterClientMode();
160fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mLooper.dispatchAll();
161bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        assertEquals(CLIENT_MODE_STATE_STRING, mWifiStateMachinePrime.getCurrentMode());
162bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        enterSoftApActiveMode();
163bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    }
164bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
165bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    /**
166bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Test that we can disable wifi fully from the SoftApModeActiveState.
167bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     */
168bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    @Test
169bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    public void testDisableWifiFromSoftApModeActiveState() throws Exception {
170bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        enterSoftApActiveMode();
171bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
172bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        mWifiStateMachinePrime.disableWifi();
173fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mLooper.dispatchAll();
174bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        verify(mSoftApManager).stop();
175bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        verify(mWificond).tearDownInterfaces();
176bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        assertEquals(WIFI_DISABLED_STATE_STRING, mWifiStateMachinePrime.getCurrentMode());
177bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    }
178bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
179bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    /**
180bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Test that we can disable wifi fully from the SoftApModeState.
181bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     */
182bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    @Test
183bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    public void testDisableWifiFromSoftApModeState() throws Exception {
184bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        // Use a failure getting wificond to stay in the SoftAPModeState
185bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        when(mWifiInjector.makeWificond()).thenReturn(null);
186fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mWifiStateMachinePrime.enterSoftAPMode(null);
187fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mLooper.dispatchAll();
188bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        assertEquals(SOFT_AP_MODE_STATE_STRING, mWifiStateMachinePrime.getCurrentMode());
189bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
190bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        mWifiStateMachinePrime.disableWifi();
191fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mLooper.dispatchAll();
192bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        // mWificond will be null due to this test, no call to tearDownInterfaces here.
193bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        assertEquals(WIFI_DISABLED_STATE_STRING, mWifiStateMachinePrime.getCurrentMode());
194bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    }
195bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
196bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    /**
197bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Test that we can switch from SoftApActiveMode to another mode.
198bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Expectation: When switching out of SoftApModeActiveState we stop the SoftApManager and tear
199bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * down existing interfaces.
200bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     */
201bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    @Test
202bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    public void testSwitchModeWhenSoftApActiveMode() throws Exception {
203bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        enterSoftApActiveMode();
204bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
205bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        mWifiStateMachinePrime.enterClientMode();
206fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mLooper.dispatchAll();
207bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        verify(mSoftApManager).stop();
208bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        verify(mWificond).tearDownInterfaces();
209bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        assertEquals(CLIENT_MODE_STATE_STRING, mWifiStateMachinePrime.getCurrentMode());
210bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    }
211bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
212bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    /**
213bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Test that we do not attempt to enter SoftApModeActiveState when we cannot get a reference to
214bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * wificond.
215bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Expectations: After a failed attempt to get wificond from WifiInjector, we should remain in
216bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * the SoftApModeState.
217bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     */
218bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    @Test
219bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    public void testWificondNullWhenSwitchingToApMode() throws Exception {
220bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        when(mWifiInjector.makeWificond()).thenReturn(null);
221fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mWifiStateMachinePrime.enterSoftAPMode(null);
222fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mLooper.dispatchAll();
223bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        assertEquals(SOFT_AP_MODE_STATE_STRING, mWifiStateMachinePrime.getCurrentMode());
224bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    }
225bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
226bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    /**
227bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Test that we do not attempt to enter SoftApModeActiveState when we cannot get an ApInterface
228bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * from wificond.
229bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Expectations: After a failed attempt to get an ApInterface from WifiInjector, we should
230bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * remain in the SoftApModeState.
231bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     */
232bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    @Test
233bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    public void testAPInterfaceFailedWhenSwitchingToApMode() throws Exception {
234bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        when(mWifiInjector.makeWificond()).thenReturn(mWificond);
235bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        when(mWificond.createApInterface()).thenReturn(null);
236fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mWifiStateMachinePrime.enterSoftAPMode(null);
237fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mLooper.dispatchAll();
238bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        assertEquals(SOFT_AP_MODE_STATE_STRING, mWifiStateMachinePrime.getCurrentMode());
239bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    }
240bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
241bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    /**
242bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Test that we do can enter the SoftApModeActiveState if we are already in the SoftApModeState.
243bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Expectations: We should exit the current SoftApModeState and re-enter before successfully
244bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * entering the SoftApModeActiveState.
245bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     */
246bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    @Test
247bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    public void testEnterSoftApModeActiveWhenAlreadyInSoftApMode() throws Exception {
248bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        when(mWifiInjector.makeWificond()).thenReturn(mWificond);
249bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        when(mWificond.createApInterface()).thenReturn(null);
250fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mWifiStateMachinePrime.enterSoftAPMode(null);
251fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mLooper.dispatchAll();
252bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        assertEquals(SOFT_AP_MODE_STATE_STRING, mWifiStateMachinePrime.getCurrentMode());
253bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
254bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        enterSoftApActiveMode();
255bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    }
256bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
257bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    /**
258bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Test that we return to the SoftApModeState after a failure is reported when in the
259bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * SoftApModeActiveState.
260bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Expectations: We should exit the SoftApModeActiveState and stop the SoftApManager.
261bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     */
262bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    @Test
263bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    public void testSoftApFailureWhenActive() throws Exception {
264bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        enterSoftApActiveMode();
265bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        // now inject failure through the SoftApManager.Listener
266bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        mSoftApListener.onStateChanged(WifiManager.WIFI_AP_STATE_FAILED, 0);
267fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mLooper.dispatchAll();
268bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        assertEquals(SOFT_AP_MODE_STATE_STRING, mWifiStateMachinePrime.getCurrentMode());
269bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        verify(mSoftApManager).stop();
270bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    }
271bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
272bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    /**
273bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Test that we return to the SoftApModeState after the SoftApManager is stopped in the
274bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * SoftApModeActiveState.
275bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Expectations: We should exit the SoftApModeActiveState and stop the SoftApManager.
276bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     */
277bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    @Test
278bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    public void testSoftApDisabledWhenActive() throws Exception {
279bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        enterSoftApActiveMode();
280bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        // now inject failure through the SoftApManager.Listener
281bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        mSoftApListener.onStateChanged(WifiManager.WIFI_AP_STATE_FAILED, 0);
282fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mLooper.dispatchAll();
283bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        assertEquals(SOFT_AP_MODE_STATE_STRING, mWifiStateMachinePrime.getCurrentMode());
284bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        verify(mSoftApManager).stop();
285bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    }
286bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein
287bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    /**
288fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     * Test that a config passed in to the call to enterSoftApMode is used to create the new
289fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     * SoftApManager.
290fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     * Expectations: We should create a SoftApManager in WifiInjector with the config passed in to
291fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     * WifiStateMachinePrime to switch to SoftApMode.
292fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     */
293fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    @Test
294fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    public void testConfigIsPassedToWifiInjector() throws Exception {
295fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        WifiConfiguration config = new WifiConfiguration();
296fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        config.SSID = "ThisIsAConfig";
297fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        enterSoftApActiveMode(config);
298fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    }
299fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein
300fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    /**
301fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     * Test that when enterSoftAPMode is called with a null config, we pass a null config to
302fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     * WifiInjector.makeSoftApManager.
303fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     *
304fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     * Passing a null config to SoftApManager indicates that the default config should be used.
305fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     *
306fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     * Expectations: WifiInjector should be called with a null config.
307fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     */
308fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    @Test
309fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    public void testNullConfigIsPassedToWifiInjector() throws Exception {
310fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        enterSoftApActiveMode(null);
311fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    }
312fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein
313fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    /**
314fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     * Test that the proper config is used if a prior attempt fails without using the config.
315fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     * Expectations: A call to start softap with a null config fails, but a second call has a set
316fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     * config - this second call should use the correct config.
317fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     */
318fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    @Test
319fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    public void testNullConfigFailsSecondCallWithConfigSuccessful() throws Exception {
320fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        when(mWifiInjector.makeWificond()).thenReturn(mWificond);
321fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        when(mWificond.createApInterface()).thenReturn(null);
322fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mWifiStateMachinePrime.enterSoftAPMode(null);
323fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mLooper.dispatchAll();
324fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        assertEquals(SOFT_AP_MODE_STATE_STRING, mWifiStateMachinePrime.getCurrentMode());
325fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        WifiConfiguration config = new WifiConfiguration();
326fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        config.SSID = "ThisIsAConfig";
327fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        enterSoftApActiveMode(config);
328fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    }
329fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein
330fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    /**
331fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     * Test that a failed call to start softap with a valid config has the config saved for future
332fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     * calls to enable softap.
333fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     *
334fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     * Expectations: A call to start SoftAPMode with a config should write out the config if we
335fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     * did not create a SoftApManager.
336fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     */
337fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    @Test
338fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    public void testValidConfigIsSavedOnFailureToStart() throws Exception {
339fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        when(mWifiInjector.makeWificond()).thenReturn(null);
340fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        when(mWifiInjector.getWifiApConfigStore()).thenReturn(mWifiApConfigStore);
341fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        WifiConfiguration config = new WifiConfiguration();
342fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        config.SSID = "ThisIsAConfig";
343fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mWifiStateMachinePrime.enterSoftAPMode(config);
344fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mLooper.dispatchAll();
345fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        assertEquals(SOFT_AP_MODE_STATE_STRING, mWifiStateMachinePrime.getCurrentMode());
346fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        verify(mWifiApConfigStore).setApConfiguration(eq(config));
347fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    }
348fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein
349fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    /**
350fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     * Thest that two calls to switch to SoftAPMode in succession ends up with the correct config.
351fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     *
352fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     * Expectation: we should end up in SoftAPMode state configured with the second config.
353fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein     */
354fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    @Test
355fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    public void testStartSoftApModeTwiceWithTwoConfigs() throws Exception {
356fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        when(mWifiInjector.makeWificond()).thenReturn(mWificond);
357fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        when(mWificond.createApInterface()).thenReturn(mApInterface);
358fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        when(mWifiInjector.getWifiApConfigStore()).thenReturn(mWifiApConfigStore);
359fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        WifiConfiguration config1 = new WifiConfiguration();
360fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        config1.SSID = "ThisIsAConfig";
361fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        WifiConfiguration config2 = new WifiConfiguration();
362fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        config2.SSID = "ThisIsASecondConfig";
363fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein
364fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        when(mWifiInjector.makeSoftApManager(any(INetworkManagementService.class),
365fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein                                             any(SoftApManager.Listener.class),
366fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein                                             any(IApInterface.class),
367fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein                                             eq(config1)))
368fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein                .thenReturn(mSoftApManager);
369fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        when(mWifiInjector.makeSoftApManager(any(INetworkManagementService.class),
370fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein                                             any(SoftApManager.Listener.class),
371fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein                                             any(IApInterface.class),
372fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein                                             eq(config2)))
373fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein                .thenReturn(mSoftApManager);
374fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein
375fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein
376fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mWifiStateMachinePrime.enterSoftAPMode(config1);
377fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mWifiStateMachinePrime.enterSoftAPMode(config2);
378fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        mLooper.dispatchAll();
379fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein        assertEquals(SOFT_AP_MODE_ACTIVE_STATE_STRING, mWifiStateMachinePrime.getCurrentMode());
380fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    }
381fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein
382fa528234cf518fda63435cf9c4956576d64e8860Rebecca Silberstein    /**
383bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Test that we safely disable wifi if it is already disabled.
384bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * Expectations: We should not interact with wificond since we should have already cleaned up
385bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     * everything.
386bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein     */
387bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    @Test
388bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    public void disableWifiWhenAlreadyOff() throws Exception {
389bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        verifyNoMoreInteractions(mWificond);
390bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein        mWifiStateMachinePrime.disableWifi();
391bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein    }
392bfc30bd4c2ff0c62d6cfff22088a935878966a46Rebecca Silberstein}
393