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.functional;
187fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
197fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.ConnectivityManager;
207fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.NetworkInfo;
217fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.NetworkInfo.State;
222c15966f8cf6160ad5dcbbde372508de89985829Xia Wangimport android.net.wifi.WifiManager;
23d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport android.os.SystemClock;
244dfa295ad8b75a8c0976e7de078ebe4f654a6a89Brett Chabotimport android.provider.Settings;
254dfa295ad8b75a8c0976e7de078ebe4f654a6a89Brett Chabotimport android.test.suitebuilder.annotation.LargeTest;
264dfa295ad8b75a8c0976e7de078ebe4f654a6a89Brett Chabot
2719306af73a8175e1327101132e26a35c7dfe5168Xia Wangimport com.android.connectivitymanagertest.ConnectivityManagerTestBase;
287fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport com.android.connectivitymanagertest.ConnectivityManagerTestRunner;
297fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
302591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowepublic class ConnectivityManagerMobileTest extends  ConnectivityManagerTestBase {
312591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe
322591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe    public ConnectivityManagerMobileTest() {
332591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe        super(ConnectivityManagerMobileTest.class.getSimpleName());
342591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe    }
352c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
3686e15557c52e2847d2adc8495a281dcf0239506eEric Rowe    private String mSsid;
3786e15557c52e2847d2adc8495a281dcf0239506eEric Rowe    private String mPassword;
38776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang    private boolean mWifiOnlyFlag;
397fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
407fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    @Override
417fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public void setUp() throws Exception {
427fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        super.setUp();
437fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        ConnectivityManagerTestRunner mRunner =
447fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                (ConnectivityManagerTestRunner)getInstrumentation();
4586e15557c52e2847d2adc8495a281dcf0239506eEric Rowe        mSsid = mRunner.getWifiSsid();
4686e15557c52e2847d2adc8495a281dcf0239506eEric Rowe        mPassword = mRunner.getWifiPassword();
4786e15557c52e2847d2adc8495a281dcf0239506eEric Rowe        mWifiOnlyFlag = mRunner.isWifiOnly();
48776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang
497fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        // Each test case will start with cellular connection
50c09cdce1b05075da808ae080b9905a14a3e1e627Christopher Tate        if (Settings.Global.getInt(getInstrumentation().getContext().getContentResolver(),
51c09cdce1b05075da808ae080b9905a14a3e1e627Christopher Tate                Settings.Global.AIRPLANE_MODE_ON) == 1) {
522591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe            logv("airplane is not disabled, disable it.");
53d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu            mCm.setAirplaneMode(false);
542dc2991f5833c9ca72e5e4d1f7bdc1c6c8caca91Xia Wang        }
55776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang
56776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (!mWifiOnlyFlag) {
5719306af73a8175e1327101132e26a35c7dfe5168Xia Wang            if (!waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
5819306af73a8175e1327101132e26a35c7dfe5168Xia Wang                    State.CONNECTED, LONG_TIMEOUT)) {
59b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                // Note: When the test fails in setUp(), tearDown is not called. In that case,
60b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                // the activity is destroyed which blocks the next test at "getActivity()".
61b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                // tearDown() is called here to avoid that situation.
62b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                tearDown();
63b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                fail("Device is not connected to Mobile, setUp failed");
64b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang            }
65ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang        }
667fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
677fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
687fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    @Override
697fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public void tearDown() throws Exception {
7019306af73a8175e1327101132e26a35c7dfe5168Xia Wang        removeConfiguredNetworksAndDisableWifi();
71d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        mCm.setAirplaneMode(false);
727fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        super.tearDown();
737fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
747fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
75be142fc6aae5484b518f6ab29d12f0c086f6fa74Xia Wang    // Test case 1: Test enabling Wifi without associating with any AP, no broadcast on network
76be142fc6aae5484b518f6ab29d12f0c086f6fa74Xia Wang    //              event should be expected.
777fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    @LargeTest
787fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public void test3GToWifiNotification() {
79776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (mWifiOnlyFlag) {
802591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe            logv(getName() + " is excluded for wifi-only test");
81776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang            return;
82776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        }
83d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu
84d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // disable WiFi
85d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("failed to disable WiFi", disableWifi());
86d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu
87d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // wait for mobile
88d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("failed to wait for mobile connection", waitForNetworkState(
89d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                ConnectivityManager.TYPE_MOBILE, State.CONNECTED, LONG_TIMEOUT));
90d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu
91d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // assert that we are indeed using mobile
92d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        NetworkInfo ni = mCm.getActiveNetworkInfo();
93d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertEquals("active network is not mobile", ConnectivityManager.TYPE_MOBILE, ni.getType());
94d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu
95d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        long timestamp = SystemClock.uptimeMillis();
96d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // now enable WiFi
97d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("failed to enable WiFi", enableWifi());
98d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // assert that WiFi state settles at disconnected since no AP should be configured
99d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("WiFi state is not DISCONNECTED after enabling", waitForWifiState(
100d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                WifiManager.WIFI_STATE_DISABLED, LONG_TIMEOUT));
101d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu
102d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // assert that no connectivity change broadcast was sent since we enable wifi
103d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("connectivity has changed since wifi enable",
104d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                timestamp > getLastConnectivityChangeTime());
105d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu
106d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // verify that the device is still connected to MOBILE
1077fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        verifyCellularConnection();
108d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // verify that connection actually works
109d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("no network connectivity at end of test", checkNetworkConnectivity());
1107fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
1117fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
1127fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    // Test case 2: test connection to a given AP
1137fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    @LargeTest
1147fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public void testConnectToWifi() {
11586e15557c52e2847d2adc8495a281dcf0239506eEric Rowe        assertNotNull("SSID is null", mSsid);
1167fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
117d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // assert that we are able to connect to the ap
11886e15557c52e2847d2adc8495a281dcf0239506eEric Rowe        assertTrue("failed to connect to " + mSsid, connectToWifi(mSsid, mPassword));
119d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // assert that WifiManager reports correct state
12012747ab3aafc92f3b86da7df2b1d992866cbaf52Guang Zhu        assertTrue("wifi not enabled", waitForWifiState(
12112747ab3aafc92f3b86da7df2b1d992866cbaf52Guang Zhu                WifiManager.WIFI_STATE_ENABLED, LONG_TIMEOUT));
122d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // assert that ConnectivityManager reports correct state for Wifi
12312747ab3aafc92f3b86da7df2b1d992866cbaf52Guang Zhu        assertTrue("wifi not connected", waitForNetworkState(
12412747ab3aafc92f3b86da7df2b1d992866cbaf52Guang Zhu                ConnectivityManager.TYPE_WIFI, State.CONNECTED, WIFI_CONNECTION_TIMEOUT));
125d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // below check disbabled since we have bug in what ConnectivityManager returns
126d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu//        if (!mWifiOnlyFlag) {
127d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu//            // assert that ConnectivityManager reports correct state for mobile
128d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu//            assertTrue("mobile not disconnected", waitForNetworkState(
129d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu//                    ConnectivityManager.TYPE_MOBILE, State.DISCONNECTED, LONG_TIMEOUT));
130d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu//        }
131d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // verify that connection actually works
132d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("no network connectivity at end of test", checkNetworkConnectivity());
1332c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    }
1342c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
135d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu    // Test case 3: connect & reconnect to Wifi with known AP
1362c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    @LargeTest
1372c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public void testConnectToWifWithKnownAP() {
13886e15557c52e2847d2adc8495a281dcf0239506eEric Rowe        assertNotNull("SSID is null", mSsid);
139d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // enable WiFi
140d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("failed to enable wifi", enableWifi());
141d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // wait for wifi enable
142d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("wifi not enabled", waitForWifiState(
143d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                WifiManager.WIFI_STATE_ENABLED, LONG_TIMEOUT));
144d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // Connect to AP
14586e15557c52e2847d2adc8495a281dcf0239506eEric Rowe        assertTrue("failed to connect to " + mSsid, connectToWifi(mSsid, mPassword));
146d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // verify wifi connected as reported by ConnectivityManager
147d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("wifi not connected", waitForNetworkState(
148d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                ConnectivityManager.TYPE_WIFI, State.CONNECTED, WIFI_CONNECTION_TIMEOUT));
149d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu
150d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("failed to disable wifi", disableWifi());
1512c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
1522c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // Wait for the Wifi state to be DISABLED
153d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("wifi state not disabled", waitForWifiState(
154d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                WifiManager.WIFI_STATE_DISABLED, LONG_TIMEOUT));
155d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // below check disbabled since we have bug in what ConnectivityManager returns
156d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu//        assertTrue("wifi not disconnected", waitForNetworkState(ConnectivityManager.TYPE_WIFI,
157d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu//                State.DISCONNECTED, LONG_TIMEOUT));
158776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (!mWifiOnlyFlag) {
159d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu            assertTrue("mobile not connected after wifi disable", waitForNetworkState(
160d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                    ConnectivityManager.TYPE_MOBILE, State.CONNECTED, LONG_TIMEOUT));
161b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang        }
1622c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
163d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // wait for 30s before restart wifi
164d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        SystemClock.sleep(LONG_TIMEOUT);
165d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("failed to enable wifi after disable", enableWifi());
1662c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
167d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // wait for wifi enable
168d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("wifi not enabled after toggle", waitForWifiState(
169d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                WifiManager.WIFI_STATE_ENABLED, LONG_TIMEOUT));
1702c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // Wait for Wifi to be connected and mobile to be disconnected
171d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("wifi not connected after toggle", waitForNetworkState(
172d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                ConnectivityManager.TYPE_WIFI, State.CONNECTED, WIFI_CONNECTION_TIMEOUT));
173d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // below check disbabled since we have bug in what ConnectivityManager returns
174d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu//        if (!mWifiOnlyFlag) {
175d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu//            assertTrue("mobile not disconnected after wifi toggle", waitForNetworkState(
176d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu//                    ConnectivityManager.TYPE_MOBILE, State.DISCONNECTED, LONG_TIMEOUT));
177d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu//        }
178d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // verify that connection actually works
179d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("no network connectivity at end of test", checkNetworkConnectivity());
1802c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    }
1812c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
182d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu    // Test case 4:  test disconnect and clear wifi settings
1832c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    @LargeTest
1842c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public void testDisconnectWifi() {
18586e15557c52e2847d2adc8495a281dcf0239506eEric Rowe        assertNotNull("SSID is null", mSsid);
1862c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
187d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // enable WiFi
188d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("failed to enable wifi", enableWifi());
189d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // wait for wifi enable
190d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("wifi not enabled", waitForWifiState(
191d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                WifiManager.WIFI_STATE_ENABLED, LONG_TIMEOUT));
1922c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // connect to Wifi
19386e15557c52e2847d2adc8495a281dcf0239506eEric Rowe        assertTrue("failed to connect to " + mSsid, connectToWifi(mSsid, mPassword));
1942c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
195d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("wifi not connected", waitForNetworkState(
196d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                ConnectivityManager.TYPE_WIFI, State.CONNECTED, WIFI_CONNECTION_TIMEOUT));
1972c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
1982c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // clear Wifi
19919306af73a8175e1327101132e26a35c7dfe5168Xia Wang        removeConfiguredNetworksAndDisableWifi();
2002c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
201d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // assert that wifi has been disabled
202d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("wifi state not disabled", waitForWifiState(
203d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                WifiManager.WIFI_STATE_DISABLED, LONG_TIMEOUT));
204776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (!mWifiOnlyFlag) {
205d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu            // assert that mobile is now connected
206d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu            assertTrue("mobile not enabled", waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
20719306af73a8175e1327101132e26a35c7dfe5168Xia Wang                    State.CONNECTED, LONG_TIMEOUT));
208d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu            // verify that connection actually works
209d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu            assertTrue("no network connectivity at end of test", checkNetworkConnectivity());
2107fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        }
2117fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
2122c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
213d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu    // Test case 5: test connectivity with mobile->airplane mode->mobile
2142c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    @LargeTest
2152c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public void testDataConnectionWith3GToAmTo3G() {
216776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (mWifiOnlyFlag) {
2172591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe            logv(getName() + " is excluded for wifi-only test");
218776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang            return;
219776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        }
220d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // disable wifi
221d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("failed to disable wifi", disableWifi());
222d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("wifi state not disabled", waitForWifiState(
223d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                WifiManager.WIFI_STATE_DISABLED, LONG_TIMEOUT));
224d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // assert that we have mobile connection
225d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("no mobile connection", waitForNetworkState(
226d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                ConnectivityManager.TYPE_MOBILE, State.CONNECTED, LONG_TIMEOUT));
2272c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
228d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // enable airplane mode
229d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        mCm.setAirplaneMode(true);
230d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // assert no active network connection after airplane mode enabled
231d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("still has active network connection",
232d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                waitUntilNoActiveNetworkConnection(LONG_TIMEOUT));
2332c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
2342c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // disable airplane mode
235d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        mCm.setAirplaneMode(false);
236d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // assert there is active network connection after airplane mode disabled
237d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("no active network connection after airplane mode disable",
238d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                waitForActiveNetworkConnection(LONG_TIMEOUT));
239d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu
240d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // assert that we have mobile connection
241d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("no mobile connection", waitForNetworkState(
242d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                ConnectivityManager.TYPE_MOBILE, State.CONNECTED, LONG_TIMEOUT));
243d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // verify that connection actually works
244d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("no network connectivity at end of test", checkNetworkConnectivity());
2452c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    }
2462c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
247d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu    // Test case 6: test connectivity with airplane mode on but wifi enabled
2482c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    @LargeTest
2492c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public void testDataConnectionOverAMWithWifi() {
25086e15557c52e2847d2adc8495a281dcf0239506eEric Rowe        assertNotNull("SSID is null", mSsid);
251d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // enable airplane mode
252d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        mCm.setAirplaneMode(true);
253d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // assert there is active network connection after airplane mode disabled
254d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("still has active network connection",
255d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                waitUntilNoActiveNetworkConnection(LONG_TIMEOUT));
2562c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
257d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // connect to Wifi
25886e15557c52e2847d2adc8495a281dcf0239506eEric Rowe        assertTrue("failed to connect to " + mSsid, connectToWifi(mSsid, mPassword));
25912747ab3aafc92f3b86da7df2b1d992866cbaf52Guang Zhu        assertTrue("wifi not connected", waitForNetworkState(
26012747ab3aafc92f3b86da7df2b1d992866cbaf52Guang Zhu                ConnectivityManager.TYPE_WIFI, State.CONNECTED, WIFI_CONNECTION_TIMEOUT));
261d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // verify that connection actually works
262d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("no network connectivity after wifi enable", checkNetworkConnectivity());
2632c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
264d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // disable airplane mode
265d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        mCm.setAirplaneMode(false);
2662c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    }
2672c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
2682c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    // Test case 7: test connectivity while transit from Wifi->AM->Wifi
2692c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    @LargeTest
2702c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public void testDataConnectionWithWifiToAMToWifi () {
271d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // connect to mTestAccessPoint
27286e15557c52e2847d2adc8495a281dcf0239506eEric Rowe        assertNotNull("SSID is null", mSsid);
273d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // enable WiFi
274d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("failed to enable wifi", enableWifi());
275d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // wait for wifi enable
276d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("wifi not enabled", waitForWifiState(
277d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                WifiManager.WIFI_STATE_ENABLED, LONG_TIMEOUT));
278d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // connect to Wifi
27986e15557c52e2847d2adc8495a281dcf0239506eEric Rowe        assertTrue("failed to connect to " + mSsid, connectToWifi(mSsid, mPassword));
28012747ab3aafc92f3b86da7df2b1d992866cbaf52Guang Zhu        assertTrue("wifi not connected", waitForNetworkState(
28112747ab3aafc92f3b86da7df2b1d992866cbaf52Guang Zhu                ConnectivityManager.TYPE_WIFI, State.CONNECTED, WIFI_CONNECTION_TIMEOUT));
2822c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
283d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // enable airplane mode without clearing Wifi
284d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        mCm.setAirplaneMode(true);
285d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // assert there is active network connection after airplane mode disabled
286d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("still has active network connection",
287d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                waitUntilNoActiveNetworkConnection(LONG_TIMEOUT));
2882c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
289d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // disable airplane mode
290d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        mCm.setAirplaneMode(false);
291d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // assert there is active network connection after airplane mode disabled
292d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("no active network connection after airplane mode disable",
293d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                waitForActiveNetworkConnection(LONG_TIMEOUT));
294d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // assert that we have a Wifi connection
295d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("wifi not connected after airplane mode disable", waitForNetworkState(
296d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                ConnectivityManager.TYPE_WIFI, State.CONNECTED, WIFI_CONNECTION_TIMEOUT));
297d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // verify that connection actually works
298d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("no network connectivity at end of test", checkNetworkConnectivity());
2992c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    }
3002c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
3012c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    // Test case 8: test wifi state change while connecting/disconnecting to/from an AP
3022c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    @LargeTest
3032c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public void testWifiStateChange () {
30486e15557c52e2847d2adc8495a281dcf0239506eEric Rowe        assertNotNull("SSID is null", mSsid);
305d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // enable WiFi
306d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("failed to enable wifi", enableWifi());
307d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // wait for wifi enable
308d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("wifi not enabled", waitForWifiState(
309d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                WifiManager.WIFI_STATE_ENABLED, LONG_TIMEOUT));
310d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // connect to Wifi
31186e15557c52e2847d2adc8495a281dcf0239506eEric Rowe        assertTrue("failed to connect to " + mSsid, connectToWifi(mSsid, mPassword));
31212747ab3aafc92f3b86da7df2b1d992866cbaf52Guang Zhu        assertTrue("wifi not connected", waitForNetworkState(
31312747ab3aafc92f3b86da7df2b1d992866cbaf52Guang Zhu                ConnectivityManager.TYPE_WIFI, State.CONNECTED, WIFI_CONNECTION_TIMEOUT));
314d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertNotNull("not associated with any AP", mWifiManager.getConnectionInfo().getBSSID());
3152c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
316d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // disconnect from the current AP
317d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("failed to disconnect from AP", disconnectAP());
3182c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
319d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // below check disbabled since we have bug in what ConnectivityManager returns
3202c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // Verify the connectivity state for Wifi is DISCONNECTED
321d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu//        assertTrue(waitForNetworkState(ConnectivityManager.TYPE_WIFI,
322d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu//                State.DISCONNECTED, LONG_TIMEOUT));
3232c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
324d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        // disable WiFi
325d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("failed to disable wifi", disableWifi());
326d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("wifi state not disabled", waitForWifiState(
327d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu                WifiManager.WIFI_STATE_DISABLED, LONG_TIMEOUT));
3282c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    }
32958a3ddf5aafacbd84de7104f07a994bb06a9b374Eric Rowe
33058a3ddf5aafacbd84de7104f07a994bb06a9b374Eric Rowe    // help function to verify 3G connection
33158a3ddf5aafacbd84de7104f07a994bb06a9b374Eric Rowe    private void verifyCellularConnection() {
33258a3ddf5aafacbd84de7104f07a994bb06a9b374Eric Rowe        NetworkInfo extraNetInfo = mCm.getActiveNetworkInfo();
33358a3ddf5aafacbd84de7104f07a994bb06a9b374Eric Rowe        assertEquals("network type is not MOBILE", ConnectivityManager.TYPE_MOBILE,
33458a3ddf5aafacbd84de7104f07a994bb06a9b374Eric Rowe                extraNetInfo.getType());
33558a3ddf5aafacbd84de7104f07a994bb06a9b374Eric Rowe        assertTrue("not connected to cellular network", extraNetInfo.isConnected());
33658a3ddf5aafacbd84de7104f07a994bb06a9b374Eric Rowe    }
3377fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang}
338