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.Context; 217fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.content.BroadcastReceiver; 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; 27ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.net.wifi.WifiConfiguration; 28ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.net.wifi.WifiManager; 29ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.net.wifi.WifiConfiguration.KeyMgmt; 30ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.os.Handler; 31ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.os.Message; 3273055f12d7764e322f3f83717525a2dba01f9ef9Xia Wangimport android.os.PowerManager; 3373055f12d7764e322f3f83717525a2dba01f9ef9Xia Wangimport android.os.SystemClock; 3419306af73a8175e1327101132e26a35c7dfe5168Xia Wangimport android.test.InstrumentationTestCase; 357fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.util.Log; 36ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lauimport android.view.KeyEvent; 37ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 38ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport com.android.internal.util.AsyncChannel; 39ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 406bffe14c78efa0b56327262543ce2e0dfc024219Xia Wangimport java.io.IOException; 41ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport java.io.InputStream; 426bffe14c78efa0b56327262543ce2e0dfc024219Xia Wangimport java.net.UnknownHostException; 43ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport java.util.ArrayList; 447fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport java.util.List; 457fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 467fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 477fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang/** 4819306af73a8175e1327101132e26a35c7dfe5168Xia Wang * Base InstrumentationTestCase for Connectivity Manager (CM) test suite 4919306af73a8175e1327101132e26a35c7dfe5168Xia Wang * 5019306af73a8175e1327101132e26a35c7dfe5168Xia Wang * It registers connectivity manager broadcast and WiFi broadcast to provide 5119306af73a8175e1327101132e26a35c7dfe5168Xia Wang * network connectivity information, also provides a set of utility functions 5219306af73a8175e1327101132e26a35c7dfe5168Xia Wang * to modify and verify connectivity states. 5319306af73a8175e1327101132e26a35c7dfe5168Xia Wang * 5419306af73a8175e1327101132e26a35c7dfe5168Xia Wang * A CM test case should extend this base class. 557fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 5619306af73a8175e1327101132e26a35c7dfe5168Xia Wangpublic class ConnectivityManagerTestBase extends InstrumentationTestCase { 577fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 5819306af73a8175e1327101132e26a35c7dfe5168Xia Wang public static final String LOG_TAG = "ConnectivityManagerTestBase"; 59ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public static final int WAIT_FOR_SCAN_RESULT = 10 * 1000; //10 seconds 60f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang public static final int WIFI_SCAN_TIMEOUT = 50 * 1000; // 50 seconds 61f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang public static final int SHORT_TIMEOUT = 5 * 1000; // 5 seconds 62f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang public static final long LONG_TIMEOUT = 50 * 1000; // 50 seconds 63f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang public static final long WIFI_CONNECTION_TIMEOUT = 5 * 60 * 1000; // 5 minutes 64a4c2caac05009512213454d329579a79dde11e5fXia Wang // 2 minutes timer between wifi stop and start 65f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang public static final long WIFI_STOP_START_INTERVAL = 2 * 60 * 1000; // 2 minutes 66b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang // Set ping test timer to be 3 minutes 67f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang public static final long PING_TIMER = 3 * 60 *1000; // 3 minutes 686026d52710d7a6195a33885020d29aa1330fa855Xia Wang public static final int SUCCESS = 0; // for Wifi tethering state change 696026d52710d7a6195a33885020d29aa1330fa855Xia Wang public static final int FAILURE = 1; 706026d52710d7a6195a33885020d29aa1330fa855Xia Wang public static final int INIT = -1; 71ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang private static final String ACCESS_POINT_FILE = "accesspoints.xml"; 727fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public ConnectivityReceiver mConnectivityReceiver = null; 737fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public WifiReceiver mWifiReceiver = null; 74a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang private AccessPointParserHelper mParseHelper = null; 757fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang /* 767fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * Track network connectivity information 777fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 787fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public State mState; 797fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public NetworkInfo mNetworkInfo; 807fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public NetworkInfo mOtherNetworkInfo; 817fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean mIsFailOver; 827fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public String mReason; 837fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean mScanResultIsAvailable = false; 847fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public ConnectivityManager mCM; 852c15966f8cf6160ad5dcbbde372508de89985829Xia Wang public Object wifiObject = new Object(); 862c15966f8cf6160ad5dcbbde372508de89985829Xia Wang public Object connectivityObject = new Object(); 872c15966f8cf6160ad5dcbbde372508de89985829Xia Wang public int mWifiState; 882c15966f8cf6160ad5dcbbde372508de89985829Xia Wang public NetworkInfo mWifiNetworkInfo; 892c15966f8cf6160ad5dcbbde372508de89985829Xia Wang public String mBssid; 903d273da8fa08ddcb16b8fefa35aff10b45778ddcYu Shan Emily Lau public String mPowerSsid = "opennet"; //Default power SSID 91ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau private Context mContext; 9290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang public boolean scanResultAvailable = false; 937fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 9419306af73a8175e1327101132e26a35c7dfe5168Xia Wang /* Control Wifi States */ 957fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public WifiManager mWifiManager; 9619306af73a8175e1327101132e26a35c7dfe5168Xia Wang /* Verify connectivity state */ 972c15966f8cf6160ad5dcbbde372508de89985829Xia Wang public static final int NUM_NETWORK_TYPES = ConnectivityManager.MAX_NETWORK_TYPE + 1; 987fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang NetworkState[] connectivityState = new NetworkState[NUM_NETWORK_TYPES]; 997fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1006026d52710d7a6195a33885020d29aa1330fa855Xia Wang // For wifi tethering tests 1016026d52710d7a6195a33885020d29aa1330fa855Xia Wang private String[] mWifiRegexs; 1026026d52710d7a6195a33885020d29aa1330fa855Xia Wang public int mWifiTetherResult = INIT; // -1 is initialization state 1036026d52710d7a6195a33885020d29aa1330fa855Xia Wang 1047fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang /** 1057fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * A wrapper of a broadcast receiver which provides network connectivity information 1067fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * for all kinds of network: wifi, mobile, etc. 1077fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 1087fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang private class ConnectivityReceiver extends BroadcastReceiver { 1097fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang @Override 1107fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public void onReceive(Context context, Intent intent) { 111a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("ConnectivityReceiver: onReceive() is called with " + intent); 1127fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang String action = intent.getAction(); 1137fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { 1147fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Log.v("ConnectivityReceiver", "onReceive() called with " + intent); 1157fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return; 1167fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1177fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1187fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang boolean noConnectivity = 1197fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); 1207fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1217fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (noConnectivity) { 1227fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mState = State.DISCONNECTED; 1237fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } else { 1247fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mState = State.CONNECTED; 1257fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1267fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1277fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mNetworkInfo = (NetworkInfo) 1287fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 1297fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1307fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mOtherNetworkInfo = (NetworkInfo) 1317fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO); 1327fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1337fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mReason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON); 1347fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mIsFailOver = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false); 1352c15966f8cf6160ad5dcbbde372508de89985829Xia Wang 136a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("mNetworkInfo: " + mNetworkInfo.toString()); 1372c15966f8cf6160ad5dcbbde372508de89985829Xia Wang if (mOtherNetworkInfo != null) { 138a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("mOtherNetworkInfo: " + mOtherNetworkInfo.toString()); 1392c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 1407fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang recordNetworkState(mNetworkInfo.getType(), mNetworkInfo.getState()); 1417fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (mOtherNetworkInfo != null) { 1427fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang recordNetworkState(mOtherNetworkInfo.getType(), mOtherNetworkInfo.getState()); 1437fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1442c15966f8cf6160ad5dcbbde372508de89985829Xia Wang notifyNetworkConnectivityChange(); 1457fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1467fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1477fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1487fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang private class WifiReceiver extends BroadcastReceiver { 1497fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang @Override 1507fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public void onReceive(Context context, Intent intent) { 1517fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang String action = intent.getAction(); 1522c15966f8cf6160ad5dcbbde372508de89985829Xia Wang Log.v("WifiReceiver", "onReceive() is calleld with " + intent); 1532c15966f8cf6160ad5dcbbde372508de89985829Xia Wang if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { 15490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang log("scan results are available"); 1552c15966f8cf6160ad5dcbbde372508de89985829Xia Wang notifyScanResult(); 1562c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { 1572c15966f8cf6160ad5dcbbde372508de89985829Xia Wang mWifiNetworkInfo = 1582c15966f8cf6160ad5dcbbde372508de89985829Xia Wang (NetworkInfo) intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 159a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("mWifiNetworkInfo: " + mWifiNetworkInfo.toString()); 1602c15966f8cf6160ad5dcbbde372508de89985829Xia Wang if (mWifiNetworkInfo.getState() == State.CONNECTED) { 1612c15966f8cf6160ad5dcbbde372508de89985829Xia Wang mBssid = intent.getStringExtra(WifiManager.EXTRA_BSSID); 1622c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 1632c15966f8cf6160ad5dcbbde372508de89985829Xia Wang notifyWifiState(); 1642c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } else if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) { 1652c15966f8cf6160ad5dcbbde372508de89985829Xia Wang mWifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 1662c15966f8cf6160ad5dcbbde372508de89985829Xia Wang WifiManager.WIFI_STATE_UNKNOWN); 1672c15966f8cf6160ad5dcbbde372508de89985829Xia Wang notifyWifiState(); 1686026d52710d7a6195a33885020d29aa1330fa855Xia Wang } else if (action.equals(WifiManager.WIFI_AP_STATE_CHANGED_ACTION)) { 1696026d52710d7a6195a33885020d29aa1330fa855Xia Wang notifyWifiAPState(); 1706026d52710d7a6195a33885020d29aa1330fa855Xia Wang } else if (action.equals(ConnectivityManager.ACTION_TETHER_STATE_CHANGED)) { 1716026d52710d7a6195a33885020d29aa1330fa855Xia Wang ArrayList<String> available = intent.getStringArrayListExtra( 1726026d52710d7a6195a33885020d29aa1330fa855Xia Wang ConnectivityManager.EXTRA_AVAILABLE_TETHER); 1736026d52710d7a6195a33885020d29aa1330fa855Xia Wang ArrayList<String> active = intent.getStringArrayListExtra( 1746026d52710d7a6195a33885020d29aa1330fa855Xia Wang ConnectivityManager.EXTRA_ACTIVE_TETHER); 1756026d52710d7a6195a33885020d29aa1330fa855Xia Wang ArrayList<String> errored = intent.getStringArrayListExtra( 1766026d52710d7a6195a33885020d29aa1330fa855Xia Wang ConnectivityManager.EXTRA_ERRORED_TETHER); 1776026d52710d7a6195a33885020d29aa1330fa855Xia Wang updateTetherState(available.toArray(), active.toArray(), errored.toArray()); 1782c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 1792c15966f8cf6160ad5dcbbde372508de89985829Xia Wang else { 1807fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return; 1817fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1827fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1837fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1847fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 185ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff private class WifiServiceHandler extends Handler { 186ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff @Override 187ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff public void handleMessage(Message msg) { 188ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff switch (msg.what) { 189ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: 190ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { 191ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff //AsyncChannel in msg.obj 192ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff } else { 193ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff log("Failed to establish AsyncChannel connection"); 194ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff } 195ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff break; 196ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff default: 197ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff //Ignore 198ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff break; 199ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff } 200ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff } 201ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff } 202ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 20319306af73a8175e1327101132e26a35c7dfe5168Xia Wang @Override 20419306af73a8175e1327101132e26a35c7dfe5168Xia Wang public void setUp() throws Exception { 2057fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mState = State.UNKNOWN; 20690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang scanResultAvailable = false; 20719306af73a8175e1327101132e26a35c7dfe5168Xia Wang mContext = getInstrumentation().getContext(); 2087fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 20919306af73a8175e1327101132e26a35c7dfe5168Xia Wang // Get an instance of ConnectivityManager 21019306af73a8175e1327101132e26a35c7dfe5168Xia Wang mCM = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE); 21119306af73a8175e1327101132e26a35c7dfe5168Xia Wang // Get an instance of WifiManager 21219306af73a8175e1327101132e26a35c7dfe5168Xia Wang mWifiManager =(WifiManager)mContext.getSystemService(Context.WIFI_SERVICE); 2137fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 21419306af73a8175e1327101132e26a35c7dfe5168Xia Wang if (mWifiManager.isWifiApEnabled()) { 21519306af73a8175e1327101132e26a35c7dfe5168Xia Wang // if soft AP is enabled, disable it 21619306af73a8175e1327101132e26a35c7dfe5168Xia Wang mWifiManager.setWifiApEnabled(null, false); 21719306af73a8175e1327101132e26a35c7dfe5168Xia Wang log("Disable soft ap"); 21819306af73a8175e1327101132e26a35c7dfe5168Xia Wang } 2197fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 22019306af73a8175e1327101132e26a35c7dfe5168Xia Wang initializeNetworkStates(); 2212c15966f8cf6160ad5dcbbde372508de89985829Xia Wang 2227fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // register a connectivity receiver for CONNECTIVITY_ACTION; 2232c15966f8cf6160ad5dcbbde372508de89985829Xia Wang mConnectivityReceiver = new ConnectivityReceiver(); 22419306af73a8175e1327101132e26a35c7dfe5168Xia Wang mContext.registerReceiver(mConnectivityReceiver, 2257fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 2267fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2277fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mWifiReceiver = new WifiReceiver(); 2282c15966f8cf6160ad5dcbbde372508de89985829Xia Wang IntentFilter mIntentFilter = new IntentFilter(); 2292c15966f8cf6160ad5dcbbde372508de89985829Xia Wang mIntentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 2302c15966f8cf6160ad5dcbbde372508de89985829Xia Wang mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 2312c15966f8cf6160ad5dcbbde372508de89985829Xia Wang mIntentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); 232ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang mIntentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION); 2336026d52710d7a6195a33885020d29aa1330fa855Xia Wang mIntentFilter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION); 2346026d52710d7a6195a33885020d29aa1330fa855Xia Wang mIntentFilter.addAction(ConnectivityManager.ACTION_TETHER_STATE_CHANGED); 23519306af73a8175e1327101132e26a35c7dfe5168Xia Wang mContext.registerReceiver(mWifiReceiver, mIntentFilter); 2362c15966f8cf6160ad5dcbbde372508de89985829Xia Wang 237dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang log("Clear Wifi before we start the test."); 238dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang removeConfiguredNetworksAndDisableWifi(); 2396026d52710d7a6195a33885020d29aa1330fa855Xia Wang mWifiRegexs = mCM.getTetherableWifiRegexs(); 2407fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2417fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 242ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public List<WifiConfiguration> loadNetworkConfigurations() throws Exception { 24319306af73a8175e1327101132e26a35c7dfe5168Xia Wang InputStream in = mContext.getAssets().open(ACCESS_POINT_FILE); 244a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang mParseHelper = new AccessPointParserHelper(in); 245a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang return mParseHelper.getNetworkConfigurations(); 246ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 247ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 2487fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // for each network type, initialize network states to UNKNOWN, and no verification flag is set 2497fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public void initializeNetworkStates() { 2507fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang for (int networkType = NUM_NETWORK_TYPES - 1; networkType >=0; networkType--) { 2517fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang connectivityState[networkType] = new NetworkState(); 252a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("Initialize network state for " + networkType + ": " + 2537fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang connectivityState[networkType].toString()); 2547fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2557fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2567fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2577fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // deposit a network state 2587fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public void recordNetworkState(int networkType, State networkState) { 259a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("record network state for network " + networkType + 2602c15966f8cf6160ad5dcbbde372508de89985829Xia Wang ", state is " + networkState); 26119306af73a8175e1327101132e26a35c7dfe5168Xia Wang if (connectivityState == null) { 26219306af73a8175e1327101132e26a35c7dfe5168Xia Wang log("ConnectivityState is null"); 26319306af73a8175e1327101132e26a35c7dfe5168Xia Wang } 26419306af73a8175e1327101132e26a35c7dfe5168Xia Wang if (connectivityState[networkType] == null) { 26519306af73a8175e1327101132e26a35c7dfe5168Xia Wang log("connectivityState[networkType] is null"); 26619306af73a8175e1327101132e26a35c7dfe5168Xia Wang } 2677fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang connectivityState[networkType].recordState(networkState); 2687fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2697fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2707fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // set the state transition criteria 2717fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public void setStateTransitionCriteria(int networkType, State initState, 2727fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang int transitionDir, State targetState) { 2737fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang connectivityState[networkType].setStateTransitionCriteria( 2747fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang initState, transitionDir, targetState); 2757fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2767fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2777fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Validate the states recorded 2787fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean validateNetworkStates(int networkType) { 279a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("validate network state for " + networkType + ": "); 2807fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return connectivityState[networkType].validateStateTransition(); 2817fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2827fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2837fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // return result from network state validation 2847fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public String getTransitionFailureReason(int networkType) { 285a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("get network state transition failure reason for " + networkType + ": " + 2867fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang connectivityState[networkType].toString()); 2877fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return connectivityState[networkType].getReason(); 2887fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2897fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2902c15966f8cf6160ad5dcbbde372508de89985829Xia Wang private void notifyNetworkConnectivityChange() { 2912c15966f8cf6160ad5dcbbde372508de89985829Xia Wang synchronized(connectivityObject) { 292a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("notify network connectivity changed"); 2932c15966f8cf6160ad5dcbbde372508de89985829Xia Wang connectivityObject.notifyAll(); 2942c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 2952c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 2967fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang private void notifyScanResult() { 2977fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang synchronized (this) { 298a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("notify that scan results are available"); 29990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang scanResultAvailable = true; 3007fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang this.notify(); 3017fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 3027fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 3037fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 3046026d52710d7a6195a33885020d29aa1330fa855Xia Wang private void notifyWifiState() { 3052c15966f8cf6160ad5dcbbde372508de89985829Xia Wang synchronized (wifiObject) { 306a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("notify wifi state changed"); 3072c15966f8cf6160ad5dcbbde372508de89985829Xia Wang wifiObject.notify(); 3082c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 3092c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 3102c15966f8cf6160ad5dcbbde372508de89985829Xia Wang 3116026d52710d7a6195a33885020d29aa1330fa855Xia Wang private void notifyWifiAPState() { 3126026d52710d7a6195a33885020d29aa1330fa855Xia Wang synchronized (this) { 313a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("notify wifi AP state changed"); 3146026d52710d7a6195a33885020d29aa1330fa855Xia Wang this.notify(); 3156026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3166026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3176026d52710d7a6195a33885020d29aa1330fa855Xia Wang 3186026d52710d7a6195a33885020d29aa1330fa855Xia Wang // Update wifi tethering state 3196026d52710d7a6195a33885020d29aa1330fa855Xia Wang private void updateTetherState(Object[] available, Object[] tethered, Object[] errored) { 3206026d52710d7a6195a33885020d29aa1330fa855Xia Wang boolean wifiTethered = false; 3216026d52710d7a6195a33885020d29aa1330fa855Xia Wang boolean wifiErrored = false; 3226026d52710d7a6195a33885020d29aa1330fa855Xia Wang 3236026d52710d7a6195a33885020d29aa1330fa855Xia Wang synchronized (this) { 3246026d52710d7a6195a33885020d29aa1330fa855Xia Wang for (Object obj: tethered) { 3256026d52710d7a6195a33885020d29aa1330fa855Xia Wang String str = (String)obj; 3266026d52710d7a6195a33885020d29aa1330fa855Xia Wang for (String tethRex: mWifiRegexs) { 327a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("str: " + str +"tethRex: " + tethRex); 3286026d52710d7a6195a33885020d29aa1330fa855Xia Wang if (str.matches(tethRex)) { 3296026d52710d7a6195a33885020d29aa1330fa855Xia Wang wifiTethered = true; 3306026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3316026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3326026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3336026d52710d7a6195a33885020d29aa1330fa855Xia Wang 3346026d52710d7a6195a33885020d29aa1330fa855Xia Wang for (Object obj: errored) { 3356026d52710d7a6195a33885020d29aa1330fa855Xia Wang String str = (String)obj; 3366026d52710d7a6195a33885020d29aa1330fa855Xia Wang for (String tethRex: mWifiRegexs) { 337a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("error: str: " + str +"tethRex: " + tethRex); 3386026d52710d7a6195a33885020d29aa1330fa855Xia Wang if (str.matches(tethRex)) { 3396026d52710d7a6195a33885020d29aa1330fa855Xia Wang wifiErrored = true; 3406026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3416026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3426026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3436026d52710d7a6195a33885020d29aa1330fa855Xia Wang 3446026d52710d7a6195a33885020d29aa1330fa855Xia Wang if (wifiTethered) { 3456026d52710d7a6195a33885020d29aa1330fa855Xia Wang mWifiTetherResult = SUCCESS; // wifi tethering is successful 3466026d52710d7a6195a33885020d29aa1330fa855Xia Wang } else if (wifiErrored) { 3476026d52710d7a6195a33885020d29aa1330fa855Xia Wang mWifiTetherResult = FAILURE; // wifi tethering failed 3486026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 349a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("mWifiTetherResult: " + mWifiTetherResult); 3506026d52710d7a6195a33885020d29aa1330fa855Xia Wang this.notify(); 3516026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3526026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3536026d52710d7a6195a33885020d29aa1330fa855Xia Wang 3546026d52710d7a6195a33885020d29aa1330fa855Xia Wang 355ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang // Wait for network connectivity state: CONNECTING, CONNECTED, SUSPENDED, 356ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang // DISCONNECTING, DISCONNECTED, UNKNOWN 357ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public boolean waitForNetworkState(int networkType, State expectedState, long timeout) { 358ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang long startTime = System.currentTimeMillis(); 359ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang while (true) { 360ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if ((System.currentTimeMillis() - startTime) > timeout) { 36190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang log("waitForNetworkState time out, the state of network type " + networkType + 36290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang " is: " + mCM.getNetworkInfo(networkType).getState()); 363ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (mCM.getNetworkInfo(networkType).getState() != expectedState) { 364ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return false; 365ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else { 366ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang // the broadcast has been sent out. the state has been changed. 367a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("networktype: " + networkType + " state: " + 368ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang mCM.getNetworkInfo(networkType)); 369ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return true; 370ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 371ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 372a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("Wait for the connectivity state for network: " + networkType + 373ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang " to be " + expectedState.toString()); 374ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang synchronized (connectivityObject) { 375ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang try { 376ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang connectivityObject.wait(SHORT_TIMEOUT); 377ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } catch (InterruptedException e) { 378ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang e.printStackTrace(); 379ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 380ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if ((mNetworkInfo.getType() != networkType) || 381ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang (mNetworkInfo.getState() != expectedState)) { 382a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("network state for " + mNetworkInfo.getType() + 383ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang "is: " + mNetworkInfo.getState()); 384ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang continue; 385ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 386ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return true; 387ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 388ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 389ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 390ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 391ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang // Wait for Wifi state: WIFI_STATE_DISABLED, WIFI_STATE_DISABLING, WIFI_STATE_ENABLED, 392ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang // WIFI_STATE_ENALBING, WIFI_STATE_UNKNOWN 393ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public boolean waitForWifiState(int expectedState, long timeout) { 394ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang long startTime = System.currentTimeMillis(); 395ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang while (true) { 396ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if ((System.currentTimeMillis() - startTime) > timeout) { 397ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (mWifiState != expectedState) { 398ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return false; 399ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else { 400ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return true; 401ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 402ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 403a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("Wait for wifi state to be: " + expectedState); 404ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang synchronized (wifiObject) { 405ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang try { 406ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang wifiObject.wait(SHORT_TIMEOUT); 407ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } catch (InterruptedException e) { 408ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang e.printStackTrace(); 409ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 410ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (mWifiState != expectedState) { 411a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("Wifi state is: " + mWifiState); 412ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang continue; 413ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 414ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return true; 415ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 416ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 417ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 418ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 4196026d52710d7a6195a33885020d29aa1330fa855Xia Wang // Wait for Wifi AP state: WIFI_AP_STATE_DISABLED, WIFI_AP_STATE_DISABLING, 4206026d52710d7a6195a33885020d29aa1330fa855Xia Wang // WIFI_AP_STATE_ENABLED, WIFI_STATE_ENALBING, WIFI_STATE_UNKNOWN 4216026d52710d7a6195a33885020d29aa1330fa855Xia Wang public boolean waitForWifiAPState(int expectedState, long timeout) { 4226026d52710d7a6195a33885020d29aa1330fa855Xia Wang long startTime = System.currentTimeMillis(); 4236026d52710d7a6195a33885020d29aa1330fa855Xia Wang while (true) { 4246026d52710d7a6195a33885020d29aa1330fa855Xia Wang if ((System.currentTimeMillis() - startTime) > timeout) { 4256026d52710d7a6195a33885020d29aa1330fa855Xia Wang if (mWifiManager.getWifiApState() != expectedState) { 4266026d52710d7a6195a33885020d29aa1330fa855Xia Wang return false; 4276026d52710d7a6195a33885020d29aa1330fa855Xia Wang } else { 4286026d52710d7a6195a33885020d29aa1330fa855Xia Wang return true; 4296026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4306026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 431a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("Wait for wifi AP state to be: " + expectedState); 4326026d52710d7a6195a33885020d29aa1330fa855Xia Wang synchronized (wifiObject) { 4336026d52710d7a6195a33885020d29aa1330fa855Xia Wang try { 4346026d52710d7a6195a33885020d29aa1330fa855Xia Wang wifiObject.wait(SHORT_TIMEOUT); 4356026d52710d7a6195a33885020d29aa1330fa855Xia Wang } catch (InterruptedException e) { 4366026d52710d7a6195a33885020d29aa1330fa855Xia Wang e.printStackTrace(); 4376026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4386026d52710d7a6195a33885020d29aa1330fa855Xia Wang if (mWifiManager.getWifiApState() != expectedState) { 439a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("Wifi state is: " + mWifiManager.getWifiApState()); 4406026d52710d7a6195a33885020d29aa1330fa855Xia Wang continue; 4416026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4426026d52710d7a6195a33885020d29aa1330fa855Xia Wang return true; 4436026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4446026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4456026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4466026d52710d7a6195a33885020d29aa1330fa855Xia Wang 4476026d52710d7a6195a33885020d29aa1330fa855Xia Wang /** 4486026d52710d7a6195a33885020d29aa1330fa855Xia Wang * Wait for the wifi tethering result: 4496026d52710d7a6195a33885020d29aa1330fa855Xia Wang * @param timeout is the maximum waiting time 4506026d52710d7a6195a33885020d29aa1330fa855Xia Wang * @return SUCCESS if tethering result is successful 4516026d52710d7a6195a33885020d29aa1330fa855Xia Wang * FAILURE if tethering result returns error. 4526026d52710d7a6195a33885020d29aa1330fa855Xia Wang */ 4536026d52710d7a6195a33885020d29aa1330fa855Xia Wang public int waitForTetherStateChange(long timeout) { 4546026d52710d7a6195a33885020d29aa1330fa855Xia Wang long startTime = System.currentTimeMillis(); 4556026d52710d7a6195a33885020d29aa1330fa855Xia Wang while (true) { 4566026d52710d7a6195a33885020d29aa1330fa855Xia Wang if ((System.currentTimeMillis() - startTime) > timeout) { 4576026d52710d7a6195a33885020d29aa1330fa855Xia Wang return mWifiTetherResult; 4586026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 459a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("Wait for wifi tethering result."); 4606026d52710d7a6195a33885020d29aa1330fa855Xia Wang synchronized (this) { 4616026d52710d7a6195a33885020d29aa1330fa855Xia Wang try { 4626026d52710d7a6195a33885020d29aa1330fa855Xia Wang this.wait(SHORT_TIMEOUT); 4636026d52710d7a6195a33885020d29aa1330fa855Xia Wang } catch (InterruptedException e) { 4646026d52710d7a6195a33885020d29aa1330fa855Xia Wang e.printStackTrace(); 4656026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4666026d52710d7a6195a33885020d29aa1330fa855Xia Wang if (mWifiTetherResult == INIT ) { 4676026d52710d7a6195a33885020d29aa1330fa855Xia Wang continue; 4686026d52710d7a6195a33885020d29aa1330fa855Xia Wang } else { 4696026d52710d7a6195a33885020d29aa1330fa855Xia Wang return mWifiTetherResult; 4706026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4716026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4726026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4736026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4746026d52710d7a6195a33885020d29aa1330fa855Xia Wang 4757fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Return true if device is currently connected to mobile network 4767fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean isConnectedToMobile() { 4777fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return (mNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE); 4787fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 4797fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 4807fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Return true if device is currently connected to Wifi 4817fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean isConnectedToWifi() { 4827fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return (mNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI); 4837fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 4847fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 4857fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean enableWifi() { 4867fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return mWifiManager.setWifiEnabled(true); 4877fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 4887fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 48973055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang // Turn screen off 49073055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang public void turnScreenOff() { 49173055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang log("Turn screen off"); 49273055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang PowerManager pm = 49319306af73a8175e1327101132e26a35c7dfe5168Xia Wang (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); 4949630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown pm.goToSleep(SystemClock.uptimeMillis()); 49573055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang } 49673055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang 49773055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang // Turn screen on 49873055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang public void turnScreenOn() { 49973055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang log("Turn screen on"); 5009630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown PowerManager pm = 50119306af73a8175e1327101132e26a35c7dfe5168Xia Wang (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); 5029630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown pm.wakeUp(SystemClock.uptimeMillis()); 50319306af73a8175e1327101132e26a35c7dfe5168Xia Wang // disable lock screen 50419306af73a8175e1327101132e26a35c7dfe5168Xia Wang KeyguardManager km = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE); 50519306af73a8175e1327101132e26a35c7dfe5168Xia Wang if (km.inKeyguardRestrictedInputMode()) { 50619306af73a8175e1327101132e26a35c7dfe5168Xia Wang sendKeys(KeyEvent.KEYCODE_MENU); 50719306af73a8175e1327101132e26a35c7dfe5168Xia Wang } 50873055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang } 50973055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang 5107fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang /** 5116bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang * @param pingServerList a list of servers that can be used for ping test, can be null 5126bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang * @return true if the ping test is successful, false otherwise. 5136bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang */ 5146bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang public boolean pingTest(String[] pingServerList) { 5156bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang String[] hostList = {"www.google.com", "www.yahoo.com", 5166bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang "www.bing.com", "www.facebook.com", "www.ask.com"}; 5176bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang if (pingServerList != null) { 5186bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang hostList = pingServerList; 5196bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang } 520b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang 521b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang long startTime = System.currentTimeMillis(); 522b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang while ((System.currentTimeMillis() - startTime) < PING_TIMER) { 523b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang try { 524b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang // assume the chance that all servers are down is very small 525b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang for (int i = 0; i < hostList.length; i++ ) { 526b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang String host = hostList[i]; 527b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang log("Start ping test, ping " + host); 528b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang Process p = Runtime.getRuntime().exec("ping -c 10 -w 100 " + host); 529b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang int status = p.waitFor(); 530b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang if (status == 0) { 531b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang // if any of the ping test is successful, return true 532b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang return true; 533b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang } 5346bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang } 535b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang } catch (UnknownHostException e) { 536b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang log("Ping test Fail: Unknown Host"); 537b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang } catch (IOException e) { 538b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang log("Ping test Fail: IOException"); 539b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang } catch (InterruptedException e) { 540b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang log("Ping test Fail: InterruptedException"); 5416bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang } 5426bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang } 543b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang // ping test timeout 544b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang return false; 5456bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang } 5466bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang 5476bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang /** 5487fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * Associate the device to given SSID 5497fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * If the device is already associated with a WiFi, disconnect and forget it, 5507fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * We don't verify whether the connection is successful or not, leave this to the test 5517fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 5527fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean connectToWifi(String knownSSID) { 553ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang WifiConfiguration config = new WifiConfiguration(); 554ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.SSID = knownSSID; 555ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.allowedKeyManagement.set(KeyMgmt.NONE); 556ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return connectToWifiWithConfiguration(config); 557ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 558ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 559ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang /** 560ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * Connect to Wi-Fi with the given configuration. Note the SSID in the configuration 561ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * is pure string, we need to convert it to quoted string. 562ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * @param config 563ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * @return 564ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang */ 565ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public boolean connectToWifiWithConfiguration(WifiConfiguration config) { 566ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang String ssid = config.SSID; 567ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.SSID = convertToQuotedString(ssid); 568ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 569f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang // If Wifi is not enabled, enable it 5707fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (!mWifiManager.isWifiEnabled()) { 571a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("Wifi is not enabled, enable it"); 5727fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mWifiManager.setWifiEnabled(true); 573a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang // wait for the wifi state change before start scanning. 574a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (!waitForWifiState(WifiManager.WIFI_STATE_ENABLED, 2*SHORT_TIMEOUT)) { 575a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("wait for WIFI_STATE_ENABLED failed"); 576a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang return false; 577a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 5787fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 5797fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 580f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang // Save network configuration and connect to network without scanning 581f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang mWifiManager.connect(config, 582f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang new WifiManager.ActionListener() { 583f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang public void onSuccess() { 5847fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 585f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang public void onFailure(int reason) { 586f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang log("connect failure " + reason); 5877fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 588f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang }); 589f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang return true; 5907fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 5917fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 5922c15966f8cf6160ad5dcbbde372508de89985829Xia Wang /* 593ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * Disconnect from the current AP and remove configured networks. 5947fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 5952c15966f8cf6160ad5dcbbde372508de89985829Xia Wang public boolean disconnectAP() { 596dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang // remove saved networks 59781341fee6de80d8808afd8af3009258660a8f834Xia Wang if (!mWifiManager.isWifiEnabled()) { 59881341fee6de80d8808afd8af3009258660a8f834Xia Wang log("Enabled wifi before remove configured networks"); 59981341fee6de80d8808afd8af3009258660a8f834Xia Wang mWifiManager.setWifiEnabled(true); 60081341fee6de80d8808afd8af3009258660a8f834Xia Wang sleep(SHORT_TIMEOUT); 60181341fee6de80d8808afd8af3009258660a8f834Xia Wang } 60219306af73a8175e1327101132e26a35c7dfe5168Xia Wang 603dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang List<WifiConfiguration> wifiConfigList = mWifiManager.getConfiguredNetworks(); 60419306af73a8175e1327101132e26a35c7dfe5168Xia Wang if (wifiConfigList == null) { 60519306af73a8175e1327101132e26a35c7dfe5168Xia Wang log("no configuration list is null"); 60619306af73a8175e1327101132e26a35c7dfe5168Xia Wang return true; 60719306af73a8175e1327101132e26a35c7dfe5168Xia Wang } 608dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang log("size of wifiConfigList: " + wifiConfigList.size()); 609dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang for (WifiConfiguration wifiConfig: wifiConfigList) { 610dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang log("remove wifi configuration: " + wifiConfig.networkId); 611dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang int netId = wifiConfig.networkId; 61288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff mWifiManager.forget(netId, new WifiManager.ActionListener() { 613d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onSuccess() { 614d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 615d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onFailure(int reason) { 616d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff log("Failed to forget " + reason); 617d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 618d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff }); 6192c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 6202c15966f8cf6160ad5dcbbde372508de89985829Xia Wang return true; 6212c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 6222c15966f8cf6160ad5dcbbde372508de89985829Xia Wang /** 6232c15966f8cf6160ad5dcbbde372508de89985829Xia Wang * Disable Wifi 6242c15966f8cf6160ad5dcbbde372508de89985829Xia Wang * @return true if Wifi is disabled successfully 6252c15966f8cf6160ad5dcbbde372508de89985829Xia Wang */ 6262c15966f8cf6160ad5dcbbde372508de89985829Xia Wang public boolean disableWifi() { 6272c15966f8cf6160ad5dcbbde372508de89985829Xia Wang return mWifiManager.setWifiEnabled(false); 6282c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 6292c15966f8cf6160ad5dcbbde372508de89985829Xia Wang 6302c15966f8cf6160ad5dcbbde372508de89985829Xia Wang /** 631ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * Remove configured networks and disable wifi 6322c15966f8cf6160ad5dcbbde372508de89985829Xia Wang */ 633ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public boolean removeConfiguredNetworksAndDisableWifi() { 634dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang if (!disconnectAP()) { 635dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang return false; 636dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang } 637dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang sleep(SHORT_TIMEOUT); 638dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang if (!mWifiManager.setWifiEnabled(false)) { 639dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang return false; 640dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang } 641dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang sleep(SHORT_TIMEOUT); 6427fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return true; 6437fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 6447fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 645dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang private void sleep(long sleeptime) { 646dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang try { 647dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang Thread.sleep(sleeptime); 648dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang } catch (InterruptedException e) {} 649dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang } 650dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang 651069067963cf0117cfb4a1aef99b550b126d9ca92Xia Wang protected static String convertToQuotedString(String string) { 652069067963cf0117cfb4a1aef99b550b126d9ca92Xia Wang return "\"" + string + "\""; 653069067963cf0117cfb4a1aef99b550b126d9ca92Xia Wang } 654069067963cf0117cfb4a1aef99b550b126d9ca92Xia Wang 6557fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang @Override 65619306af73a8175e1327101132e26a35c7dfe5168Xia Wang public void tearDown() throws Exception{ 6577fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang //Unregister receiver 6587fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (mConnectivityReceiver != null) { 65919306af73a8175e1327101132e26a35c7dfe5168Xia Wang mContext.unregisterReceiver(mConnectivityReceiver); 6607fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 6617fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (mWifiReceiver != null) { 66219306af73a8175e1327101132e26a35c7dfe5168Xia Wang mContext.unregisterReceiver(mWifiReceiver); 663ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau } 66419306af73a8175e1327101132e26a35c7dfe5168Xia Wang super.tearDown(); 665ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau } 666a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang 667a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang private void log(String message) { 668a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang Log.v(LOG_TAG, message); 669a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 6707fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang} 671