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; 20e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.anyInt; 21e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.eq; 22e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.inOrder; 23e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.never; 24e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.verify; 25e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.when; 26e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 27e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.content.BroadcastReceiver; 28e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.content.Context; 29e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.content.IntentFilter; 30e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.net.ConnectivityManager; 31e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.net.InterfaceConfiguration; 32e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.net.wifi.WifiConfiguration; 33e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.net.wifi.WifiManager; 34e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.os.INetworkManagementService; 35e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.test.suitebuilder.annotation.SmallTest; 36e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 37e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport org.junit.Before; 38e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport org.junit.Test; 39e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport org.mockito.ArgumentCaptor; 40e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport org.mockito.InOrder; 41e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport org.mockito.Mock; 42e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport org.mockito.MockitoAnnotations; 43e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 44e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport java.util.ArrayList; 45e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport java.util.Arrays; 46e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport java.util.Locale; 47e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 48be40e20f6995d9d11c8270502120a07785dde270Daniel Erat/** Unit tests for {@link SoftApManager}. */ 49e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu@SmallTest 50e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiupublic class SoftApManagerTest { 51e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 52e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu private static final String TAG = "SoftApManagerTest"; 53e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 54e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu private static final String TEST_INTERFACE_NAME = "TestInterface"; 55e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu private static final String TEST_COUNTRY_CODE = "TestCountry"; 56e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu private static final Integer[] ALLOWED_2G_CHANNELS = {1, 2, 3, 4}; 57e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu private static final String[] AVAILABLE_DEVICES = { TEST_INTERFACE_NAME }; 58e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 59e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu private final ArrayList<Integer> mAllowed2GChannels = 60e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu new ArrayList<Integer>(Arrays.asList(ALLOWED_2G_CHANNELS)); 61e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 62e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu MockLooper mLooper; 63e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu @Mock Context mContext; 64e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu @Mock WifiNative mWifiNative; 65e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu @Mock INetworkManagementService mNmService; 66e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu @Mock ConnectivityManager mConnectivityManager; 67e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu @Mock SoftApManager.Listener mListener; 68be40e20f6995d9d11c8270502120a07785dde270Daniel Erat @Mock InterfaceConfiguration mInterfaceConfiguration; 69e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 70e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu SoftApManager mSoftApManager; 71e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 72be40e20f6995d9d11c8270502120a07785dde270Daniel Erat /** Sets up test. */ 73e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu @Before 74e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu public void setUp() throws Exception { 75e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu MockitoAnnotations.initMocks(this); 76e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu mLooper = new MockLooper(); 77e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 78e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); 79be40e20f6995d9d11c8270502120a07785dde270Daniel Erat when(mNmService.getInterfaceConfig(TEST_INTERFACE_NAME)) 80be40e20f6995d9d11c8270502120a07785dde270Daniel Erat .thenReturn(mInterfaceConfiguration); 81be40e20f6995d9d11c8270502120a07785dde270Daniel Erat when(mConnectivityManager.getTetherableWifiRegexs()) 82be40e20f6995d9d11c8270502120a07785dde270Daniel Erat .thenReturn(AVAILABLE_DEVICES); 83be40e20f6995d9d11c8270502120a07785dde270Daniel Erat 84d9c55738e1bb2ff3faee24c5434453352a9e6611Christopher Wiley mSoftApManager = new SoftApManager(mLooper.getLooper(), 85e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu mWifiNative, 86e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu mNmService, 87e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu TEST_COUNTRY_CODE, 88e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu mAllowed2GChannels, 89e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu mListener); 90e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 91e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu mLooper.dispatchAll(); 92e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu } 93e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 94be40e20f6995d9d11c8270502120a07785dde270Daniel Erat /** Verifies startSoftAp will fail if AP configuration is not provided. */ 95e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu @Test 96e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu public void startSoftApWithoutConfig() throws Exception { 97e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu InOrder order = inOrder(mListener); 98e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 99e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu mSoftApManager.start(null); 100e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu mLooper.dispatchAll(); 101e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 102e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu order.verify(mListener).onStateChanged(WifiManager.WIFI_AP_STATE_ENABLING, 0); 103e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu order.verify(mListener).onStateChanged( 104e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu WifiManager.WIFI_AP_STATE_FAILED, WifiManager.SAP_START_FAILURE_GENERAL); 105e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu } 106e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 107be40e20f6995d9d11c8270502120a07785dde270Daniel Erat /** Tests the handling of stop command when soft AP is not started. */ 108e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu @Test 109e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu public void stopWhenNotStarted() throws Exception { 110e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu mSoftApManager.stop(); 111e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu mLooper.dispatchAll(); 112e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu /* Verify no state changes. */ 113e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu verify(mListener, never()).onStateChanged(anyInt(), anyInt()); 114e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu } 115e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 116be40e20f6995d9d11c8270502120a07785dde270Daniel Erat /** Tests the handling of stop command when soft AP is started. */ 117e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu @Test 118e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu public void stopWhenStarted() throws Exception { 119be40e20f6995d9d11c8270502120a07785dde270Daniel Erat startSoftApAndVerifyEnabled(); 120e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 121e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu InOrder order = inOrder(mListener); 122e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 123e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu mSoftApManager.stop(); 124e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu mLooper.dispatchAll(); 125e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu 126e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu verify(mNmService).stopAccessPoint(TEST_INTERFACE_NAME); 127e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu order.verify(mListener).onStateChanged(WifiManager.WIFI_AP_STATE_DISABLING, 0); 128e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu order.verify(mListener).onStateChanged(WifiManager.WIFI_AP_STATE_DISABLED, 0); 129e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu } 130be40e20f6995d9d11c8270502120a07785dde270Daniel Erat 131be40e20f6995d9d11c8270502120a07785dde270Daniel Erat /** Starts soft AP and verifies that it is enabled successfully. */ 132be40e20f6995d9d11c8270502120a07785dde270Daniel Erat protected void startSoftApAndVerifyEnabled() throws Exception { 133be40e20f6995d9d11c8270502120a07785dde270Daniel Erat InOrder order = inOrder(mListener); 134be40e20f6995d9d11c8270502120a07785dde270Daniel Erat 135be40e20f6995d9d11c8270502120a07785dde270Daniel Erat /** 136be40e20f6995d9d11c8270502120a07785dde270Daniel Erat * Only test the default configuration. Testing for different configurations 137be40e20f6995d9d11c8270502120a07785dde270Daniel Erat * are taken care of by ApConfigUtilTest. 138be40e20f6995d9d11c8270502120a07785dde270Daniel Erat */ 139be40e20f6995d9d11c8270502120a07785dde270Daniel Erat WifiConfiguration config = new WifiConfiguration(); 140be40e20f6995d9d11c8270502120a07785dde270Daniel Erat config.apBand = WifiConfiguration.AP_BAND_2GHZ; 141be40e20f6995d9d11c8270502120a07785dde270Daniel Erat when(mWifiNative.isHalStarted()).thenReturn(false); 142be40e20f6995d9d11c8270502120a07785dde270Daniel Erat when(mWifiNative.setCountryCodeHal(TEST_COUNTRY_CODE.toUpperCase(Locale.ROOT))) 143be40e20f6995d9d11c8270502120a07785dde270Daniel Erat .thenReturn(true); 144be40e20f6995d9d11c8270502120a07785dde270Daniel Erat mSoftApManager.start(config); 145be40e20f6995d9d11c8270502120a07785dde270Daniel Erat mLooper.dispatchAll(); 146be40e20f6995d9d11c8270502120a07785dde270Daniel Erat verify(mNmService).startAccessPoint( 147be40e20f6995d9d11c8270502120a07785dde270Daniel Erat any(WifiConfiguration.class), eq(TEST_INTERFACE_NAME)); 148be40e20f6995d9d11c8270502120a07785dde270Daniel Erat order.verify(mListener).onStateChanged(WifiManager.WIFI_AP_STATE_ENABLING, 0); 149be40e20f6995d9d11c8270502120a07785dde270Daniel Erat order.verify(mListener).onStateChanged(WifiManager.WIFI_AP_STATE_ENABLED, 0); 150be40e20f6995d9d11c8270502120a07785dde270Daniel Erat } 151be40e20f6995d9d11c8270502120a07785dde270Daniel Erat 152be40e20f6995d9d11c8270502120a07785dde270Daniel Erat /** Verifies that soft AP was not disabled. */ 153be40e20f6995d9d11c8270502120a07785dde270Daniel Erat protected void verifySoftApNotDisabled() throws Exception { 154be40e20f6995d9d11c8270502120a07785dde270Daniel Erat verify(mListener, never()).onStateChanged(WifiManager.WIFI_AP_STATE_DISABLING, 0); 155be40e20f6995d9d11c8270502120a07785dde270Daniel Erat verify(mListener, never()).onStateChanged(WifiManager.WIFI_AP_STATE_DISABLED, 0); 156be40e20f6995d9d11c8270502120a07785dde270Daniel Erat } 157e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu} 158