1ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang/* 2ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * Copyright (C) 2010, The Android Open Source Project 3ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * 4ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * you may not use this file except in compliance with the License. 6ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * You may obtain a copy of the License at 7ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * 8ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * http://www.apache.org/licenses/LICENSE-2.0 9ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * 10ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * Unless required by applicable law or agreed to in writing, software 11ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * distributed under the License is distributed on an "AS IS" BASIS, 12ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * See the License for the specific language governing permissions and 14ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * limitations under the License. 15ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang */ 16ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 17ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangpackage com.android.connectivitymanagertest.functional; 18ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 19ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport com.android.connectivitymanagertest.ConnectivityManagerTestActivity; 20a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wangimport com.android.connectivitymanagertest.ConnectivityManagerTestRunner; 21ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 22ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport android.R; 23ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport android.app.Activity; 24a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wangimport android.content.ContentResolver; 25ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport android.content.Intent; 26ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport android.content.Context; 27ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport android.content.res.Resources; 28ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport android.net.wifi.WifiConfiguration; 29a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wangimport android.net.wifi.WifiConfiguration.KeyMgmt; 30a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wangimport android.net.wifi.WifiConfiguration.Status; 31ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport android.net.wifi.WifiInfo; 32ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport android.net.wifi.WifiManager; 33ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport android.net.ConnectivityManager; 34a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wangimport android.net.DhcpInfo; 35ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport android.net.NetworkInfo; 36ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport android.net.NetworkInfo.State; 37ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.os.Handler; 38ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.os.Message; 39a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wangimport android.provider.Settings; 40ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport android.test.suitebuilder.annotation.LargeTest; 41ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport android.test.ActivityInstrumentationTestCase2; 42ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport android.util.Log; 43ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 44ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport com.android.internal.util.AsyncChannel; 45ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 46ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport java.util.ArrayList; 47a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wangimport java.util.HashSet; 48ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport java.util.List; 49a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wangimport java.util.Set; 50ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 51ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang/** 52ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * Test Wi-Fi connection with different configuration 53ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * To run this tests: 54ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * adb shell am instrument -e class 55ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * com.android.connectivitymanagertest.functional.WifiConnectionTest 56ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * -w com.android.connectivitymanagertest/.ConnectivityManagerTestRunner 57ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang */ 58ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangpublic class WifiConnectionTest 59ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang extends ActivityInstrumentationTestCase2<ConnectivityManagerTestActivity> { 60ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang private static final String TAG = "WifiConnectionTest"; 61a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang private static final boolean DEBUG = false; 62ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang private List<WifiConfiguration> networks = new ArrayList<WifiConfiguration>(); 63ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang private ConnectivityManagerTestActivity mAct; 64a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang private ConnectivityManagerTestRunner mRunner; 65a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang private WifiManager mWifiManager = null; 66a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang private Set<WifiConfiguration> enabledNetworks = null; 67ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 68ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public WifiConnectionTest() { 69a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang super(ConnectivityManagerTestActivity.class); 70ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 71ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 72ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang @Override 73ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public void setUp() throws Exception { 74ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang super.setUp(); 75a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang mRunner = ((ConnectivityManagerTestRunner)getInstrumentation()); 76a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang mWifiManager = (WifiManager) mRunner.getContext().getSystemService(Context.WIFI_SERVICE); 77a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang 78ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang mAct = getActivity(); 79ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff mWifiManager.asyncConnect(mAct, new WifiServiceHandler()); 80ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang networks = mAct.loadNetworkConfigurations(); 81ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (DEBUG) { 82ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang printNetworkConfigurations(); 83ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 84ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 85ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang // enable Wifi and verify wpa_supplicant is started 86ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang assertTrue("enable Wifi failed", mAct.enableWifi()); 87a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang sleep(2 * ConnectivityManagerTestActivity.SHORT_TIMEOUT, 88a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang "interrupted while waiting for WPA_SUPPLICANT to start"); 89ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang WifiInfo mConnection = mAct.mWifiManager.getConnectionInfo(); 90ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang assertNotNull(mConnection); 91ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang assertTrue("wpa_supplicant is not started ", mAct.mWifiManager.pingSupplicant()); 92ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 93ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 94ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff private class WifiServiceHandler extends Handler { 95ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff @Override 96ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff public void handleMessage(Message msg) { 97ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff switch (msg.what) { 98ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: 99ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { 100ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff //AsyncChannel in msg.obj 101ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff } else { 102ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff log("Failed to establish AsyncChannel connection"); 103ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff } 104ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff break; 105ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff default: 106ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff //Ignore 107ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff break; 108ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff } 109ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff } 110ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff } 111ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 112ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang private void printNetworkConfigurations() { 113a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("==== print network configurations parsed from XML file ===="); 114a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("number of access points: " + networks.size()); 115ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang for (WifiConfiguration config : networks) { 116a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log(config.toString()); 117ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 118ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 119ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 120ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang @Override 121ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public void tearDown() throws Exception { 122a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("tearDown()"); 123ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang mAct.removeConfiguredNetworksAndDisableWifi(); 124ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang super.tearDown(); 125ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 126ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 127ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang /** 128ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * Connect to the provided Wi-Fi network 129ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * @param config is the network configuration 130ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * @return true if the connection is successful. 131ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang */ 132ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang private void connectToWifi(WifiConfiguration config) { 133ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang // step 1: connect to the test access point 134ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang assertTrue("failed to connect to " + config.SSID, 135ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang mAct.connectToWifiWithConfiguration(config)); 136ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 137ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang // step 2: verify Wifi state and network state; 138ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang assertTrue(mAct.waitForNetworkState(ConnectivityManager.TYPE_WIFI, 139a4c2caac05009512213454d329579a79dde11e5fXia Wang State.CONNECTED, 6 * ConnectivityManagerTestActivity.LONG_TIMEOUT)); 140ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 141ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang // step 3: verify the current connected network is the given SSID 142a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang assertNotNull("Wifi connection returns null", mAct.mWifiManager.getConnectionInfo()); 143ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (DEBUG) { 144a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("config.SSID = " + config.SSID); 145a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("mAct.mWifiManager.getConnectionInfo.getSSID()" + 146ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang mAct.mWifiManager.getConnectionInfo().getSSID()); 147ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 148ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang assertTrue(config.SSID.contains(mAct.mWifiManager.getConnectionInfo().getSSID())); 149a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 150ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 151a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang private void sleep(long sometime, String errorMsg) { 152ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang try { 153a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang Thread.sleep(sometime); 154a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } catch (InterruptedException e) { 155a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang fail(errorMsg); 156ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 157ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 158ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 159a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang private void log(String message) { 160a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang Log.v(TAG, message); 161a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 162a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang 163ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang @LargeTest 164ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public void testWifiConnections() { 165ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang for (int i = 0; i < networks.size(); i++) { 166a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang String ssid = networks.get(i).SSID; 167a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("-- START Wi-Fi connection test to : " + ssid + " --"); 168ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang connectToWifi(networks.get(i)); 169a4c2caac05009512213454d329579a79dde11e5fXia Wang // wait for 2 minutes between wifi stop and start 1702d9f4620625405b916aa27177a6b5f82f8e5b15dXia Wang sleep(ConnectivityManagerTestActivity.WIFI_STOP_START_INTERVAL, 171a4c2caac05009512213454d329579a79dde11e5fXia Wang "interruped while connected to wifi"); 172a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("-- END Wi-Fi connection test to " + ssid + " -- "); 173ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 174ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 175ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang} 176