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