WifiAssociationTest.java revision d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8
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 19d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport android.net.ConnectivityManager; 20d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport android.net.NetworkInfo.State; 2158a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration; 2258a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration.AuthAlgorithm; 2358a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration.GroupCipher; 24d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport android.net.wifi.WifiConfiguration.KeyMgmt; 2558a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration.PairwiseCipher; 2658a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration.Protocol; 27d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport android.net.wifi.WifiInfo; 28d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport android.os.Bundle; 2958a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.test.suitebuilder.annotation.LargeTest; 3058a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.util.Log; 3158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 32d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport com.android.connectivitymanagertest.ConnectivityManagerTestBase; 33d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport com.android.connectivitymanagertest.WifiAssociationTestRunner; 34d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu 3558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang/** 3658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * Test Wi-Fi connection with different configuration 3758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * To run this tests: 381c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang * * adb shell am instrument -e ssid <ssid> -e password <password> \ 391c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang * -e security-type [OPEN|WEP64|WEP128|WPA_TKIP|WPA2_AES] -e frequency-band [2.4|5.0|auto] 401c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang * -w com.android.connectivitymanagertest/.WifiAssociationTestRunner" 4158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang */ 42d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhupublic class WifiAssociationTest extends ConnectivityManagerTestBase { 4358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private static final String TAG = "WifiAssociationTest"; 4458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private String mSsid = null; 4558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private String mPassword = null; 4658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private String mSecurityType = null; 471c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang private String mFrequencyBand = null; 481c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang private int mBand; 4958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 5058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang enum SECURITY_TYPE { 5158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang OPEN, WEP64, WEP128, WPA_TKIP, WPA2_AES 5258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 5358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 5458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang @Override 55d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected void setUp() throws Exception { 5658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang super.setUp(); 57d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu WifiAssociationTestRunner runner = (WifiAssociationTestRunner)getInstrumentation(); 58d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu Bundle arguments = runner.getArguments(); 5958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang mSecurityType = arguments.getString("security-type"); 6058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang mSsid = arguments.getString("ssid"); 6158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang mPassword = arguments.getString("password"); 621c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang mFrequencyBand = arguments.getString("frequency-band"); 63d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu mBand = runner.mBand; 64d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertNotNull("security type is empty", mSecurityType); 65d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertNotNull("ssid is empty", mSsid); 661c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang validateFrequencyBand(); 6758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 68d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu // enable wifi and verify wpa_supplicant is started 69d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertTrue("enable Wifi failed", enableWifi()); 70d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertTrue("wifi not connected", waitForNetworkState( 71d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu ConnectivityManager.TYPE_WIFI, State.CONNECTED, LONG_TIMEOUT)); 72d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu WifiInfo wi = mWifiManager.getConnectionInfo(); 73d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertNotNull("no active wifi info", wi); 74d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertTrue("failed to ping wpa_supplicant ", mWifiManager.pingSupplicant()); 7558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 7658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 771c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang private void validateFrequencyBand() { 781c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang if (mFrequencyBand != null) { 791c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang int currentFreq = mWifiManager.getFrequencyBand(); 801c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang Log.v(TAG, "read frequency band: " + currentFreq); 81d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertEquals("specified frequency band does not match operational band of WifiManager", 82d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu currentFreq, mBand); 831c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang } 841c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang } 851c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang 8658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private void log(String message) { 8758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang Log.v(TAG, message); 8858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 8958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 9058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang @LargeTest 9158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang public void testWifiAssociation() { 9258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertNotNull("no test ssid", mSsid); 9358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang WifiConfiguration config = new WifiConfiguration(); 9458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.SSID = mSsid; 9558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang SECURITY_TYPE security = SECURITY_TYPE.valueOf(mSecurityType); 9658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang log("Security type is " + security.toString()); 9758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang switch (security) { 9858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang // set network configurations 9958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case OPEN: 10058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedKeyManagement.set(KeyMgmt.NONE); 10158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 10258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case WEP64: 103d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertNotNull("password is empty", mPassword); 10458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedKeyManagement.set(KeyMgmt.NONE); 10558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); 10658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED); 10758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedGroupCiphers.set(GroupCipher.WEP40); 10858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang if (mPassword != null) { 109d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu // always use hex pair for WEP-40 110d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if (isHex(mPassword, 10)) { 11158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.wepKeys[0] = mPassword; 11258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } else { 113d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu fail("password should be 10-character hex"); 11458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 11558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 11658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 11758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case WEP128: 11858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertNotNull("password is empty", mPassword); 11958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedKeyManagement.set(KeyMgmt.NONE); 12058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); 12158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED); 12258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedGroupCiphers.set(GroupCipher.WEP104); 12358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang if (mPassword != null) { 124d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu // always use hex pair for WEP-104 125d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if (isHex(mPassword, 26)) { 12658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.wepKeys[0] = mPassword; 12758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } else { 128d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu fail("password should be 26-character hex"); 12958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 13058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 13158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 13258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case WPA_TKIP: 133d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertNotNull("password is empty", mPassword); 13458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedKeyManagement.set(KeyMgmt.WPA_PSK); 13558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); 13658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedProtocols.set(Protocol.WPA); 13758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedPairwiseCiphers.set(PairwiseCipher.TKIP); 13858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedGroupCiphers.set(GroupCipher.TKIP); 13958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang if (mPassword.matches("[0-9A-Fa-f]{64}")) { 14058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.preSharedKey = mPassword; 14158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } else { 14258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.preSharedKey = '"' + mPassword + '"'; 14358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 14458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 14558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case WPA2_AES: 146d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertNotNull("password is empty", mPassword); 14758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedKeyManagement.set(KeyMgmt.WPA_PSK); 14858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); 14958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedProtocols.set(Protocol.RSN); 15058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedPairwiseCiphers.set(PairwiseCipher.CCMP); 15158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedGroupCiphers.set(GroupCipher.CCMP); 15258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedProtocols.set(Protocol.RSN); 15358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang if (mPassword.matches("[0-9A-Fa-f]{64}")) { 15458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.preSharedKey = mPassword; 15558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } else { 15658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.preSharedKey = '"' + mPassword + '"'; 15758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 15858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 15958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang default: 16058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang fail("Not a valid security type: " + mSecurityType); 16158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 16258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 16358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang Log.v(TAG, "network config: " + config.toString()); 16458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang connectToWifi(config); 165d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu // verify that connection actually works 166d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertTrue("no network connectivity at end of test", checkNetworkConnectivity()); 16758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 16858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang} 169