ConnectivityManagerMobileTest.java revision 19306af73a8175e1327101132e26a35c7dfe5168
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.content.Context;
207fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.ConnectivityManager;
217fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.NetworkInfo;
227fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.NetworkInfo.State;
232c15966f8cf6160ad5dcbbde372508de89985829Xia Wangimport android.net.wifi.WifiManager;
244dfa295ad8b75a8c0976e7de078ebe4f654a6a89Brett Chabotimport android.os.PowerManager;
254dfa295ad8b75a8c0976e7de078ebe4f654a6a89Brett Chabotimport android.os.PowerManager.WakeLock;
264dfa295ad8b75a8c0976e7de078ebe4f654a6a89Brett Chabotimport android.provider.Settings;
274dfa295ad8b75a8c0976e7de078ebe4f654a6a89Brett Chabotimport android.test.suitebuilder.annotation.LargeTest;
284dfa295ad8b75a8c0976e7de078ebe4f654a6a89Brett Chabotimport android.util.Log;
294dfa295ad8b75a8c0976e7de078ebe4f654a6a89Brett Chabot
3019306af73a8175e1327101132e26a35c7dfe5168Xia Wangimport com.android.connectivitymanagertest.ConnectivityManagerTestBase;
317fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport com.android.connectivitymanagertest.ConnectivityManagerTestRunner;
327fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport com.android.connectivitymanagertest.NetworkState;
337fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
344dfa295ad8b75a8c0976e7de078ebe4f654a6a89Brett Chabotpublic class ConnectivityManagerMobileTest extends
3519306af73a8175e1327101132e26a35c7dfe5168Xia Wang        ConnectivityManagerTestBase {
3619306af73a8175e1327101132e26a35c7dfe5168Xia Wang    private static final String TAG = "ConnectivityManagerMobileTest";
372c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
38776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang    private String mTestAccessPoint;
392c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    private WakeLock wl;
40776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang    private boolean mWifiOnlyFlag;
417fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
427fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    @Override
437fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public void setUp() throws Exception {
447fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        super.setUp();
457fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        ConnectivityManagerTestRunner mRunner =
467fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                (ConnectivityManagerTestRunner)getInstrumentation();
47776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        mTestAccessPoint = mRunner.mTestSsid;
48776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        mWifiOnlyFlag = mRunner.mWifiOnlyFlag;
49776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang
502c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        PowerManager pm = (PowerManager)getInstrumentation().
512c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                getContext().getSystemService(Context.POWER_SERVICE);
522c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "CMWakeLock");
532c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        wl.acquire();
547fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        // Each test case will start with cellular connection
55c09cdce1b05075da808ae080b9905a14a3e1e627Christopher Tate        if (Settings.Global.getInt(getInstrumentation().getContext().getContentResolver(),
56c09cdce1b05075da808ae080b9905a14a3e1e627Christopher Tate                Settings.Global.AIRPLANE_MODE_ON) == 1) {
57a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("airplane is not disabled, disable it.");
5819306af73a8175e1327101132e26a35c7dfe5168Xia Wang            mCM.setAirplaneMode(false);
592dc2991f5833c9ca72e5e4d1f7bdc1c6c8caca91Xia Wang        }
60776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang
61776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (!mWifiOnlyFlag) {
6219306af73a8175e1327101132e26a35c7dfe5168Xia Wang            if (!waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
6319306af73a8175e1327101132e26a35c7dfe5168Xia Wang                    State.CONNECTED, LONG_TIMEOUT)) {
64b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                // Note: When the test fails in setUp(), tearDown is not called. In that case,
65b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                // the activity is destroyed which blocks the next test at "getActivity()".
66b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                // tearDown() is called here to avoid that situation.
67b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                tearDown();
68b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                fail("Device is not connected to Mobile, setUp failed");
69b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang            }
70ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang        }
717fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
727fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
737fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    @Override
747fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public void tearDown() throws Exception {
752c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        wl.release();
7619306af73a8175e1327101132e26a35c7dfe5168Xia Wang        removeConfiguredNetworksAndDisableWifi();
7719306af73a8175e1327101132e26a35c7dfe5168Xia Wang        mCM.setAirplaneMode(false);
787fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        super.tearDown();
797fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
807fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
817fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    // help function to verify 3G connection
827fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public void verifyCellularConnection() {
8319306af73a8175e1327101132e26a35c7dfe5168Xia Wang        NetworkInfo extraNetInfo = mCM.getActiveNetworkInfo();
847fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        assertEquals("network type is not MOBILE", ConnectivityManager.TYPE_MOBILE,
85ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                extraNetInfo.getType());
867fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        assertTrue("not connected to cellular network", extraNetInfo.isConnected());
877fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
887fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
89a4c2caac05009512213454d329579a79dde11e5fXia Wang    private void log(String message) {
9019306af73a8175e1327101132e26a35c7dfe5168Xia Wang        Log.v(TAG, message);
91a4c2caac05009512213454d329579a79dde11e5fXia Wang    }
92a4c2caac05009512213454d329579a79dde11e5fXia Wang
93a4c2caac05009512213454d329579a79dde11e5fXia Wang    private void sleep(long sleeptime) {
94a4c2caac05009512213454d329579a79dde11e5fXia Wang        try {
95a4c2caac05009512213454d329579a79dde11e5fXia Wang            Thread.sleep(sleeptime);
96a4c2caac05009512213454d329579a79dde11e5fXia Wang        } catch (InterruptedException e) {}
97a4c2caac05009512213454d329579a79dde11e5fXia Wang    }
98a4c2caac05009512213454d329579a79dde11e5fXia Wang
99be142fc6aae5484b518f6ab29d12f0c086f6fa74Xia Wang    // Test case 1: Test enabling Wifi without associating with any AP, no broadcast on network
100be142fc6aae5484b518f6ab29d12f0c086f6fa74Xia Wang    //              event should be expected.
1017fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    @LargeTest
1027fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public void test3GToWifiNotification() {
103776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (mWifiOnlyFlag) {
10419306af73a8175e1327101132e26a35c7dfe5168Xia Wang            Log.v(TAG, this.getName() + " is excluded for wifi-only test");
105776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang            return;
106776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        }
107be142fc6aae5484b518f6ab29d12f0c086f6fa74Xia Wang        // Enable Wi-Fi to avoid initial UNKNOWN state
10819306af73a8175e1327101132e26a35c7dfe5168Xia Wang        enableWifi();
10919306af73a8175e1327101132e26a35c7dfe5168Xia Wang        sleep(2 * SHORT_TIMEOUT);
110a4c2caac05009512213454d329579a79dde11e5fXia Wang
111be142fc6aae5484b518f6ab29d12f0c086f6fa74Xia Wang        // Wi-Fi is disabled
11219306af73a8175e1327101132e26a35c7dfe5168Xia Wang        disableWifi();
1132dc2991f5833c9ca72e5e4d1f7bdc1c6c8caca91Xia Wang
11419306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForNetworkState(ConnectivityManager.TYPE_WIFI,
11519306af73a8175e1327101132e26a35c7dfe5168Xia Wang                State.DISCONNECTED, LONG_TIMEOUT));
11619306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
11719306af73a8175e1327101132e26a35c7dfe5168Xia Wang                State.CONNECTED, LONG_TIMEOUT));
118be142fc6aae5484b518f6ab29d12f0c086f6fa74Xia Wang        // Wait for 10 seconds for broadcasts to be sent out
119a4c2caac05009512213454d329579a79dde11e5fXia Wang        sleep(10 * 1000);
120a4c2caac05009512213454d329579a79dde11e5fXia Wang
121be142fc6aae5484b518f6ab29d12f0c086f6fa74Xia Wang        // As Wifi stays in DISCONNETED, Mobile statys in CONNECTED,
122be142fc6aae5484b518f6ab29d12f0c086f6fa74Xia Wang        // the connectivity manager will not broadcast any network connectivity event for Wifi
12319306af73a8175e1327101132e26a35c7dfe5168Xia Wang        NetworkInfo networkInfo = mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
12419306af73a8175e1327101132e26a35c7dfe5168Xia Wang        setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE,
125b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                networkInfo.getState(), NetworkState.DO_NOTHING, State.CONNECTED);
12619306af73a8175e1327101132e26a35c7dfe5168Xia Wang        networkInfo = mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
12719306af73a8175e1327101132e26a35c7dfe5168Xia Wang        setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI, networkInfo.getState(),
1287fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                NetworkState.DO_NOTHING, State.DISCONNECTED);
129be142fc6aae5484b518f6ab29d12f0c086f6fa74Xia Wang        // Eanble Wifi without associating with any AP
13019306af73a8175e1327101132e26a35c7dfe5168Xia Wang        enableWifi();
13119306af73a8175e1327101132e26a35c7dfe5168Xia Wang        sleep(2 * SHORT_TIMEOUT);
1327fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
1337fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        // validate state and broadcast
13419306af73a8175e1327101132e26a35c7dfe5168Xia Wang        if (!validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
135a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("the state for WIFI is changed");
136a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("reason: " +
13719306af73a8175e1327101132e26a35c7dfe5168Xia Wang                    getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
138fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang            assertTrue("state validation fail", false);
1397fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        }
14019306af73a8175e1327101132e26a35c7dfe5168Xia Wang        if (!validateNetworkStates(ConnectivityManager.TYPE_MOBILE)) {
141a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("the state for MOBILE is changed");
142a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("reason: " +
14319306af73a8175e1327101132e26a35c7dfe5168Xia Wang                    getTransitionFailureReason(ConnectivityManager.TYPE_MOBILE));
1442c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            assertTrue("state validation fail", false);
1457fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        }
1467fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        // Verify that the device is still connected to MOBILE
1477fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        verifyCellularConnection();
1487fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
1497fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
1507fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    // Test case 2: test connection to a given AP
1517fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    @LargeTest
1527fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public void testConnectToWifi() {
153776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        assertNotNull("SSID is null", mTestAccessPoint);
154b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang        NetworkInfo networkInfo;
155776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (!mWifiOnlyFlag) {
156b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang            //Prepare for connectivity verification
15719306af73a8175e1327101132e26a35c7dfe5168Xia Wang            networkInfo = mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
15819306af73a8175e1327101132e26a35c7dfe5168Xia Wang            setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE,
159b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                    networkInfo.getState(), NetworkState.TO_DISCONNECTION, State.DISCONNECTED);
160b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang        }
16119306af73a8175e1327101132e26a35c7dfe5168Xia Wang        networkInfo = mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
16219306af73a8175e1327101132e26a35c7dfe5168Xia Wang        setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI, networkInfo.getState(),
1637fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                NetworkState.TO_CONNECTION, State.CONNECTED);
1647fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
1657fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        // Enable Wifi and connect to a test access point
166776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        assertTrue("failed to connect to " + mTestAccessPoint,
16719306af73a8175e1327101132e26a35c7dfe5168Xia Wang                connectToWifi(mTestAccessPoint));
1682c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
16919306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForWifiState(WifiManager.WIFI_STATE_ENABLED, LONG_TIMEOUT));
170a4c2caac05009512213454d329579a79dde11e5fXia Wang        log("wifi state is enabled");
17119306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
17219306af73a8175e1327101132e26a35c7dfe5168Xia Wang                WIFI_CONNECTION_TIMEOUT));
173776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (!mWifiOnlyFlag) {
17419306af73a8175e1327101132e26a35c7dfe5168Xia Wang            assertTrue(waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
17519306af73a8175e1327101132e26a35c7dfe5168Xia Wang                    State.DISCONNECTED, LONG_TIMEOUT));
176b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang        }
1772c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
1782c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // validate states
17919306af73a8175e1327101132e26a35c7dfe5168Xia Wang        if (!validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
180a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("Wifi state transition validation failed.");
181a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("reason: " +
18219306af73a8175e1327101132e26a35c7dfe5168Xia Wang                    getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
1832c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            assertTrue(false);
1842c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        }
185776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (!mWifiOnlyFlag) {
18619306af73a8175e1327101132e26a35c7dfe5168Xia Wang            if (!validateNetworkStates(ConnectivityManager.TYPE_MOBILE)) {
187a4c2caac05009512213454d329579a79dde11e5fXia Wang                log("Mobile state transition validation failed.");
188a4c2caac05009512213454d329579a79dde11e5fXia Wang                log("reason: " +
18919306af73a8175e1327101132e26a35c7dfe5168Xia Wang                        getTransitionFailureReason(ConnectivityManager.TYPE_MOBILE));
190b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                assertTrue(false);
191b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang            }
1922c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        }
1932c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    }
1942c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
1952c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    // Test case 3: connect to Wifi with known AP
1962c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    @LargeTest
1972c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public void testConnectToWifWithKnownAP() {
198776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        assertNotNull("SSID is null", mTestAccessPoint);
199776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        // Connect to mTestAccessPoint
200776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        assertTrue("failed to connect to " + mTestAccessPoint,
20119306af73a8175e1327101132e26a35c7dfe5168Xia Wang                connectToWifi(mTestAccessPoint));
20219306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForWifiState(WifiManager.WIFI_STATE_ENABLED, LONG_TIMEOUT));
20319306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
20419306af73a8175e1327101132e26a35c7dfe5168Xia Wang                WIFI_CONNECTION_TIMEOUT));
2052c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
20619306af73a8175e1327101132e26a35c7dfe5168Xia Wang        sleep(SHORT_TIMEOUT);
2072c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // Disable Wifi
208a4c2caac05009512213454d329579a79dde11e5fXia Wang        log("Disable Wifi");
20919306af73a8175e1327101132e26a35c7dfe5168Xia Wang        if (!disableWifi()) {
210a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("disable Wifi failed");
2112c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            return;
2122c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        }
2132c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
2142c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // Wait for the Wifi state to be DISABLED
21519306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForWifiState(WifiManager.WIFI_STATE_DISABLED, LONG_TIMEOUT));
21619306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForNetworkState(ConnectivityManager.TYPE_WIFI,
21719306af73a8175e1327101132e26a35c7dfe5168Xia Wang                State.DISCONNECTED, LONG_TIMEOUT));
218776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (!mWifiOnlyFlag) {
21919306af73a8175e1327101132e26a35c7dfe5168Xia Wang            assertTrue(waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
22019306af73a8175e1327101132e26a35c7dfe5168Xia Wang                    State.CONNECTED, LONG_TIMEOUT));
221b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang        }
2222c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
223b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang        NetworkInfo networkInfo;
224776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (!mWifiOnlyFlag) {
225b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang            //Prepare for connectivity state verification
22619306af73a8175e1327101132e26a35c7dfe5168Xia Wang            networkInfo = mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
22719306af73a8175e1327101132e26a35c7dfe5168Xia Wang            setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE,
228b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                                                  networkInfo.getState(), NetworkState.DO_NOTHING,
229b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                                                  State.DISCONNECTED);
230b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang        }
23119306af73a8175e1327101132e26a35c7dfe5168Xia Wang        networkInfo = mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
23219306af73a8175e1327101132e26a35c7dfe5168Xia Wang        setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI, networkInfo.getState(),
2332c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                NetworkState.TO_CONNECTION, State.CONNECTED);
2342c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
235a4c2caac05009512213454d329579a79dde11e5fXia Wang        // wait for 2 minutes before restart wifi
23619306af73a8175e1327101132e26a35c7dfe5168Xia Wang        sleep(WIFI_STOP_START_INTERVAL);
2372c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // Enable Wifi again
238a4c2caac05009512213454d329579a79dde11e5fXia Wang        log("Enable Wifi again");
23919306af73a8175e1327101132e26a35c7dfe5168Xia Wang        enableWifi();
2402c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
2412c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // Wait for Wifi to be connected and mobile to be disconnected
24219306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
24319306af73a8175e1327101132e26a35c7dfe5168Xia Wang                WIFI_CONNECTION_TIMEOUT));
244776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (!mWifiOnlyFlag) {
24519306af73a8175e1327101132e26a35c7dfe5168Xia Wang            assertTrue(waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
24619306af73a8175e1327101132e26a35c7dfe5168Xia Wang                    State.DISCONNECTED, LONG_TIMEOUT));
247b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang        }
2482c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
2492c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // validate wifi states
25019306af73a8175e1327101132e26a35c7dfe5168Xia Wang        if (!validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
251a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("Wifi state transition validation failed.");
252a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("reason: " +
25319306af73a8175e1327101132e26a35c7dfe5168Xia Wang                    getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
2542c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            assertTrue(false);
2552c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        }
2562c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    }
2572c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
2582c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    // Test case 4:  test disconnect Wifi
2592c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    @LargeTest
2602c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public void testDisconnectWifi() {
261776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        assertNotNull("SSID is null", mTestAccessPoint);
2622c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
2632c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // connect to Wifi
264776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        assertTrue("failed to connect to " + mTestAccessPoint,
26519306af73a8175e1327101132e26a35c7dfe5168Xia Wang                connectToWifi(mTestAccessPoint));
2662c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
26719306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
26819306af73a8175e1327101132e26a35c7dfe5168Xia Wang                WIFI_CONNECTION_TIMEOUT));
2692c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
2702c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // Wait for a few seconds to avoid the state that both Mobile and Wifi is connected
27119306af73a8175e1327101132e26a35c7dfe5168Xia Wang        sleep(SHORT_TIMEOUT);
2727fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
273b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang        NetworkInfo networkInfo;
274776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (!mWifiOnlyFlag) {
27519306af73a8175e1327101132e26a35c7dfe5168Xia Wang            networkInfo = mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
27619306af73a8175e1327101132e26a35c7dfe5168Xia Wang            setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE,
277b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                                                  networkInfo.getState(),
278b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                                                  NetworkState.TO_CONNECTION,
279b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                                                  State.CONNECTED);
280b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang        }
28119306af73a8175e1327101132e26a35c7dfe5168Xia Wang        networkInfo = mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
28219306af73a8175e1327101132e26a35c7dfe5168Xia Wang        setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI, networkInfo.getState(),
2832c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                NetworkState.TO_DISCONNECTION, State.DISCONNECTED);
2842c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
2852c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // clear Wifi
28619306af73a8175e1327101132e26a35c7dfe5168Xia Wang        removeConfiguredNetworksAndDisableWifi();
2872c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
28819306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForNetworkState(ConnectivityManager.TYPE_WIFI,
28919306af73a8175e1327101132e26a35c7dfe5168Xia Wang                State.DISCONNECTED, LONG_TIMEOUT));
290776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (!mWifiOnlyFlag) {
29119306af73a8175e1327101132e26a35c7dfe5168Xia Wang            assertTrue(waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
29219306af73a8175e1327101132e26a35c7dfe5168Xia Wang                    State.CONNECTED, LONG_TIMEOUT));
293b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang        }
2942c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
2957fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        // validate states
29619306af73a8175e1327101132e26a35c7dfe5168Xia Wang        if (!validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
297a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("Wifi state transition validation failed.");
298a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("reason: " +
29919306af73a8175e1327101132e26a35c7dfe5168Xia Wang                    getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
3007fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            assertTrue(false);
3017fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        }
302776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (!mWifiOnlyFlag) {
30319306af73a8175e1327101132e26a35c7dfe5168Xia Wang            if (!validateNetworkStates(ConnectivityManager.TYPE_MOBILE)) {
304a4c2caac05009512213454d329579a79dde11e5fXia Wang                log("Mobile state transition validation failed.");
305a4c2caac05009512213454d329579a79dde11e5fXia Wang                log("reason: " +
30619306af73a8175e1327101132e26a35c7dfe5168Xia Wang                        getTransitionFailureReason(ConnectivityManager.TYPE_MOBILE));
307b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                assertTrue(false);
308b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang            }
3097fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        }
3107fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
3112c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
3122c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    // Test case 5: test connectivity from 3G to airplane mode, then to 3G again
3132c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    @LargeTest
3142c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public void testDataConnectionWith3GToAmTo3G() {
315776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (mWifiOnlyFlag) {
31619306af73a8175e1327101132e26a35c7dfe5168Xia Wang            Log.v(TAG, this.getName() + " is excluded for wifi-only test");
317776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang            return;
318776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        }
3192c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        //Prepare for state verification
32019306af73a8175e1327101132e26a35c7dfe5168Xia Wang        NetworkInfo networkInfo = mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
32119306af73a8175e1327101132e26a35c7dfe5168Xia Wang        setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE,
3222c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                                              networkInfo.getState(),
3232c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                                              NetworkState.TO_DISCONNECTION,
3242c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                                              State.DISCONNECTED);
32519306af73a8175e1327101132e26a35c7dfe5168Xia Wang        networkInfo = mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
3262c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        assertEquals(State.DISCONNECTED, networkInfo.getState());
3272c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
3282c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // Enable airplane mode
329a4c2caac05009512213454d329579a79dde11e5fXia Wang        log("Enable airplane mode");
33019306af73a8175e1327101132e26a35c7dfe5168Xia Wang        mCM.setAirplaneMode(true);
33119306af73a8175e1327101132e26a35c7dfe5168Xia Wang        sleep(SHORT_TIMEOUT);
3322c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
33319306af73a8175e1327101132e26a35c7dfe5168Xia Wang        networkInfo = mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
3348efaeb03ea1ecd633f61bdb03bb90393887f08dfXia Wang        assertEquals(State.DISCONNECTED, networkInfo.getState());
335776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        // wait until mobile is turn off
33619306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
33719306af73a8175e1327101132e26a35c7dfe5168Xia Wang                State.DISCONNECTED, LONG_TIMEOUT));
33819306af73a8175e1327101132e26a35c7dfe5168Xia Wang        if (!validateNetworkStates(ConnectivityManager.TYPE_MOBILE)) {
339a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("Mobile state transition validation failed.");
340a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("reason: " +
34119306af73a8175e1327101132e26a35c7dfe5168Xia Wang                    getTransitionFailureReason(ConnectivityManager.TYPE_MOBILE));
3422c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            assertTrue(false);
3432c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        }
3442c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
3452c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // reset state recorder
34619306af73a8175e1327101132e26a35c7dfe5168Xia Wang        networkInfo = mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
34719306af73a8175e1327101132e26a35c7dfe5168Xia Wang        setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE,
3482c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                                              networkInfo.getState(),
3492c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                                              NetworkState.TO_CONNECTION,
3502c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                                              State.CONNECTED);
35119306af73a8175e1327101132e26a35c7dfe5168Xia Wang        networkInfo = mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
35219306af73a8175e1327101132e26a35c7dfe5168Xia Wang        setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI, networkInfo.getState(),
3532c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                NetworkState.DO_NOTHING, State.DISCONNECTED);
3542c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
3552c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // disable airplane mode
35619306af73a8175e1327101132e26a35c7dfe5168Xia Wang        mCM.setAirplaneMode(false);
3572c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
35819306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
35919306af73a8175e1327101132e26a35c7dfe5168Xia Wang                State.CONNECTED, LONG_TIMEOUT));
3602c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
3612c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // Validate the state transition
36219306af73a8175e1327101132e26a35c7dfe5168Xia Wang        if (!validateNetworkStates(ConnectivityManager.TYPE_MOBILE)) {
363a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("Mobile state transition validation failed.");
364a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("reason: " +
36519306af73a8175e1327101132e26a35c7dfe5168Xia Wang                    getTransitionFailureReason(ConnectivityManager.TYPE_MOBILE));
3662c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            assertTrue(false);
3672c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        }
36819306af73a8175e1327101132e26a35c7dfe5168Xia Wang        if (!validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
369a4c2caac05009512213454d329579a79dde11e5fXia Wang          log("Wifi state transition validation failed.");
370a4c2caac05009512213454d329579a79dde11e5fXia Wang          log("reason: " +
37119306af73a8175e1327101132e26a35c7dfe5168Xia Wang                  getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
3722c15966f8cf6160ad5dcbbde372508de89985829Xia Wang          assertTrue(false);
3732c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        }
3742c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    }
3752c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
3762c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    // Test case 6: test connectivity with airplane mode Wifi connected
3772c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    @LargeTest
3782c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public void testDataConnectionOverAMWithWifi() {
379776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (mWifiOnlyFlag) {
38019306af73a8175e1327101132e26a35c7dfe5168Xia Wang            Log.v(TAG, this.getName() + " is excluded for wifi-only test");
381776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang            return;
382776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        }
383776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        assertNotNull("SSID is null", mTestAccessPoint);
3842c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // Eanble airplane mode
385a4c2caac05009512213454d329579a79dde11e5fXia Wang        log("Enable airplane mode");
38619306af73a8175e1327101132e26a35c7dfe5168Xia Wang        mCM.setAirplaneMode(true);
3872c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
388b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang        NetworkInfo networkInfo;
389776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (!mWifiOnlyFlag) {
39019306af73a8175e1327101132e26a35c7dfe5168Xia Wang            assertTrue(waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
39119306af73a8175e1327101132e26a35c7dfe5168Xia Wang                    State.DISCONNECTED, LONG_TIMEOUT));
39219306af73a8175e1327101132e26a35c7dfe5168Xia Wang            networkInfo = mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
39319306af73a8175e1327101132e26a35c7dfe5168Xia Wang            setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE,
394b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                                                  networkInfo.getState(),
395b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                                                  NetworkState.DO_NOTHING,
396b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                                                  State.DISCONNECTED);
397b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang        }
39819306af73a8175e1327101132e26a35c7dfe5168Xia Wang        networkInfo = mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
39919306af73a8175e1327101132e26a35c7dfe5168Xia Wang        setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI, networkInfo.getState(),
4002c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                                              NetworkState.TO_CONNECTION, State.CONNECTED);
4012c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
4022c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // Connect to Wifi
403776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        assertTrue("failed to connect to " + mTestAccessPoint,
40419306af73a8175e1327101132e26a35c7dfe5168Xia Wang                connectToWifi(mTestAccessPoint));
40519306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
40619306af73a8175e1327101132e26a35c7dfe5168Xia Wang                WIFI_CONNECTION_TIMEOUT));
4072c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
4082c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // validate state and broadcast
40919306af73a8175e1327101132e26a35c7dfe5168Xia Wang        if (!validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
410a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("state validate for Wifi failed");
411a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("reason: " +
41219306af73a8175e1327101132e26a35c7dfe5168Xia Wang                    getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
4132c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            assertTrue("State validation failed", false);
4142c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        }
415776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (!mWifiOnlyFlag) {
41619306af73a8175e1327101132e26a35c7dfe5168Xia Wang            if (!validateNetworkStates(ConnectivityManager.TYPE_MOBILE)) {
417a4c2caac05009512213454d329579a79dde11e5fXia Wang                log("state validation for Mobile failed");
418a4c2caac05009512213454d329579a79dde11e5fXia Wang                log("reason: " +
41919306af73a8175e1327101132e26a35c7dfe5168Xia Wang                        getTransitionFailureReason(ConnectivityManager.TYPE_MOBILE));
420b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang                assertTrue("state validation failed", false);
421b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang            }
4222c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        }
42319306af73a8175e1327101132e26a35c7dfe5168Xia Wang        mCM.setAirplaneMode(false);
4242c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    }
4252c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
4262c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    // Test case 7: test connectivity while transit from Wifi->AM->Wifi
4272c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    @LargeTest
4282c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public void testDataConnectionWithWifiToAMToWifi () {
429776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (mWifiOnlyFlag) {
43019306af73a8175e1327101132e26a35c7dfe5168Xia Wang            Log.v(TAG, this.getName() + " is excluded for wifi-only test");
431776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang            return;
432776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        }
433776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        // Connect to mTestAccessPoint
434776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        assertNotNull("SSID is null", mTestAccessPoint);
4352c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // Connect to Wifi
436776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        assertTrue("failed to connect to " + mTestAccessPoint,
43719306af73a8175e1327101132e26a35c7dfe5168Xia Wang                connectToWifi(mTestAccessPoint));
4382c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
43919306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
44019306af73a8175e1327101132e26a35c7dfe5168Xia Wang                WIFI_CONNECTION_TIMEOUT));
4412c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
4422c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        try {
44319306af73a8175e1327101132e26a35c7dfe5168Xia Wang            Thread.sleep(SHORT_TIMEOUT);
4442c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        } catch (Exception e) {
445a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("exception: " + e.toString());
4462c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        }
4472c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
4482c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // Enable airplane mode without clearing Wifi
44919306af73a8175e1327101132e26a35c7dfe5168Xia Wang        mCM.setAirplaneMode(true);
4502c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
45119306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForNetworkState(ConnectivityManager.TYPE_WIFI,
45219306af73a8175e1327101132e26a35c7dfe5168Xia Wang                State.DISCONNECTED, LONG_TIMEOUT));
4532c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
4542c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        try {
45519306af73a8175e1327101132e26a35c7dfe5168Xia Wang            Thread.sleep(SHORT_TIMEOUT);
4562c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        } catch (Exception e) {
457a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("exception: " + e.toString());
4582c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        }
4592c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
4602c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // Prepare for state validation
46119306af73a8175e1327101132e26a35c7dfe5168Xia Wang        NetworkInfo networkInfo = mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
4622c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        assertEquals(State.DISCONNECTED, networkInfo.getState());
46319306af73a8175e1327101132e26a35c7dfe5168Xia Wang        setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI,
4642c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                networkInfo.getState(), NetworkState.TO_CONNECTION, State.CONNECTED);
4652c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
4662c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // Disable airplane mode
46719306af73a8175e1327101132e26a35c7dfe5168Xia Wang        mCM.setAirplaneMode(false);
4682c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
46919306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
47019306af73a8175e1327101132e26a35c7dfe5168Xia Wang                WIFI_CONNECTION_TIMEOUT));
471776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (!mWifiOnlyFlag) {
47219306af73a8175e1327101132e26a35c7dfe5168Xia Wang            assertTrue(waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
47319306af73a8175e1327101132e26a35c7dfe5168Xia Wang                    State.DISCONNECTED, LONG_TIMEOUT));
474b97435c94f4d35a70d63e5dcba5415b0110cf2c9Xia Wang        }
4752c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
4762c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // validate the state transition
47719306af73a8175e1327101132e26a35c7dfe5168Xia Wang        if (!validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
478a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("Wifi state transition validation failed.");
479a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("reason: " +
48019306af73a8175e1327101132e26a35c7dfe5168Xia Wang                    getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
4812c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            assertTrue(false);
4822c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        }
4832c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    }
4842c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
4852c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    // Test case 8: test wifi state change while connecting/disconnecting to/from an AP
4862c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    @LargeTest
4872c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public void testWifiStateChange () {
488776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        assertNotNull("SSID is null", mTestAccessPoint);
489776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        //Connect to mTestAccessPoint
490776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        assertTrue("failed to connect to " + mTestAccessPoint,
49119306af73a8175e1327101132e26a35c7dfe5168Xia Wang                connectToWifi(mTestAccessPoint));
49219306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForWifiState(WifiManager.WIFI_STATE_ENABLED, LONG_TIMEOUT));
49319306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
49419306af73a8175e1327101132e26a35c7dfe5168Xia Wang                WIFI_CONNECTION_TIMEOUT));
4952c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        assertNotNull("Not associated with any AP",
49619306af73a8175e1327101132e26a35c7dfe5168Xia Wang                      mWifiManager.getConnectionInfo().getBSSID());
4972c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
4982c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        try {
49919306af73a8175e1327101132e26a35c7dfe5168Xia Wang            Thread.sleep(SHORT_TIMEOUT);
5002c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        } catch (Exception e) {
501a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("exception: " + e.toString());
5022c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        }
5032c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
5042c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // Disconnect from the current AP
505a4c2caac05009512213454d329579a79dde11e5fXia Wang        log("disconnect from the AP");
50619306af73a8175e1327101132e26a35c7dfe5168Xia Wang        if (!disconnectAP()) {
507776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang            log("failed to disconnect from " + mTestAccessPoint);
5082c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        }
5092c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
5102c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        // Verify the connectivity state for Wifi is DISCONNECTED
51119306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForNetworkState(ConnectivityManager.TYPE_WIFI,
51219306af73a8175e1327101132e26a35c7dfe5168Xia Wang                State.DISCONNECTED, LONG_TIMEOUT));
5132c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
51419306af73a8175e1327101132e26a35c7dfe5168Xia Wang        if (!disableWifi()) {
515a4c2caac05009512213454d329579a79dde11e5fXia Wang            log("disable Wifi failed");
5162c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            return;
5172c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        }
51819306af73a8175e1327101132e26a35c7dfe5168Xia Wang        assertTrue(waitForWifiState(WifiManager.WIFI_STATE_DISABLED, LONG_TIMEOUT));
5192c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    }
5207fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang}
521