158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang/* 258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * Copyright (C) 2013, The Android Open Source Project 358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * 458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * Licensed under the Apache License, Version 2.0 (the "License"); 558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * you may not use this file except in compliance with the License. 658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * You may obtain a copy of the License at 758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * 858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * http://www.apache.org/licenses/LICENSE-2.0 958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * 1058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * Unless required by applicable law or agreed to in writing, software 1158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * distributed under the License is distributed on an "AS IS" BASIS, 1258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * See the License for the specific language governing permissions and 1458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * limitations under the License. 1558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang */ 1658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 1758a5db37b3de268aea18b160234f9fd4d70a970dXia Wangpackage com.android.connectivitymanagertest.functional; 1858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 1958a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration; 2058a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration.AuthAlgorithm; 2158a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration.GroupCipher; 2258a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration.PairwiseCipher; 2358a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration.Protocol; 24d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport android.net.wifi.WifiInfo; 25485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Roweimport android.net.wifi.WifiManager; 26d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport android.os.Bundle; 2758a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.test.suitebuilder.annotation.LargeTest; 2858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 29d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport com.android.connectivitymanagertest.ConnectivityManagerTestBase; 30d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport com.android.connectivitymanagertest.WifiAssociationTestRunner; 312591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Roweimport com.android.connectivitymanagertest.WifiConfigurationHelper; 32d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu 3358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang/** 3458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * Test Wi-Fi connection with different configuration 3558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * To run this tests: 361c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang * * adb shell am instrument -e ssid <ssid> -e password <password> \ 371c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang * -e security-type [OPEN|WEP64|WEP128|WPA_TKIP|WPA2_AES] -e frequency-band [2.4|5.0|auto] 381c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang * -w com.android.connectivitymanagertest/.WifiAssociationTestRunner" 3958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang */ 40d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhupublic class WifiAssociationTest extends ConnectivityManagerTestBase { 41485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe private enum SecurityType { 4258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang OPEN, WEP64, WEP128, WPA_TKIP, WPA2_AES 4358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 4458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 452591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe public WifiAssociationTest() { 462591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe super(WifiAssociationTest.class.getSimpleName()); 472591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 482591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 49485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe /** 50485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe * Test that the wifi can associate with a given access point. 51485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe */ 52485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe @LargeTest 53485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe public void testWifiAssociation() { 54485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe WifiAssociationTestRunner runner = (WifiAssociationTestRunner) getInstrumentation(); 55d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu Bundle arguments = runner.getArguments(); 56485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe 57485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe String ssid = arguments.getString("ssid"); 58485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe assertNotNull("ssid is empty", ssid); 59485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe 60485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe String securityTypeStr = arguments.getString("security-type"); 61485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe assertNotNull("security-type is empty", securityTypeStr); 62485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe SecurityType securityType = SecurityType.valueOf(securityTypeStr); 63485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe 64485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe String password = arguments.getString("password"); 65485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe 66485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe String freqStr = arguments.getString("frequency-band"); 67485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe if (freqStr != null) { 68485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe setFrequencyBand(freqStr); 69485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe } 70485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe 71d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertTrue("enable Wifi failed", enableWifi()); 72d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu WifiInfo wi = mWifiManager.getConnectionInfo(); 73485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe logv("%s", wi); 74d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertNotNull("no active wifi info", wi); 75485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe 76485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe WifiConfiguration config = getConfig(ssid, securityType, password); 77485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe 78485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe logv("Network config: %s", config.toString()); 79485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe connectToWifi(config); 8058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 8158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 82485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe /** 83485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe * Set the frequency band and verify that it has been set. 84485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe */ 85485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe private void setFrequencyBand(String frequencyBandStr) { 86485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe int frequencyBand = -1; 87485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe if ("2.4".equals(frequencyBandStr)) { 88485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe frequencyBand = WifiManager.WIFI_FREQUENCY_BAND_2GHZ; 89485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe } else if ("5.0".equals(frequencyBandStr)) { 90485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe frequencyBand = WifiManager.WIFI_FREQUENCY_BAND_5GHZ; 91485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe } else if ("auto".equals(frequencyBandStr)) { 92485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe frequencyBand = WifiManager.WIFI_FREQUENCY_BAND_AUTO; 93485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe } else { 94485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe fail("Invalid frequency-band"); 95485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe } 96485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe if (mWifiManager.getFrequencyBand() != frequencyBand) { 97485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe logv("Set frequency band to %s", frequencyBandStr); 98485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe mWifiManager.setFrequencyBand(frequencyBand, true); 99485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe } 100485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe assertEquals("Specified frequency band does not match operational band", 101485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe frequencyBand, mWifiManager.getFrequencyBand()); 1021c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang } 1031c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang 104485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe /** 105485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe * Get the {@link WifiConfiguration} based on ssid, security, and password. 106485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe */ 107485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe private WifiConfiguration getConfig(String ssid, SecurityType securityType, String password) { 108485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe logv("Security type is %s", securityType.toString()); 109485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe 1102591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe WifiConfiguration config = null; 111485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe switch (securityType) { 11258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case OPEN: 113485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe config = WifiConfigurationHelper.createOpenConfig(ssid); 11458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 11558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case WEP64: 116485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe assertNotNull("password is empty", password); 1172591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe // always use hex pair for WEP-40 118485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe assertTrue(WifiConfigurationHelper.isHex(password, 10)); 119485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe config = WifiConfigurationHelper.createWepConfig(ssid, password); 12058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedGroupCiphers.set(GroupCipher.WEP40); 12158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 12258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case WEP128: 123485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe assertNotNull("password is empty", password); 1242591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe // always use hex pair for WEP-104 125485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe assertTrue(WifiConfigurationHelper.isHex(password, 26)); 126485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe config = WifiConfigurationHelper.createWepConfig(ssid, password); 12758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedGroupCiphers.set(GroupCipher.WEP104); 12858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 12958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case WPA_TKIP: 130485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe assertNotNull("password is empty", password); 131485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe config = WifiConfigurationHelper.createPskConfig(ssid, password); 13258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); 13358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedProtocols.set(Protocol.WPA); 13458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedPairwiseCiphers.set(PairwiseCipher.TKIP); 13558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedGroupCiphers.set(GroupCipher.TKIP); 13658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 13758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case WPA2_AES: 138485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe assertNotNull("password is empty", password); 139485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe config = WifiConfigurationHelper.createPskConfig(ssid, password); 14058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); 14158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedProtocols.set(Protocol.RSN); 14258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedPairwiseCiphers.set(PairwiseCipher.CCMP); 14358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedGroupCiphers.set(GroupCipher.CCMP); 14458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 14558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang default: 146485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe fail("Not a valid security type: " + securityType); 14758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 14858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 149485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe return config; 15058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 15158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang} 152