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