WifiAssociationTest.java revision 1c6911ac1d6c4cfecaaa1c1d6814707d77aed4be
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 com.android.connectivitymanagertest.ConnectivityManagerTestActivity; 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.test.ActivityInstrumentationTestCase2; 3658a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.util.Log; 3758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 3858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang/** 3958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * Test Wi-Fi connection with different configuration 4058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * To run this tests: 411c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang * * adb shell am instrument -e ssid <ssid> -e password <password> \ 421c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang * -e security-type [OPEN|WEP64|WEP128|WPA_TKIP|WPA2_AES] -e frequency-band [2.4|5.0|auto] 431c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang * -w com.android.connectivitymanagertest/.WifiAssociationTestRunner" 4458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang */ 4558a5db37b3de268aea18b160234f9fd4d70a970dXia Wangpublic class WifiAssociationTest 4658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang extends ActivityInstrumentationTestCase2<ConnectivityManagerTestActivity> { 4758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private static final String TAG = "WifiAssociationTest"; 4858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private ConnectivityManagerTestActivity mAct; 4958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private String mSsid = null; 5058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private String mPassword = null; 5158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private String mSecurityType = null; 521c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang private String mFrequencyBand = null; 531c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang private int mBand; 5458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private WifiManager mWifiManager = null; 5558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 5658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang enum SECURITY_TYPE { 5758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang OPEN, WEP64, WEP128, WPA_TKIP, WPA2_AES 5858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang }; 5958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 6058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang public WifiAssociationTest() { 6158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang super(ConnectivityManagerTestActivity.class); 6258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 6358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 6458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang @Override 6558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang public void setUp() throws Exception { 6658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang super.setUp(); 671c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang WifiAssociationTestRunner mRunner = (WifiAssociationTestRunner)getInstrumentation(); 6858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang mWifiManager = (WifiManager) mRunner.getContext().getSystemService(Context.WIFI_SERVICE); 6958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang mAct = getActivity(); 7058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang Bundle arguments = mRunner.getArguments(); 7158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang mSecurityType = arguments.getString("security-type"); 7258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang mSsid = arguments.getString("ssid"); 7358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang mPassword = arguments.getString("password"); 741c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang mFrequencyBand = arguments.getString("frequency-band"); 751c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang mBand = mRunner.mBand; 7658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertNotNull("Security type is empty", mSecurityType); 7758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertNotNull("Ssid is empty", mSsid); 781c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang validateFrequencyBand(); 7958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang // enable Wifi and verify wpa_supplicant is started 8058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertTrue("enable Wifi failed", mAct.enableWifi()); 8158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang sleep(2 * ConnectivityManagerTestActivity.SHORT_TIMEOUT, 8258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang "interrupted while waiting for WPA_SUPPLICANT to start"); 8358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang WifiInfo mConnection = mAct.mWifiManager.getConnectionInfo(); 8458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertNotNull(mConnection); 8558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertTrue("wpa_supplicant is not started ", mAct.mWifiManager.pingSupplicant()); 8658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 8758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 8858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang @Override 8958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang public void tearDown() throws Exception { 9058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang log("tearDown()"); 9158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang super.tearDown(); 9258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 9358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 941c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang private void validateFrequencyBand() { 951c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang if (mFrequencyBand != null) { 961c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang int currentFreq = mWifiManager.getFrequencyBand(); 971c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang Log.v(TAG, "read frequency band: " + currentFreq); 981c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang assertTrue("device frequency band is not set successfully", (mBand == currentFreq)); 991c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang } 1001c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang } 1011c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang 10258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang /** 10358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * Connect to the provided Wi-Fi network 10458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * @param config is the network configuration 10558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * @return true if the connection is successful. 10658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang */ 10758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private void connectToWifi(WifiConfiguration config) { 10858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang // step 1: connect to the test access point 10958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertTrue("failed to associate with " + config.SSID, 11058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang mAct.connectToWifiWithConfiguration(config)); 11158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 11258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang // step 2: verify Wifi state and network state; 11358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertTrue("failed to connect with " + config.SSID, 11458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang mAct.waitForNetworkState(ConnectivityManager.TYPE_WIFI, 11558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang State.CONNECTED, ConnectivityManagerTestActivity.WIFI_CONNECTION_TIMEOUT)); 11658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 11758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang // step 3: verify the current connected network is the given SSID 11858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertNotNull("Wifi connection returns null", mAct.mWifiManager.getConnectionInfo()); 11958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertTrue(config.SSID.contains(mAct.mWifiManager.getConnectionInfo().getSSID())); 12058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 12158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 12258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private void sleep(long sometime, String errorMsg) { 12358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang try { 12458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang Thread.sleep(sometime); 12558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } catch (InterruptedException e) { 12658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang fail(errorMsg); 12758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 12858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 12958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 13058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang private void log(String message) { 13158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang Log.v(TAG, message); 13258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 13358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang 13458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang @LargeTest 13558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang public void testWifiAssociation() { 13658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertNotNull("no test ssid", mSsid); 13758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang WifiConfiguration config = new WifiConfiguration(); 13858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.SSID = mSsid; 13958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang SECURITY_TYPE security = SECURITY_TYPE.valueOf(mSecurityType); 14058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang log("Security type is " + security.toString()); 14158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang switch (security) { 14258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang // set network configurations 14358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case OPEN: 14458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedKeyManagement.set(KeyMgmt.NONE); 14558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 14658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case WEP64: 14758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang // always use hex pair for WEP-40 14858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertTrue("not a WEP64 security type?", mPassword.length() == 10); 14958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedKeyManagement.set(KeyMgmt.NONE); 15058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); 15158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED); 15258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedGroupCiphers.set(GroupCipher.WEP40); 15358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang if (mPassword != null) { 15458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang int length = mPassword.length(); 15558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang // WEP-40 15658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang if (mPassword.matches("[0-9A-Fa-f]*")) { 15758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.wepKeys[0] = mPassword; 15858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } else { 15958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang fail("Please type hex pair for the password"); 16058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 16158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 16258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 16358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case WEP128: 16458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertNotNull("password is empty", mPassword); 16558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang // always use hex pair for WEP-104 16658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertTrue("not a WEP128 security type?", mPassword.length() == 26); 16758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedKeyManagement.set(KeyMgmt.NONE); 16858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); 16958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED); 17058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedGroupCiphers.set(GroupCipher.WEP104); 17158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang if (mPassword != null) { 17258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang int length = mPassword.length(); 17358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang // WEP-40 17458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang if (mPassword.matches("[0-9A-Fa-f]*")) { 17558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.wepKeys[0] = mPassword; 17658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } else { 17758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang fail("Please type hex pair for the password"); 17858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 17958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 18058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 18158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case WPA_TKIP: 18258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertNotNull("missing password", mPassword); 18358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedKeyManagement.set(KeyMgmt.WPA_PSK); 18458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); 18558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedProtocols.set(Protocol.WPA); 18658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedPairwiseCiphers.set(PairwiseCipher.TKIP); 18758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedGroupCiphers.set(GroupCipher.TKIP); 18858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang if (mPassword.matches("[0-9A-Fa-f]{64}")) { 18958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.preSharedKey = mPassword; 19058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } else { 19158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.preSharedKey = '"' + mPassword + '"'; 19258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 19358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 19458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang case WPA2_AES: 19558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang assertNotNull("missing password", mPassword); 19658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedKeyManagement.set(KeyMgmt.WPA_PSK); 19758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); 19858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedProtocols.set(Protocol.RSN); 19958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedPairwiseCiphers.set(PairwiseCipher.CCMP); 20058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedGroupCiphers.set(GroupCipher.CCMP); 20158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.allowedProtocols.set(Protocol.RSN); 20258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang if (mPassword.matches("[0-9A-Fa-f]{64}")) { 20358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.preSharedKey = mPassword; 20458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } else { 20558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang config.preSharedKey = '"' + mPassword + '"'; 20658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 20758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 20858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang default: 20958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang fail("Not a valid security type: " + mSecurityType); 21058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang break; 21158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 21258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang Log.v(TAG, "network config: " + config.toString()); 21358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang connectToWifi(config); 21458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang } 21558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang} 216