1e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu/* 2e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * Copyright (C) 2016 The Android Open Source Project 3e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * 4e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * Licensed under the Apache License, Version 2.0 (the "License"); 5e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * you may not use this file except in compliance with the License. 6e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * You may obtain a copy of the License at 7e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * 8e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * http://www.apache.org/licenses/LICENSE-2.0 9e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * 10e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * Unless required by applicable law or agreed to in writing, software 11e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * distributed under the License is distributed on an "AS IS" BASIS, 12e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * See the License for the specific language governing permissions and 14e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * limitations under the License. 15e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu */ 16e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 17e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiupackage com.android.server.wifi; 18e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 19e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.any; 20974f4ecb02b4560f18bfdaed3f6a2c78e5d42ee0Christopher Wileyimport static org.mockito.Mockito.anyBoolean; 21e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.anyInt; 22e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.eq; 23e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.inOrder; 24e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.never; 25e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.verify; 26e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.when; 27e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 28e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.net.InterfaceConfiguration; 29736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wileyimport android.net.wifi.IApInterface; 30e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.net.wifi.WifiConfiguration; 31e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.net.wifi.WifiManager; 32736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wileyimport android.os.IBinder; 33736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wileyimport android.os.IBinder.DeathRecipient; 34fe3e7f39c4acf1517b31d6ff7123d075c1e6de25Christopher Wileyimport android.os.INetworkManagementService; 35f4267b6840dbc7f430638c35c5448187b6e83846Christopher Wileyimport android.os.test.TestLooper; 36e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.test.suitebuilder.annotation.SmallTest; 37e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 38fe3e7f39c4acf1517b31d6ff7123d075c1e6de25Christopher Wileyimport com.android.server.net.BaseNetworkObserver; 39fe3e7f39c4acf1517b31d6ff7123d075c1e6de25Christopher Wiley 40e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport org.junit.Before; 41e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport org.junit.Test; 42736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wileyimport org.mockito.ArgumentCaptor; 43e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport org.mockito.InOrder; 44e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport org.mockito.Mock; 45e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport org.mockito.MockitoAnnotations; 46e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 4779d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silbersteinimport java.nio.charset.StandardCharsets; 48e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport java.util.ArrayList; 49e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport java.util.Arrays; 50e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport java.util.Locale; 51e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 52be40e20f6995d9d11c8270502120a07785dde270Daniel Erat/** Unit tests for {@link SoftApManager}. */ 53e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu@SmallTest 54e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiupublic class SoftApManagerTest { 55e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 56e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu private static final String TAG = "SoftApManagerTest"; 57e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 5879d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein private static final String DEFAULT_SSID = "DefaultTestSSID"; 59974f4ecb02b4560f18bfdaed3f6a2c78e5d42ee0Christopher Wiley private static final String TEST_SSID = "TestSSID"; 60e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu private static final String TEST_COUNTRY_CODE = "TestCountry"; 61e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu private static final Integer[] ALLOWED_2G_CHANNELS = {1, 2, 3, 4}; 62fe3e7f39c4acf1517b31d6ff7123d075c1e6de25Christopher Wiley private static final String TEST_INTERFACE_NAME = "testif0"; 63e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 64e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu private final ArrayList<Integer> mAllowed2GChannels = 65974f4ecb02b4560f18bfdaed3f6a2c78e5d42ee0Christopher Wiley new ArrayList<>(Arrays.asList(ALLOWED_2G_CHANNELS)); 66e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 6779d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein private final WifiConfiguration mDefaultApConfig = createDefaultApConfig(); 6879d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein 69f4267b6840dbc7f430638c35c5448187b6e83846Christopher Wiley TestLooper mLooper; 70e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu @Mock WifiNative mWifiNative; 71e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu @Mock SoftApManager.Listener mListener; 72be40e20f6995d9d11c8270502120a07785dde270Daniel Erat @Mock InterfaceConfiguration mInterfaceConfiguration; 73736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wiley @Mock IBinder mApInterfaceBinder; 74974f4ecb02b4560f18bfdaed3f6a2c78e5d42ee0Christopher Wiley @Mock IApInterface mApInterface; 75fe3e7f39c4acf1517b31d6ff7123d075c1e6de25Christopher Wiley @Mock INetworkManagementService mNmService; 7679d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein @Mock WifiApConfigStore mWifiApConfigStore; 7780a1468c75b0db36e58de767c74f7c15e9aa55e3Rebecca Silberstein @Mock WifiMetrics mWifiMetrics; 78736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wiley final ArgumentCaptor<DeathRecipient> mDeathListenerCaptor = 79736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wiley ArgumentCaptor.forClass(DeathRecipient.class); 80fe3e7f39c4acf1517b31d6ff7123d075c1e6de25Christopher Wiley final ArgumentCaptor<BaseNetworkObserver> mNetworkObserverCaptor = 81fe3e7f39c4acf1517b31d6ff7123d075c1e6de25Christopher Wiley ArgumentCaptor.forClass(BaseNetworkObserver.class); 82e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 83e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu SoftApManager mSoftApManager; 84e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 85be40e20f6995d9d11c8270502120a07785dde270Daniel Erat /** Sets up test. */ 86e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu @Before 87e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu public void setUp() throws Exception { 88e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu MockitoAnnotations.initMocks(this); 89f4267b6840dbc7f430638c35c5448187b6e83846Christopher Wiley mLooper = new TestLooper(); 90e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 91736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wiley when(mApInterface.asBinder()).thenReturn(mApInterfaceBinder); 92974f4ecb02b4560f18bfdaed3f6a2c78e5d42ee0Christopher Wiley when(mApInterface.startHostapd()).thenReturn(true); 93974f4ecb02b4560f18bfdaed3f6a2c78e5d42ee0Christopher Wiley when(mApInterface.stopHostapd()).thenReturn(true); 94974f4ecb02b4560f18bfdaed3f6a2c78e5d42ee0Christopher Wiley when(mApInterface.writeHostapdConfig( 95974f4ecb02b4560f18bfdaed3f6a2c78e5d42ee0Christopher Wiley any(), anyBoolean(), anyInt(), anyInt(), any())).thenReturn(true); 96fe3e7f39c4acf1517b31d6ff7123d075c1e6de25Christopher Wiley when(mApInterface.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 9779d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein } 98be40e20f6995d9d11c8270502120a07785dde270Daniel Erat 9979d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein private WifiConfiguration createDefaultApConfig() { 10079d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein WifiConfiguration defaultConfig = new WifiConfiguration(); 10179d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein defaultConfig.SSID = DEFAULT_SSID; 10279d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein return defaultConfig; 10379d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein } 104e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 10579d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein private SoftApManager createSoftApManager(WifiConfiguration config) throws Exception { 10679d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein when(mApInterface.asBinder()).thenReturn(mApInterfaceBinder); 10779d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein when(mApInterface.startHostapd()).thenReturn(true); 10879d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein when(mApInterface.stopHostapd()).thenReturn(true); 1094e0a1bafa7a86e2840c855846f3fdaee9cd00424Rebecca Silberstein if (config == null) { 1104e0a1bafa7a86e2840c855846f3fdaee9cd00424Rebecca Silberstein when(mWifiApConfigStore.getApConfiguration()).thenReturn(mDefaultApConfig); 1114e0a1bafa7a86e2840c855846f3fdaee9cd00424Rebecca Silberstein } 11279d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein SoftApManager newSoftApManager = new SoftApManager(mLooper.getLooper(), 11379d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein mWifiNative, 11479d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein TEST_COUNTRY_CODE, 11579d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein mListener, 11679d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein mApInterface, 11779d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein mNmService, 11879d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein mWifiApConfigStore, 11980a1468c75b0db36e58de767c74f7c15e9aa55e3Rebecca Silberstein config, 12080a1468c75b0db36e58de767c74f7c15e9aa55e3Rebecca Silberstein mWifiMetrics); 121e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu mLooper.dispatchAll(); 12279d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein return newSoftApManager; 123e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu } 124e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 12579d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein /** Verifies startSoftAp will use default config if AP configuration is not provided. */ 126e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu @Test 127e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu public void startSoftApWithoutConfig() throws Exception { 12879d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein startSoftApAndVerifyEnabled(null); 12979d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein } 130e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 13179d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein /** Verifies startSoftAp will use provided config and start AP. */ 13279d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein @Test 13379d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein public void startSoftApWithConfig() throws Exception { 13479d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein WifiConfiguration config = new WifiConfiguration(); 13579d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein config.apBand = WifiConfiguration.AP_BAND_2GHZ; 13679d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein config.SSID = TEST_SSID; 13779d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein startSoftApAndVerifyEnabled(config); 13879d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein } 139e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 14079d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein /** Tests softap startup if default config fails to load. **/ 14179d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein @Test 14279d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein public void startSoftApDefaultConfigFailedToLoad() throws Exception { 1434e0a1bafa7a86e2840c855846f3fdaee9cd00424Rebecca Silberstein when(mApInterface.asBinder()).thenReturn(mApInterfaceBinder); 1444e0a1bafa7a86e2840c855846f3fdaee9cd00424Rebecca Silberstein when(mApInterface.startHostapd()).thenReturn(true); 1454e0a1bafa7a86e2840c855846f3fdaee9cd00424Rebecca Silberstein when(mApInterface.stopHostapd()).thenReturn(true); 14679d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein when(mWifiApConfigStore.getApConfiguration()).thenReturn(null); 1474e0a1bafa7a86e2840c855846f3fdaee9cd00424Rebecca Silberstein SoftApManager newSoftApManager = new SoftApManager(mLooper.getLooper(), 1484e0a1bafa7a86e2840c855846f3fdaee9cd00424Rebecca Silberstein mWifiNative, 1494e0a1bafa7a86e2840c855846f3fdaee9cd00424Rebecca Silberstein TEST_COUNTRY_CODE, 1504e0a1bafa7a86e2840c855846f3fdaee9cd00424Rebecca Silberstein mListener, 1514e0a1bafa7a86e2840c855846f3fdaee9cd00424Rebecca Silberstein mApInterface, 1524e0a1bafa7a86e2840c855846f3fdaee9cd00424Rebecca Silberstein mNmService, 1534e0a1bafa7a86e2840c855846f3fdaee9cd00424Rebecca Silberstein mWifiApConfigStore, 1544e0a1bafa7a86e2840c855846f3fdaee9cd00424Rebecca Silberstein null, 1554e0a1bafa7a86e2840c855846f3fdaee9cd00424Rebecca Silberstein mWifiMetrics); 1564e0a1bafa7a86e2840c855846f3fdaee9cd00424Rebecca Silberstein mLooper.dispatchAll(); 1574e0a1bafa7a86e2840c855846f3fdaee9cd00424Rebecca Silberstein newSoftApManager.start(); 15879d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein mLooper.dispatchAll(); 15979d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein verify(mListener).onStateChanged(WifiManager.WIFI_AP_STATE_FAILED, 16079d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein WifiManager.SAP_START_FAILURE_GENERAL); 161e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu } 162e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 163be40e20f6995d9d11c8270502120a07785dde270Daniel Erat /** Tests the handling of stop command when soft AP is not started. */ 164e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu @Test 165e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu public void stopWhenNotStarted() throws Exception { 16679d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein mSoftApManager = createSoftApManager(null); 167e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu mSoftApManager.stop(); 168e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu mLooper.dispatchAll(); 169e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu /* Verify no state changes. */ 170e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu verify(mListener, never()).onStateChanged(anyInt(), anyInt()); 171e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu } 172e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 173be40e20f6995d9d11c8270502120a07785dde270Daniel Erat /** Tests the handling of stop command when soft AP is started. */ 174e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu @Test 175e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu public void stopWhenStarted() throws Exception { 17679d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein startSoftApAndVerifyEnabled(null); 177e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 178e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu InOrder order = inOrder(mListener); 179e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 180e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu mSoftApManager.stop(); 181e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu mLooper.dispatchAll(); 182e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 183974f4ecb02b4560f18bfdaed3f6a2c78e5d42ee0Christopher Wiley verify(mApInterface).stopHostapd(); 184e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu order.verify(mListener).onStateChanged(WifiManager.WIFI_AP_STATE_DISABLING, 0); 185e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu order.verify(mListener).onStateChanged(WifiManager.WIFI_AP_STATE_DISABLED, 0); 186e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu } 187be40e20f6995d9d11c8270502120a07785dde270Daniel Erat 188736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wiley @Test 189736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wiley public void handlesWificondInterfaceDeath() throws Exception { 19079d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein startSoftApAndVerifyEnabled(null); 191736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wiley 192736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wiley mDeathListenerCaptor.getValue().binderDied(); 193736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wiley mLooper.dispatchAll(); 194736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wiley InOrder order = inOrder(mListener); 195736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wiley order.verify(mListener).onStateChanged(WifiManager.WIFI_AP_STATE_DISABLING, 0); 196736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wiley order.verify(mListener).onStateChanged(WifiManager.WIFI_AP_STATE_FAILED, 197736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wiley WifiManager.SAP_START_FAILURE_GENERAL); 198736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wiley } 199736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wiley 200be40e20f6995d9d11c8270502120a07785dde270Daniel Erat /** Starts soft AP and verifies that it is enabled successfully. */ 20179d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein protected void startSoftApAndVerifyEnabled(WifiConfiguration config) throws Exception { 20279d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein String expectedSSID; 203fe3e7f39c4acf1517b31d6ff7123d075c1e6de25Christopher Wiley InOrder order = inOrder(mListener, mApInterfaceBinder, mApInterface, mNmService); 204be40e20f6995d9d11c8270502120a07785dde270Daniel Erat 205be40e20f6995d9d11c8270502120a07785dde270Daniel Erat when(mWifiNative.isHalStarted()).thenReturn(false); 206be40e20f6995d9d11c8270502120a07785dde270Daniel Erat when(mWifiNative.setCountryCodeHal(TEST_COUNTRY_CODE.toUpperCase(Locale.ROOT))) 207be40e20f6995d9d11c8270502120a07785dde270Daniel Erat .thenReturn(true); 20879d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein 20979d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein mSoftApManager = createSoftApManager(config); 21079d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein if (config == null) { 21179d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein when(mWifiApConfigStore.getApConfiguration()).thenReturn(mDefaultApConfig); 21279d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein expectedSSID = mDefaultApConfig.SSID; 21379d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein } else { 21479d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein expectedSSID = config.SSID; 21579d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein } 21679d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein mSoftApManager.start(); 217be40e20f6995d9d11c8270502120a07785dde270Daniel Erat mLooper.dispatchAll(); 218be40e20f6995d9d11c8270502120a07785dde270Daniel Erat order.verify(mListener).onStateChanged(WifiManager.WIFI_AP_STATE_ENABLING, 0); 219736132bc7bc92bf17cbeeea26f0bf44d498e46e0Christopher Wiley order.verify(mApInterfaceBinder).linkToDeath(mDeathListenerCaptor.capture(), eq(0)); 220fe3e7f39c4acf1517b31d6ff7123d075c1e6de25Christopher Wiley order.verify(mNmService).registerObserver(mNetworkObserverCaptor.capture()); 221974f4ecb02b4560f18bfdaed3f6a2c78e5d42ee0Christopher Wiley order.verify(mApInterface).writeHostapdConfig( 22279d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein eq(expectedSSID.getBytes(StandardCharsets.UTF_8)), anyBoolean(), 22379d069c37009c62f4f9e1dd0fc623fcf50aab919Rebecca Silberstein anyInt(), anyInt(), any()); 224974f4ecb02b4560f18bfdaed3f6a2c78e5d42ee0Christopher Wiley order.verify(mApInterface).startHostapd(); 225fe3e7f39c4acf1517b31d6ff7123d075c1e6de25Christopher Wiley mNetworkObserverCaptor.getValue().interfaceLinkStateChanged(TEST_INTERFACE_NAME, true); 226fe3e7f39c4acf1517b31d6ff7123d075c1e6de25Christopher Wiley mLooper.dispatchAll(); 227be40e20f6995d9d11c8270502120a07785dde270Daniel Erat order.verify(mListener).onStateChanged(WifiManager.WIFI_AP_STATE_ENABLED, 0); 228be40e20f6995d9d11c8270502120a07785dde270Daniel Erat } 229be40e20f6995d9d11c8270502120a07785dde270Daniel Erat 230be40e20f6995d9d11c8270502120a07785dde270Daniel Erat /** Verifies that soft AP was not disabled. */ 231be40e20f6995d9d11c8270502120a07785dde270Daniel Erat protected void verifySoftApNotDisabled() throws Exception { 232be40e20f6995d9d11c8270502120a07785dde270Daniel Erat verify(mListener, never()).onStateChanged(WifiManager.WIFI_AP_STATE_DISABLING, 0); 233be40e20f6995d9d11c8270502120a07785dde270Daniel Erat verify(mListener, never()).onStateChanged(WifiManager.WIFI_AP_STATE_DISABLED, 0); 234be40e20f6995d9d11c8270502120a07785dde270Daniel Erat } 235e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu} 236