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