1fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang/* 2fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * Copyright (C) 2010, The Android Open Source Project 3fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * 4fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * you may not use this file except in compliance with the License. 6fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * You may obtain a copy of the License at 7fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * 8fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * http://www.apache.org/licenses/LICENSE-2.0 9fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * 10fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * Unless required by applicable law or agreed to in writing, software 11fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * distributed under the License is distributed on an "AS IS" BASIS, 12fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * See the License for the specific language governing permissions and 14fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * limitations under the License. 15fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang */ 16fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang 177fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangpackage com.android.connectivitymanagertest; 187fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1919306af73a8175e1327101132e26a35c7dfe5168Xia Wangimport android.app.KeyguardManager; 207fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.content.BroadcastReceiver; 21d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport android.content.Context; 227fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.content.Intent; 237fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.content.IntentFilter; 24ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.net.ConnectivityManager; 25ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.net.NetworkInfo; 26ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.net.NetworkInfo.State; 27d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport android.net.wifi.ScanResult; 28ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.net.wifi.WifiConfiguration; 29d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport android.net.wifi.WifiManager; 3073055f12d7764e322f3f83717525a2dba01f9ef9Xia Wangimport android.os.PowerManager; 3173055f12d7764e322f3f83717525a2dba01f9ef9Xia Wangimport android.os.SystemClock; 3219306af73a8175e1327101132e26a35c7dfe5168Xia Wangimport android.test.InstrumentationTestCase; 337fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.util.Log; 34ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lauimport android.view.KeyEvent; 35ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 366bffe14c78efa0b56327262543ce2e0dfc024219Xia Wangimport java.io.IOException; 376bffe14c78efa0b56327262543ce2e0dfc024219Xia Wangimport java.net.UnknownHostException; 387fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport java.util.List; 397fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 407fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 417fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang/** 4219306af73a8175e1327101132e26a35c7dfe5168Xia Wang * Base InstrumentationTestCase for Connectivity Manager (CM) test suite 4319306af73a8175e1327101132e26a35c7dfe5168Xia Wang * 4419306af73a8175e1327101132e26a35c7dfe5168Xia Wang * It registers connectivity manager broadcast and WiFi broadcast to provide 4519306af73a8175e1327101132e26a35c7dfe5168Xia Wang * network connectivity information, also provides a set of utility functions 4619306af73a8175e1327101132e26a35c7dfe5168Xia Wang * to modify and verify connectivity states. 4719306af73a8175e1327101132e26a35c7dfe5168Xia Wang * 4819306af73a8175e1327101132e26a35c7dfe5168Xia Wang * A CM test case should extend this base class. 497fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 5019306af73a8175e1327101132e26a35c7dfe5168Xia Wangpublic class ConnectivityManagerTestBase extends InstrumentationTestCase { 517fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 5258a3ddf5aafacbd84de7104f07a994bb06a9b374Eric Rowe private static final String[] PING_HOST_LIST = { 5358a3ddf5aafacbd84de7104f07a994bb06a9b374Eric Rowe "www.google.com", "www.yahoo.com", "www.bing.com", "www.facebook.com", "www.ask.com"}; 54d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu 55d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected static final int WAIT_FOR_SCAN_RESULT = 10 * 1000; //10 seconds 56d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected static final int WIFI_SCAN_TIMEOUT = 50 * 1000; // 50 seconds 57d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected static final int SHORT_TIMEOUT = 5 * 1000; // 5 seconds 58f5031e549472d1d813fa39b6b2973cd20c1b1120Eric Rowe protected static final long LONG_TIMEOUT = 2 * 60 * 1000; // 2 minutes 59d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected static final long WIFI_CONNECTION_TIMEOUT = 5 * 60 * 1000; // 5 minutes 60a4c2caac05009512213454d329579a79dde11e5fXia Wang // 2 minutes timer between wifi stop and start 61d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected static final long WIFI_STOP_START_INTERVAL = 2 * 60 * 1000; // 2 minutes 62b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang // Set ping test timer to be 3 minutes 63d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected static final long PING_TIMER = 3 * 60 *1000; // 3 minutes 64d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected static final int SUCCESS = 0; // for Wifi tethering state change 65d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected static final int FAILURE = 1; 66d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected static final int INIT = -1; 67d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu 682591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe protected final String mLogTag; 692591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 70d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu private ConnectivityReceiver mConnectivityReceiver = null; 71d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu private WifiReceiver mWifiReceiver = null; 72d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu 73d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu private long mLastConnectivityChangeTime = -1; 74d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected ConnectivityManager mCm; 75ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau private Context mContext; 76d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected List<ScanResult> mLastScanResult; 77d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected Object mWifiScanResultLock = new Object(); 787fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 7919306af73a8175e1327101132e26a35c7dfe5168Xia Wang /* Control Wifi States */ 807fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public WifiManager mWifiManager; 817fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 822591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe public ConnectivityManagerTestBase(String logTag) { 832591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe super(); 842591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe mLogTag = logTag; 852591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 862591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 87d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected long getLastConnectivityChangeTime() { 88d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu return mLastConnectivityChangeTime; 89d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } 906026d52710d7a6195a33885020d29aa1330fa855Xia Wang 917fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang /** 927fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * A wrapper of a broadcast receiver which provides network connectivity information 937fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * for all kinds of network: wifi, mobile, etc. 947fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 957fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang private class ConnectivityReceiver extends BroadcastReceiver { 967fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang @Override 977fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public void onReceive(Context context, Intent intent) { 98d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu mLastConnectivityChangeTime = SystemClock.uptimeMillis(); 992591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("ConnectivityReceiver: " + intent); 1007fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang String action = intent.getAction(); 1017fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { 1027fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Log.v("ConnectivityReceiver", "onReceive() called with " + intent); 1037fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1047fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1057fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1067fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1077fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang private class WifiReceiver extends BroadcastReceiver { 1087fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang @Override 1097fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public void onReceive(Context context, Intent intent) { 1107fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang String action = intent.getAction(); 1112c15966f8cf6160ad5dcbbde372508de89985829Xia Wang Log.v("WifiReceiver", "onReceive() is calleld with " + intent); 1122c15966f8cf6160ad5dcbbde372508de89985829Xia Wang if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { 1132591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("scan results are available"); 114d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu synchronized (mWifiScanResultLock) { 115d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu mLastScanResult = mWifiManager.getScanResults(); 116d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu mWifiScanResultLock.notifyAll(); 1172c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 118ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff } 119ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff } 120ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff } 121ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 12219306af73a8175e1327101132e26a35c7dfe5168Xia Wang @Override 123d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected void setUp() throws Exception { 124d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu mLastScanResult = null; 12519306af73a8175e1327101132e26a35c7dfe5168Xia Wang mContext = getInstrumentation().getContext(); 1267fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 12719306af73a8175e1327101132e26a35c7dfe5168Xia Wang // Get an instance of ConnectivityManager 128d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu mCm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE); 12919306af73a8175e1327101132e26a35c7dfe5168Xia Wang // Get an instance of WifiManager 13019306af73a8175e1327101132e26a35c7dfe5168Xia Wang mWifiManager =(WifiManager)mContext.getSystemService(Context.WIFI_SERVICE); 1317fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 13219306af73a8175e1327101132e26a35c7dfe5168Xia Wang if (mWifiManager.isWifiApEnabled()) { 13319306af73a8175e1327101132e26a35c7dfe5168Xia Wang // if soft AP is enabled, disable it 13419306af73a8175e1327101132e26a35c7dfe5168Xia Wang mWifiManager.setWifiApEnabled(null, false); 1352591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("Disable soft ap"); 13619306af73a8175e1327101132e26a35c7dfe5168Xia Wang } 1377fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1387fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // register a connectivity receiver for CONNECTIVITY_ACTION; 1392c15966f8cf6160ad5dcbbde372508de89985829Xia Wang mConnectivityReceiver = new ConnectivityReceiver(); 14019306af73a8175e1327101132e26a35c7dfe5168Xia Wang mContext.registerReceiver(mConnectivityReceiver, 1417fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 1427fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1437fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mWifiReceiver = new WifiReceiver(); 1442c15966f8cf6160ad5dcbbde372508de89985829Xia Wang IntentFilter mIntentFilter = new IntentFilter(); 1452c15966f8cf6160ad5dcbbde372508de89985829Xia Wang mIntentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 1462c15966f8cf6160ad5dcbbde372508de89985829Xia Wang mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 1472c15966f8cf6160ad5dcbbde372508de89985829Xia Wang mIntentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); 148ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang mIntentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION); 1496026d52710d7a6195a33885020d29aa1330fa855Xia Wang mIntentFilter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION); 1506026d52710d7a6195a33885020d29aa1330fa855Xia Wang mIntentFilter.addAction(ConnectivityManager.ACTION_TETHER_STATE_CHANGED); 15119306af73a8175e1327101132e26a35c7dfe5168Xia Wang mContext.registerReceiver(mWifiReceiver, mIntentFilter); 1522c15966f8cf6160ad5dcbbde372508de89985829Xia Wang 1532591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("Clear Wifi before we start the test."); 154dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang removeConfiguredNetworksAndDisableWifi(); 1557fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1567fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 157d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu // wait for network connectivity state: CONNECTING, CONNECTED, SUSPENDED, DISCONNECTING, 158d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu // DISCONNECTED, UNKNOWN 159d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected boolean waitForNetworkState(int networkType, State expectedState, long timeout) { 160d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu long startTime = SystemClock.uptimeMillis(); 161ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang while (true) { 162d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu NetworkInfo ni = mCm.getNetworkInfo(networkType); 163d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if (ni != null && expectedState.equals(ni.getState())) { 1642591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("waitForNetworkState success: %s", ni); 165ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return true; 166ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 167d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if ((SystemClock.uptimeMillis() - startTime) > timeout) { 1682591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("waitForNetworkState timeout: %s", ni); 169d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu return false; 170d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } 1712591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("waitForNetworkState interim: %s", ni); 172d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu SystemClock.sleep(SHORT_TIMEOUT); 173ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 174ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 175ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 176d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu // wait for Wifi state: WIFI_STATE_DISABLED, WIFI_STATE_DISABLING, WIFI_STATE_ENABLED, 177ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang // WIFI_STATE_ENALBING, WIFI_STATE_UNKNOWN 178d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected boolean waitForWifiState(int expectedState, long timeout) { 179d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu long startTime = SystemClock.uptimeMillis(); 180ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang while (true) { 181d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu int state = mWifiManager.getWifiState(); 182d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if (state == expectedState) { 1832591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("waitForWifiState success: state=" + state); 184ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return true; 185ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 186d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if ((SystemClock.uptimeMillis() - startTime) > timeout) { 1872591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("waitForWifiState timeout: expected=%d, actual=%d", expectedState, state); 188d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu return false; 189d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } 1902591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("waitForWifiState interim: expected=%d, actual=%d", expectedState, state); 191d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu SystemClock.sleep(SHORT_TIMEOUT); 192ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 193ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 194ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 1956026d52710d7a6195a33885020d29aa1330fa855Xia Wang // Wait for Wifi AP state: WIFI_AP_STATE_DISABLED, WIFI_AP_STATE_DISABLING, 1966026d52710d7a6195a33885020d29aa1330fa855Xia Wang // WIFI_AP_STATE_ENABLED, WIFI_STATE_ENALBING, WIFI_STATE_UNKNOWN 197d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected boolean waitForWifiApState(int expectedState, long timeout) { 198d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu long startTime = SystemClock.uptimeMillis(); 1996026d52710d7a6195a33885020d29aa1330fa855Xia Wang while (true) { 200d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu int state = mWifiManager.getWifiApState(); 201d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if (state == expectedState) { 2022591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("waitForWifiAPState success: state=" + state); 2036026d52710d7a6195a33885020d29aa1330fa855Xia Wang return true; 2046026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 205d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if ((SystemClock.uptimeMillis() - startTime) > timeout) { 2062591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv(String.format("waitForWifiAPState timeout: expected=%d, actual=%d", 207d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu expectedState, state)); 208d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu return false; 209d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } 2102591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv(String.format("waitForWifiAPState interim: expected=%d, actual=%d", 211d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu expectedState, state)); 212d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu SystemClock.sleep(SHORT_TIMEOUT); 2136026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 2146026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 2156026d52710d7a6195a33885020d29aa1330fa855Xia Wang 2166026d52710d7a6195a33885020d29aa1330fa855Xia Wang /** 2176026d52710d7a6195a33885020d29aa1330fa855Xia Wang * Wait for the wifi tethering result: 2186026d52710d7a6195a33885020d29aa1330fa855Xia Wang * @param timeout is the maximum waiting time 2196026d52710d7a6195a33885020d29aa1330fa855Xia Wang * @return SUCCESS if tethering result is successful 2206026d52710d7a6195a33885020d29aa1330fa855Xia Wang * FAILURE if tethering result returns error. 2216026d52710d7a6195a33885020d29aa1330fa855Xia Wang */ 222d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected boolean waitForTetherStateChange(long timeout) { 223d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu long startTime = SystemClock.uptimeMillis(); 224d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu String[] wifiRegexes = mCm.getTetherableWifiRegexs(); 2256026d52710d7a6195a33885020d29aa1330fa855Xia Wang while (true) { 226d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if ((SystemClock.uptimeMillis() - startTime) > timeout) { 227d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu return false; 2286026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 229d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu String[] active = mCm.getTetheredIfaces(); 230d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu String[] error = mCm.getTetheringErroredIfaces(); 231d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu for (String iface: active) { 232d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu for (String regex: wifiRegexes) { 233d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if (iface.matches(regex)) { 234d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu return true; 235d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } 2366026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 237d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } 238d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu for (String iface: error) { 239d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu for (String regex: wifiRegexes) { 240d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if (iface.matches(regex)) { 241d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu return false; 242d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } 2436026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 2446026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 245d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu SystemClock.sleep(SHORT_TIMEOUT); 2466026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 2476026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 2486026d52710d7a6195a33885020d29aa1330fa855Xia Wang 2497fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Return true if device is currently connected to mobile network 250d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected boolean isConnectedToMobile() { 251d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu return (mCm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_MOBILE); 2527fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2537fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2547fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Return true if device is currently connected to Wifi 255d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected boolean isConnectedToWifi() { 256d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu return (mCm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI); 2577fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2587fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 259d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected boolean enableWifi() { 2607fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return mWifiManager.setWifiEnabled(true); 2617fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2627fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 26373055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang // Turn screen off 264d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected void turnScreenOff() { 2652591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("Turn screen off"); 26673055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang PowerManager pm = 26719306af73a8175e1327101132e26a35c7dfe5168Xia Wang (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); 2689630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown pm.goToSleep(SystemClock.uptimeMillis()); 26973055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang } 27073055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang 27173055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang // Turn screen on 272d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected void turnScreenOn() { 2732591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("Turn screen on"); 2749630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown PowerManager pm = 27519306af73a8175e1327101132e26a35c7dfe5168Xia Wang (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); 2769630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown pm.wakeUp(SystemClock.uptimeMillis()); 27719306af73a8175e1327101132e26a35c7dfe5168Xia Wang // disable lock screen 27819306af73a8175e1327101132e26a35c7dfe5168Xia Wang KeyguardManager km = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE); 27919306af73a8175e1327101132e26a35c7dfe5168Xia Wang if (km.inKeyguardRestrictedInputMode()) { 28019306af73a8175e1327101132e26a35c7dfe5168Xia Wang sendKeys(KeyEvent.KEYCODE_MENU); 28119306af73a8175e1327101132e26a35c7dfe5168Xia Wang } 28273055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang } 28373055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang 2847fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang /** 2856bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang * @return true if the ping test is successful, false otherwise. 2866bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang */ 28758a3ddf5aafacbd84de7104f07a994bb06a9b374Eric Rowe protected boolean pingTest() { 288b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang long startTime = System.currentTimeMillis(); 289b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang while ((System.currentTimeMillis() - startTime) < PING_TIMER) { 290b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang try { 291b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang // assume the chance that all servers are down is very small 29258a3ddf5aafacbd84de7104f07a994bb06a9b374Eric Rowe for (String host : PING_HOST_LIST) { 2932591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("Start ping test, ping " + host); 294b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang Process p = Runtime.getRuntime().exec("ping -c 10 -w 100 " + host); 295b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang int status = p.waitFor(); 296b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang if (status == 0) { 297b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang // if any of the ping test is successful, return true 298b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang return true; 299b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang } 3006bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang } 301b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang } catch (UnknownHostException e) { 3022591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("Ping test Fail: Unknown Host"); 303b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang } catch (IOException e) { 3042591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("Ping test Fail: IOException"); 305b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang } catch (InterruptedException e) { 3062591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("Ping test Fail: InterruptedException"); 3076bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang } 30858a3ddf5aafacbd84de7104f07a994bb06a9b374Eric Rowe SystemClock.sleep(SHORT_TIMEOUT); 3096bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang } 310b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang // ping test timeout 311b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang return false; 3126bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang } 3136bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang 3146bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang /** 3157fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * Associate the device to given SSID 3167fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * If the device is already associated with a WiFi, disconnect and forget it, 3177fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * We don't verify whether the connection is successful or not, leave this to the test 3187fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 31986e15557c52e2847d2adc8495a281dcf0239506eEric Rowe protected boolean connectToWifi(String ssid, String password) { 32086e15557c52e2847d2adc8495a281dcf0239506eEric Rowe WifiConfiguration config; 32186e15557c52e2847d2adc8495a281dcf0239506eEric Rowe if (password == null) { 32286e15557c52e2847d2adc8495a281dcf0239506eEric Rowe config = WifiConfigurationHelper.createOpenConfig(ssid); 32386e15557c52e2847d2adc8495a281dcf0239506eEric Rowe } else { 32486e15557c52e2847d2adc8495a281dcf0239506eEric Rowe config = WifiConfigurationHelper.createPskConfig(ssid, password); 32586e15557c52e2847d2adc8495a281dcf0239506eEric Rowe } 326ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return connectToWifiWithConfiguration(config); 327ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 328ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 329ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang /** 330ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * Connect to Wi-Fi with the given configuration. Note the SSID in the configuration 331ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * is pure string, we need to convert it to quoted string. 332ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang */ 333d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected boolean connectToWifiWithConfiguration(WifiConfiguration config) { 334f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang // If Wifi is not enabled, enable it 3357fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (!mWifiManager.isWifiEnabled()) { 3362591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("Wifi is not enabled, enable it"); 3377fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mWifiManager.setWifiEnabled(true); 338a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang // wait for the wifi state change before start scanning. 339d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if (!waitForWifiState(WifiManager.WIFI_STATE_ENABLED, LONG_TIMEOUT)) { 3402591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("wait for WIFI_STATE_ENABLED failed"); 341a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang return false; 342a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 3437fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 3447fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 345f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang // Save network configuration and connect to network without scanning 346f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang mWifiManager.connect(config, 347f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang new WifiManager.ActionListener() { 3482591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe @Override 349f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang public void onSuccess() { 3507fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 3512591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 3522591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe @Override 353f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang public void onFailure(int reason) { 3542591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("connect failure " + reason); 3557fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 356f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang }); 357f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang return true; 3587fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 3597fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 3602c15966f8cf6160ad5dcbbde372508de89985829Xia Wang /* 361ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * Disconnect from the current AP and remove configured networks. 3627fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 363d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected boolean disconnectAP() { 364dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang // remove saved networks 36581341fee6de80d8808afd8af3009258660a8f834Xia Wang if (!mWifiManager.isWifiEnabled()) { 3662591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("Enabled wifi before remove configured networks"); 36781341fee6de80d8808afd8af3009258660a8f834Xia Wang mWifiManager.setWifiEnabled(true); 368d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu SystemClock.sleep(SHORT_TIMEOUT); 36981341fee6de80d8808afd8af3009258660a8f834Xia Wang } 37019306af73a8175e1327101132e26a35c7dfe5168Xia Wang 371dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang List<WifiConfiguration> wifiConfigList = mWifiManager.getConfiguredNetworks(); 37219306af73a8175e1327101132e26a35c7dfe5168Xia Wang if (wifiConfigList == null) { 3732591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("no configuration list is null"); 37419306af73a8175e1327101132e26a35c7dfe5168Xia Wang return true; 37519306af73a8175e1327101132e26a35c7dfe5168Xia Wang } 3762591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("size of wifiConfigList: " + wifiConfigList.size()); 377dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang for (WifiConfiguration wifiConfig: wifiConfigList) { 3782591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("remove wifi configuration: " + wifiConfig.networkId); 379dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang int netId = wifiConfig.networkId; 38088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff mWifiManager.forget(netId, new WifiManager.ActionListener() { 3812591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe @Override 382d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onSuccess() { 383d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 3842591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 3852591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe @Override 386d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onFailure(int reason) { 3872591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("Failed to forget " + reason); 388d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 389d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff }); 3902c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 3912c15966f8cf6160ad5dcbbde372508de89985829Xia Wang return true; 3922c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 3932c15966f8cf6160ad5dcbbde372508de89985829Xia Wang /** 3942c15966f8cf6160ad5dcbbde372508de89985829Xia Wang * Disable Wifi 3952c15966f8cf6160ad5dcbbde372508de89985829Xia Wang * @return true if Wifi is disabled successfully 3962c15966f8cf6160ad5dcbbde372508de89985829Xia Wang */ 397d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected boolean disableWifi() { 3982c15966f8cf6160ad5dcbbde372508de89985829Xia Wang return mWifiManager.setWifiEnabled(false); 3992c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 4002c15966f8cf6160ad5dcbbde372508de89985829Xia Wang 4012c15966f8cf6160ad5dcbbde372508de89985829Xia Wang /** 402ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * Remove configured networks and disable wifi 4032c15966f8cf6160ad5dcbbde372508de89985829Xia Wang */ 404d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected boolean removeConfiguredNetworksAndDisableWifi() { 405dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang if (!disconnectAP()) { 406dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang return false; 407dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang } 408d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu SystemClock.sleep(SHORT_TIMEOUT); 409dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang if (!mWifiManager.setWifiEnabled(false)) { 410dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang return false; 411dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang } 412d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu SystemClock.sleep(SHORT_TIMEOUT); 4137fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return true; 4147fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 4157fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 416069067963cf0117cfb4a1aef99b550b126d9ca92Xia Wang protected static String convertToQuotedString(String string) { 417069067963cf0117cfb4a1aef99b550b126d9ca92Xia Wang return "\"" + string + "\""; 418069067963cf0117cfb4a1aef99b550b126d9ca92Xia Wang } 419069067963cf0117cfb4a1aef99b550b126d9ca92Xia Wang 420d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected boolean waitForActiveNetworkConnection(long timeout) { 421d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu long startTime = SystemClock.uptimeMillis(); 422d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu while (true) { 423d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu NetworkInfo ni = mCm.getActiveNetworkInfo(); 424d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if (ni != null && ni.isConnected()) { 425d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu return true; 426d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } 427d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if ((SystemClock.uptimeMillis() - startTime) > timeout) { 4282591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("waitForActiveNetworkConnection timeout: %s", ni); 429d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu return false; 430d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } 4312591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("waitForActiveNetworkConnection interim: %s", ni); 432d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu SystemClock.sleep(SHORT_TIMEOUT); 433d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } 434d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } 435d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu 436d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected boolean waitUntilNoActiveNetworkConnection(long timeout) { 437d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu long startTime = SystemClock.uptimeMillis(); 438d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu while (true) { 439d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu NetworkInfo ni = mCm.getActiveNetworkInfo(); 440d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if (ni == null) { 441d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu return true; 442d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } 443d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if ((SystemClock.uptimeMillis() - startTime) > timeout) { 4442591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("waitForActiveNetworkConnection timeout: %s", ni); 445d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu return false; 446d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } 4472591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("waitForActiveNetworkConnection interim: %s", ni); 448d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu SystemClock.sleep(SHORT_TIMEOUT); 449d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } 450d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } 451d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu 452d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu // use ping request against Google public DNS to verify connectivity 453d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected boolean checkNetworkConnectivity() { 454d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertTrue("no active network connection", waitForActiveNetworkConnection(LONG_TIMEOUT)); 45558a3ddf5aafacbd84de7104f07a994bb06a9b374Eric Rowe return pingTest(); 456d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } 457d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu 4587fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang @Override 459d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected void tearDown() throws Exception{ 4607fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang //Unregister receiver 4617fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (mConnectivityReceiver != null) { 46219306af73a8175e1327101132e26a35c7dfe5168Xia Wang mContext.unregisterReceiver(mConnectivityReceiver); 4637fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 4647fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (mWifiReceiver != null) { 46519306af73a8175e1327101132e26a35c7dfe5168Xia Wang mContext.unregisterReceiver(mWifiReceiver); 466ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau } 46719306af73a8175e1327101132e26a35c7dfe5168Xia Wang super.tearDown(); 468ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau } 469a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang 4702591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe protected void logv(String format, Object... args) { 4712591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe Log.v(mLogTag, String.format(format, args)); 472a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 473d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu 474d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu /** 475d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu * Connect to the provided Wi-Fi network 476d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu * @param config is the network configuration 477d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu * @throws AssertionError if fails to associate and connect to wifi ap 478d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu */ 479d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected void connectToWifi(WifiConfiguration config) { 480d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu // step 1: connect to the test access point 481d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertTrue("failed to associate with " + config.SSID, 482d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu connectToWifiWithConfiguration(config)); 483d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu 484d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu // step 2: verify Wifi state and network state; 485d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertTrue("wifi state not connected with " + config.SSID, 486d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu waitForNetworkState(ConnectivityManager.TYPE_WIFI, 4872591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe State.CONNECTED, WIFI_CONNECTION_TIMEOUT)); 488d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu 489d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu // step 3: verify the current connected network is the given SSID 490d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertNotNull("no active wifi info", mWifiManager.getConnectionInfo()); 491d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertEquals("SSID mismatch", config.SSID, mWifiManager.getConnectionInfo().getSSID()); 492d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } 4937fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang} 494