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 1919306af73a8175e1327101132e26a35c7dfe5168Xia Wangimport com.android.connectivitymanagertest.ConnectivityManagerTestBase; 201c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wangimport com.android.connectivitymanagertest.WifiAssociationTestRunner; 2158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 2258a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.content.Context; 2358a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.os.Bundle; 2458a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiInfo; 2558a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration; 2658a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration.KeyMgmt; 2758a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration.AuthAlgorithm; 2858a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration.GroupCipher; 2958a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration.PairwiseCipher; 3058a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration.Protocol; 3158a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiManager; 3258a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.ConnectivityManager; 3358a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.NetworkInfo.State; 3458a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.test.suitebuilder.annotation.LargeTest; 3558a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.util.Log; 3658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 3758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang/** 3858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * Test Wi-Fi connection with different configuration 3958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * To run this tests: 401c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang * * adb shell am instrument -e ssid <ssid> -e password <password> \ 411c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang * -e security-type [OPEN|WEP64|WEP128|WPA_TKIP|WPA2_AES] -e frequency-band [2.4|5.0|auto] 421c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang * -w com.android.connectivitymanagertest/.WifiAssociationTestRunner" 4358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang */ 4458a5db37b3de268aea18b160234f9fd4d70a970dXia Wangpublic class WifiAssociationTest 4519306af73a8175e1327101132e26a35c7dfe5168Xia Wang extends ConnectivityManagerTestBase { 4658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private static final String TAG = "WifiAssociationTest"; 4758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private String mSsid = null; 4858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private String mPassword = null; 4958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private String mSecurityType = null; 501c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang private String mFrequencyBand = null; 511c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang private int mBand; 5258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 5358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang enum SECURITY_TYPE { 5458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang OPEN, WEP64, WEP128, WPA_TKIP, WPA2_AES 5558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 5658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 5758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang @Override 5858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang public void setUp() throws Exception { 5958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang super.setUp(); 601c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang WifiAssociationTestRunner mRunner = (WifiAssociationTestRunner)getInstrumentation(); 6158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang Bundle arguments = mRunner.getArguments(); 6258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang mSecurityType = arguments.getString("security-type"); 6358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang mSsid = arguments.getString("ssid"); 6458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang mPassword = arguments.getString("password"); 651c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang mFrequencyBand = arguments.getString("frequency-band"); 661c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang mBand = mRunner.mBand; 6758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertNotNull("Security type is empty", mSecurityType); 6858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertNotNull("Ssid is empty", mSsid); 691c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang validateFrequencyBand(); 7058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang // enable Wifi and verify wpa_supplicant is started 7119306af73a8175e1327101132e26a35c7dfe5168Xia Wang assertTrue("enable Wifi failed", enableWifi()); 7219306af73a8175e1327101132e26a35c7dfe5168Xia Wang sleep(2 * SHORT_TIMEOUT, "interrupted while waiting for WPA_SUPPLICANT to start"); 7319306af73a8175e1327101132e26a35c7dfe5168Xia Wang WifiInfo mConnection = mWifiManager.getConnectionInfo(); 7458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertNotNull(mConnection); 7519306af73a8175e1327101132e26a35c7dfe5168Xia Wang assertTrue("wpa_supplicant is not started ", mWifiManager.pingSupplicant()); 7658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 7758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 7858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang @Override 7958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang public void tearDown() throws Exception { 8058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang super.tearDown(); 8158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 8258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 831c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang private void validateFrequencyBand() { 841c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang if (mFrequencyBand != null) { 851c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang int currentFreq = mWifiManager.getFrequencyBand(); 861c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang Log.v(TAG, "read frequency band: " + currentFreq); 871c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang assertTrue("device frequency band is not set successfully", (mBand == currentFreq)); 881c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang } 891c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang } 901c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang 9158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang /** 9258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * Connect to the provided Wi-Fi network 9358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * @param config is the network configuration 9458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * @return true if the connection is successful. 9558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang */ 9658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private void connectToWifi(WifiConfiguration config) { 9758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang // step 1: connect to the test access point 9858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertTrue("failed to associate with " + config.SSID, 9919306af73a8175e1327101132e26a35c7dfe5168Xia Wang connectToWifiWithConfiguration(config)); 10058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 10158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang // step 2: verify Wifi state and network state; 10258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertTrue("failed to connect with " + config.SSID, 10319306af73a8175e1327101132e26a35c7dfe5168Xia Wang waitForNetworkState(ConnectivityManager.TYPE_WIFI, 10419306af73a8175e1327101132e26a35c7dfe5168Xia Wang State.CONNECTED, WIFI_CONNECTION_TIMEOUT)); 10558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 10658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang // step 3: verify the current connected network is the given SSID 10719306af73a8175e1327101132e26a35c7dfe5168Xia Wang assertNotNull("Wifi connection returns null", mWifiManager.getConnectionInfo()); 10819306af73a8175e1327101132e26a35c7dfe5168Xia Wang assertTrue(config.SSID.contains(mWifiManager.getConnectionInfo().getSSID())); 10958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 11058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 11158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private void sleep(long sometime, String errorMsg) { 11258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang try { 11358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang Thread.sleep(sometime); 11458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } catch (InterruptedException e) { 11558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang fail(errorMsg); 11658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 11758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 11858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 11958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private void log(String message) { 12058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang Log.v(TAG, message); 12158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 12258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 12358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang @LargeTest 12458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang public void testWifiAssociation() { 12558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertNotNull("no test ssid", mSsid); 12658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang WifiConfiguration config = new WifiConfiguration(); 12758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.SSID = mSsid; 12858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang SECURITY_TYPE security = SECURITY_TYPE.valueOf(mSecurityType); 12958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang log("Security type is " + security.toString()); 13058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang switch (security) { 13158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang // set network configurations 13258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case OPEN: 13358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedKeyManagement.set(KeyMgmt.NONE); 13458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 13558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case WEP64: 13658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang // always use hex pair for WEP-40 13758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertTrue("not a WEP64 security type?", mPassword.length() == 10); 13858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedKeyManagement.set(KeyMgmt.NONE); 13958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); 14058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED); 14158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedGroupCiphers.set(GroupCipher.WEP40); 14258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang if (mPassword != null) { 14358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang int length = mPassword.length(); 14458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang // WEP-40 14558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang if (mPassword.matches("[0-9A-Fa-f]*")) { 14658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.wepKeys[0] = mPassword; 14758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } else { 14858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang fail("Please type hex pair for the password"); 14958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 15058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 15158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 15258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case WEP128: 15358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertNotNull("password is empty", mPassword); 15458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang // always use hex pair for WEP-104 15558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertTrue("not a WEP128 security type?", mPassword.length() == 26); 15658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedKeyManagement.set(KeyMgmt.NONE); 15758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); 15858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED); 15958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedGroupCiphers.set(GroupCipher.WEP104); 16058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang if (mPassword != null) { 16158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang int length = mPassword.length(); 16258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang // WEP-40 16358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang if (mPassword.matches("[0-9A-Fa-f]*")) { 16458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.wepKeys[0] = mPassword; 16558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } else { 16658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang fail("Please type hex pair for the password"); 16758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 16858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 16958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 17058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case WPA_TKIP: 17158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertNotNull("missing password", mPassword); 17258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedKeyManagement.set(KeyMgmt.WPA_PSK); 17358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); 17458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedProtocols.set(Protocol.WPA); 17558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedPairwiseCiphers.set(PairwiseCipher.TKIP); 17658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedGroupCiphers.set(GroupCipher.TKIP); 17758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang if (mPassword.matches("[0-9A-Fa-f]{64}")) { 17858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.preSharedKey = mPassword; 17958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } else { 18058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.preSharedKey = '"' + mPassword + '"'; 18158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 18258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 18358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case WPA2_AES: 18458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertNotNull("missing password", mPassword); 18558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedKeyManagement.set(KeyMgmt.WPA_PSK); 18658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); 18758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedProtocols.set(Protocol.RSN); 18858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedPairwiseCiphers.set(PairwiseCipher.CCMP); 18958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedGroupCiphers.set(GroupCipher.CCMP); 19058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedProtocols.set(Protocol.RSN); 19158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang if (mPassword.matches("[0-9A-Fa-f]{64}")) { 19258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.preSharedKey = mPassword; 19358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } else { 19458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.preSharedKey = '"' + mPassword + '"'; 19558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 19658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 19758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang default: 19858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang fail("Not a valid security type: " + mSecurityType); 19958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 20058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 20158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang Log.v(TAG, "network config: " + config.toString()); 20258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang connectToWifi(config); 20358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 20458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang} 205