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