Home | History | Annotate | Download | only in functional
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.connectivitymanagertest.functional;
     18 
     19 import android.content.Context;
     20 import android.net.ConnectivityManager;
     21 import android.net.NetworkInfo;
     22 import android.net.NetworkInfo.State;
     23 import android.net.wifi.WifiManager;
     24 import android.os.PowerManager;
     25 import android.os.PowerManager.WakeLock;
     26 import android.provider.Settings;
     27 import android.test.ActivityInstrumentationTestCase2;
     28 import android.test.suitebuilder.annotation.LargeTest;
     29 import android.util.Log;
     30 
     31 import com.android.connectivitymanagertest.ConnectivityManagerTestActivity;
     32 import com.android.connectivitymanagertest.ConnectivityManagerTestRunner;
     33 import com.android.connectivitymanagertest.NetworkState;
     34 
     35 public class ConnectivityManagerMobileTest extends
     36         ActivityInstrumentationTestCase2<ConnectivityManagerTestActivity> {
     37     private static final String LOG_TAG = "ConnectivityManagerMobileTest";
     38 
     39     private String mTestAccessPoint;
     40     private ConnectivityManagerTestActivity cmActivity;
     41     private WakeLock wl;
     42     private boolean mWifiOnlyFlag;
     43 
     44     public ConnectivityManagerMobileTest() {
     45         super(ConnectivityManagerTestActivity.class);
     46     }
     47 
     48     @Override
     49     public void setUp() throws Exception {
     50         super.setUp();
     51         cmActivity = getActivity();
     52         ConnectivityManagerTestRunner mRunner =
     53                 (ConnectivityManagerTestRunner)getInstrumentation();
     54         mTestAccessPoint = mRunner.mTestSsid;
     55         mWifiOnlyFlag = mRunner.mWifiOnlyFlag;
     56 
     57         PowerManager pm = (PowerManager)getInstrumentation().
     58                 getContext().getSystemService(Context.POWER_SERVICE);
     59         wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "CMWakeLock");
     60         wl.acquire();
     61         // Each test case will start with cellular connection
     62         if (Settings.System.getInt(getInstrumentation().getContext().getContentResolver(),
     63                 Settings.System.AIRPLANE_MODE_ON) == 1) {
     64             log("airplane is not disabled, disable it.");
     65             cmActivity.setAirplaneMode(getInstrumentation().getContext(), false);
     66         }
     67 
     68         if (!mWifiOnlyFlag) {
     69             if (!cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE, State.CONNECTED,
     70                     ConnectivityManagerTestActivity.LONG_TIMEOUT)) {
     71                 // Note: When the test fails in setUp(), tearDown is not called. In that case,
     72                 // the activity is destroyed which blocks the next test at "getActivity()".
     73                 // tearDown() is called here to avoid that situation.
     74                 tearDown();
     75                 fail("Device is not connected to Mobile, setUp failed");
     76             }
     77         }
     78     }
     79 
     80     @Override
     81     public void tearDown() throws Exception {
     82         cmActivity.finish();
     83         log("tear down ConnectivityManagerTestActivity");
     84         wl.release();
     85         cmActivity.removeConfiguredNetworksAndDisableWifi();
     86         // if airplane mode is set, disable it.
     87         if (Settings.System.getInt(getInstrumentation().getContext().getContentResolver(),
     88                 Settings.System.AIRPLANE_MODE_ON) == 1) {
     89             log("disable airplane mode if it is enabled");
     90             cmActivity.setAirplaneMode(getInstrumentation().getContext(), false);
     91         }
     92         super.tearDown();
     93     }
     94 
     95     // help function to verify 3G connection
     96     public void verifyCellularConnection() {
     97         NetworkInfo extraNetInfo = cmActivity.mCM.getActiveNetworkInfo();
     98         assertEquals("network type is not MOBILE", ConnectivityManager.TYPE_MOBILE,
     99                 extraNetInfo.getType());
    100         assertTrue("not connected to cellular network", extraNetInfo.isConnected());
    101     }
    102 
    103     private void log(String message) {
    104         Log.v(LOG_TAG, message);
    105     }
    106 
    107     private void sleep(long sleeptime) {
    108         try {
    109             Thread.sleep(sleeptime);
    110         } catch (InterruptedException e) {}
    111     }
    112 
    113     // Test case 1: Test enabling Wifi without associating with any AP, no broadcast on network
    114     //              event should be expected.
    115     @LargeTest
    116     public void test3GToWifiNotification() {
    117         if (mWifiOnlyFlag) {
    118             Log.v(LOG_TAG, this.getName() + " is excluded for wifi-only test");
    119             return;
    120         }
    121         // Enable Wi-Fi to avoid initial UNKNOWN state
    122         cmActivity.enableWifi();
    123         sleep(2 * ConnectivityManagerTestActivity.SHORT_TIMEOUT);
    124 
    125         // Wi-Fi is disabled
    126         cmActivity.disableWifi();
    127 
    128         assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI,
    129                 State.DISCONNECTED, ConnectivityManagerTestActivity.LONG_TIMEOUT));
    130         assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
    131                 State.CONNECTED, ConnectivityManagerTestActivity.LONG_TIMEOUT));
    132         // Wait for 10 seconds for broadcasts to be sent out
    133         sleep(10 * 1000);
    134 
    135         // As Wifi stays in DISCONNETED, Mobile statys in CONNECTED,
    136         // the connectivity manager will not broadcast any network connectivity event for Wifi
    137         NetworkInfo networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    138         cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE,
    139                 networkInfo.getState(), NetworkState.DO_NOTHING, State.CONNECTED);
    140         networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    141         cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI, networkInfo.getState(),
    142                 NetworkState.DO_NOTHING, State.DISCONNECTED);
    143         // Eanble Wifi without associating with any AP
    144         cmActivity.enableWifi();
    145         sleep(2 * ConnectivityManagerTestActivity.SHORT_TIMEOUT);
    146 
    147         // validate state and broadcast
    148         if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
    149             log("the state for WIFI is changed");
    150             log("reason: " +
    151                     cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
    152             assertTrue("state validation fail", false);
    153         }
    154         if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_MOBILE)) {
    155             log("the state for MOBILE is changed");
    156             log("reason: " +
    157                     cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_MOBILE));
    158             assertTrue("state validation fail", false);
    159         }
    160         // Verify that the device is still connected to MOBILE
    161         verifyCellularConnection();
    162     }
    163 
    164     // Test case 2: test connection to a given AP
    165     @LargeTest
    166     public void testConnectToWifi() {
    167         assertNotNull("SSID is null", mTestAccessPoint);
    168         NetworkInfo networkInfo;
    169         if (!mWifiOnlyFlag) {
    170             //Prepare for connectivity verification
    171             networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    172             cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE,
    173                     networkInfo.getState(), NetworkState.TO_DISCONNECTION, State.DISCONNECTED);
    174         }
    175         networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    176         cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI, networkInfo.getState(),
    177                 NetworkState.TO_CONNECTION, State.CONNECTED);
    178 
    179         // Enable Wifi and connect to a test access point
    180         assertTrue("failed to connect to " + mTestAccessPoint,
    181                 cmActivity.connectToWifi(mTestAccessPoint));
    182 
    183         assertTrue(cmActivity.waitForWifiState(WifiManager.WIFI_STATE_ENABLED,
    184                 ConnectivityManagerTestActivity.LONG_TIMEOUT));
    185         log("wifi state is enabled");
    186         assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
    187                 ConnectivityManagerTestActivity.LONG_TIMEOUT));
    188         if (!mWifiOnlyFlag) {
    189             assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
    190                     State.DISCONNECTED, ConnectivityManagerTestActivity.LONG_TIMEOUT));
    191         }
    192 
    193         // validate states
    194         if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
    195             log("Wifi state transition validation failed.");
    196             log("reason: " +
    197                     cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
    198             assertTrue(false);
    199         }
    200         if (!mWifiOnlyFlag) {
    201             if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_MOBILE)) {
    202                 log("Mobile state transition validation failed.");
    203                 log("reason: " +
    204                         cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_MOBILE));
    205                 assertTrue(false);
    206             }
    207         }
    208     }
    209 
    210     // Test case 3: connect to Wifi with known AP
    211     @LargeTest
    212     public void testConnectToWifWithKnownAP() {
    213         assertNotNull("SSID is null", mTestAccessPoint);
    214         // Connect to mTestAccessPoint
    215         assertTrue("failed to connect to " + mTestAccessPoint,
    216                 cmActivity.connectToWifi(mTestAccessPoint));
    217         assertTrue(cmActivity.waitForWifiState(WifiManager.WIFI_STATE_ENABLED,
    218                 ConnectivityManagerTestActivity.LONG_TIMEOUT));
    219         assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
    220                 ConnectivityManagerTestActivity.LONG_TIMEOUT));
    221 
    222         sleep(ConnectivityManagerTestActivity.SHORT_TIMEOUT);
    223         // Disable Wifi
    224         log("Disable Wifi");
    225         if (!cmActivity.disableWifi()) {
    226             log("disable Wifi failed");
    227             return;
    228         }
    229 
    230         // Wait for the Wifi state to be DISABLED
    231         assertTrue(cmActivity.waitForWifiState(WifiManager.WIFI_STATE_DISABLED,
    232                 ConnectivityManagerTestActivity.LONG_TIMEOUT));
    233         assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI,
    234                 State.DISCONNECTED, ConnectivityManagerTestActivity.LONG_TIMEOUT));
    235         if (!mWifiOnlyFlag) {
    236             assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
    237                     State.CONNECTED, ConnectivityManagerTestActivity.LONG_TIMEOUT));
    238         }
    239 
    240         NetworkInfo networkInfo;
    241         if (!mWifiOnlyFlag) {
    242             //Prepare for connectivity state verification
    243             networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    244             cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE,
    245                                                   networkInfo.getState(), NetworkState.DO_NOTHING,
    246                                                   State.DISCONNECTED);
    247         }
    248         networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    249         cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI, networkInfo.getState(),
    250                 NetworkState.TO_CONNECTION, State.CONNECTED);
    251 
    252         // wait for 2 minutes before restart wifi
    253         sleep(ConnectivityManagerTestActivity.WIFI_STOP_START_INTERVAL);
    254         // Enable Wifi again
    255         log("Enable Wifi again");
    256         cmActivity.enableWifi();
    257 
    258         // Wait for Wifi to be connected and mobile to be disconnected
    259         assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
    260                 ConnectivityManagerTestActivity.LONG_TIMEOUT));
    261         if (!mWifiOnlyFlag) {
    262             assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
    263                     State.DISCONNECTED, ConnectivityManagerTestActivity.LONG_TIMEOUT));
    264         }
    265 
    266         // validate wifi states
    267         if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
    268             log("Wifi state transition validation failed.");
    269             log("reason: " +
    270                     cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
    271             assertTrue(false);
    272         }
    273     }
    274 
    275     // Test case 4:  test disconnect Wifi
    276     @LargeTest
    277     public void testDisconnectWifi() {
    278         assertNotNull("SSID is null", mTestAccessPoint);
    279 
    280         // connect to Wifi
    281         assertTrue("failed to connect to " + mTestAccessPoint,
    282                    cmActivity.connectToWifi(mTestAccessPoint));
    283 
    284         assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
    285             ConnectivityManagerTestActivity.LONG_TIMEOUT));
    286 
    287         // Wait for a few seconds to avoid the state that both Mobile and Wifi is connected
    288         sleep(ConnectivityManagerTestActivity.SHORT_TIMEOUT);
    289 
    290         NetworkInfo networkInfo;
    291         if (!mWifiOnlyFlag) {
    292             networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    293             cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE,
    294                                                   networkInfo.getState(),
    295                                                   NetworkState.TO_CONNECTION,
    296                                                   State.CONNECTED);
    297         }
    298         networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    299         cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI, networkInfo.getState(),
    300                 NetworkState.TO_DISCONNECTION, State.DISCONNECTED);
    301 
    302         // clear Wifi
    303         cmActivity.removeConfiguredNetworksAndDisableWifi();
    304 
    305         assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.DISCONNECTED,
    306                 ConnectivityManagerTestActivity.LONG_TIMEOUT));
    307         if (!mWifiOnlyFlag) {
    308             assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
    309                     State.CONNECTED, ConnectivityManagerTestActivity.LONG_TIMEOUT));
    310         }
    311 
    312         // validate states
    313         if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
    314             log("Wifi state transition validation failed.");
    315             log("reason: " +
    316                     cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
    317             assertTrue(false);
    318         }
    319         if (!mWifiOnlyFlag) {
    320             if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_MOBILE)) {
    321                 log("Mobile state transition validation failed.");
    322                 log("reason: " +
    323                         cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_MOBILE));
    324                 assertTrue(false);
    325             }
    326         }
    327     }
    328 
    329     // Test case 5: test connectivity from 3G to airplane mode, then to 3G again
    330     @LargeTest
    331     public void testDataConnectionWith3GToAmTo3G() {
    332         if (mWifiOnlyFlag) {
    333             Log.v(LOG_TAG, this.getName() + " is excluded for wifi-only test");
    334             return;
    335         }
    336         //Prepare for state verification
    337         NetworkInfo networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    338         cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE,
    339                                               networkInfo.getState(),
    340                                               NetworkState.TO_DISCONNECTION,
    341                                               State.DISCONNECTED);
    342         networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    343         assertEquals(State.DISCONNECTED, networkInfo.getState());
    344 
    345         // Enable airplane mode
    346         log("Enable airplane mode");
    347         cmActivity.setAirplaneMode(getInstrumentation().getContext(), true);
    348         sleep(ConnectivityManagerTestActivity.SHORT_TIMEOUT);
    349 
    350         networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    351         assertEquals(State.DISCONNECTED, networkInfo.getState());
    352         // wait until mobile is turn off
    353         assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
    354                 State.DISCONNECTED, ConnectivityManagerTestActivity.LONG_TIMEOUT));
    355         if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_MOBILE)) {
    356             log("Mobile state transition validation failed.");
    357             log("reason: " +
    358                     cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_MOBILE));
    359             assertTrue(false);
    360         }
    361 
    362         // reset state recorder
    363         networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    364         cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE,
    365                                               networkInfo.getState(),
    366                                               NetworkState.TO_CONNECTION,
    367                                               State.CONNECTED);
    368         networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    369         cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI, networkInfo.getState(),
    370                 NetworkState.DO_NOTHING, State.DISCONNECTED);
    371 
    372         // disable airplane mode
    373         cmActivity.setAirplaneMode(getInstrumentation().getContext(), false);
    374 
    375         assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE, State.CONNECTED,
    376                 ConnectivityManagerTestActivity.LONG_TIMEOUT));
    377 
    378         // Validate the state transition
    379         if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_MOBILE)) {
    380             log("Mobile state transition validation failed.");
    381             log("reason: " +
    382                     cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_MOBILE));
    383             assertTrue(false);
    384         }
    385         if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
    386           log("Wifi state transition validation failed.");
    387           log("reason: " +
    388                   cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
    389           assertTrue(false);
    390         }
    391     }
    392 
    393     // Test case 6: test connectivity with airplane mode Wifi connected
    394     @LargeTest
    395     public void testDataConnectionOverAMWithWifi() {
    396         if (mWifiOnlyFlag) {
    397             Log.v(LOG_TAG, this.getName() + " is excluded for wifi-only test");
    398             return;
    399         }
    400         assertNotNull("SSID is null", mTestAccessPoint);
    401         // Eanble airplane mode
    402         log("Enable airplane mode");
    403         cmActivity.setAirplaneMode(getInstrumentation().getContext(), true);
    404 
    405         NetworkInfo networkInfo;
    406         if (!mWifiOnlyFlag) {
    407             assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
    408                     State.DISCONNECTED, ConnectivityManagerTestActivity.LONG_TIMEOUT));
    409             networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    410             cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE,
    411                                                   networkInfo.getState(),
    412                                                   NetworkState.DO_NOTHING,
    413                                                   State.DISCONNECTED);
    414         }
    415         networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    416         cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI, networkInfo.getState(),
    417                                               NetworkState.TO_CONNECTION, State.CONNECTED);
    418 
    419         // Connect to Wifi
    420         assertTrue("failed to connect to " + mTestAccessPoint,
    421                    cmActivity.connectToWifi(mTestAccessPoint));
    422         assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
    423                             ConnectivityManagerTestActivity.LONG_TIMEOUT));
    424 
    425         // validate state and broadcast
    426         if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
    427             log("state validate for Wifi failed");
    428             log("reason: " +
    429                     cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
    430             assertTrue("State validation failed", false);
    431         }
    432         if (!mWifiOnlyFlag) {
    433             if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_MOBILE)) {
    434                 log("state validation for Mobile failed");
    435                 log("reason: " +
    436                         cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_MOBILE));
    437                 assertTrue("state validation failed", false);
    438             }
    439         }
    440         cmActivity.setAirplaneMode(getInstrumentation().getContext(), false);
    441     }
    442 
    443     // Test case 7: test connectivity while transit from Wifi->AM->Wifi
    444     @LargeTest
    445     public void testDataConnectionWithWifiToAMToWifi () {
    446         if (mWifiOnlyFlag) {
    447             Log.v(LOG_TAG, this.getName() + " is excluded for wifi-only test");
    448             return;
    449         }
    450         // Connect to mTestAccessPoint
    451         assertNotNull("SSID is null", mTestAccessPoint);
    452         // Connect to Wifi
    453         assertTrue("failed to connect to " + mTestAccessPoint,
    454                 cmActivity.connectToWifi(mTestAccessPoint));
    455 
    456         assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
    457                 ConnectivityManagerTestActivity.LONG_TIMEOUT));
    458 
    459         try {
    460             Thread.sleep(ConnectivityManagerTestActivity.SHORT_TIMEOUT);
    461         } catch (Exception e) {
    462             log("exception: " + e.toString());
    463         }
    464 
    465         // Enable airplane mode without clearing Wifi
    466         cmActivity.setAirplaneMode(getInstrumentation().getContext(), true);
    467 
    468         assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.DISCONNECTED,
    469                 ConnectivityManagerTestActivity.LONG_TIMEOUT));
    470 
    471         try {
    472             Thread.sleep(ConnectivityManagerTestActivity.SHORT_TIMEOUT);
    473         } catch (Exception e) {
    474             log("exception: " + e.toString());
    475         }
    476 
    477         // Prepare for state validation
    478         NetworkInfo networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    479         assertEquals(State.DISCONNECTED, networkInfo.getState());
    480         cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI,
    481                 networkInfo.getState(), NetworkState.TO_CONNECTION, State.CONNECTED);
    482 
    483         // Disable airplane mode
    484         cmActivity.setAirplaneMode(getInstrumentation().getContext(), false);
    485 
    486         assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
    487                             ConnectivityManagerTestActivity.LONG_TIMEOUT));
    488         if (!mWifiOnlyFlag) {
    489             assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE,
    490                     State.DISCONNECTED, ConnectivityManagerTestActivity.LONG_TIMEOUT));
    491         }
    492 
    493         // validate the state transition
    494         if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
    495             log("Wifi state transition validation failed.");
    496             log("reason: " +
    497                     cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
    498             assertTrue(false);
    499         }
    500     }
    501 
    502     // Test case 8: test wifi state change while connecting/disconnecting to/from an AP
    503     @LargeTest
    504     public void testWifiStateChange () {
    505         assertNotNull("SSID is null", mTestAccessPoint);
    506         //Connect to mTestAccessPoint
    507         assertTrue("failed to connect to " + mTestAccessPoint,
    508                    cmActivity.connectToWifi(mTestAccessPoint));
    509         assertTrue(cmActivity.waitForWifiState(WifiManager.WIFI_STATE_ENABLED,
    510                 ConnectivityManagerTestActivity.LONG_TIMEOUT));
    511         assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
    512                             ConnectivityManagerTestActivity.LONG_TIMEOUT));
    513         assertNotNull("Not associated with any AP",
    514                       cmActivity.mWifiManager.getConnectionInfo().getBSSID());
    515 
    516         try {
    517             Thread.sleep(ConnectivityManagerTestActivity.SHORT_TIMEOUT);
    518         } catch (Exception e) {
    519             log("exception: " + e.toString());
    520         }
    521 
    522         // Disconnect from the current AP
    523         log("disconnect from the AP");
    524         if (!cmActivity.disconnectAP()) {
    525             log("failed to disconnect from " + mTestAccessPoint);
    526         }
    527 
    528         // Verify the connectivity state for Wifi is DISCONNECTED
    529         assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.DISCONNECTED,
    530                 ConnectivityManagerTestActivity.LONG_TIMEOUT));
    531 
    532         if (!cmActivity.disableWifi()) {
    533             log("disable Wifi failed");
    534             return;
    535         }
    536         assertTrue(cmActivity.waitForWifiState(WifiManager.WIFI_STATE_DISABLED,
    537                 ConnectivityManagerTestActivity.LONG_TIMEOUT));
    538     }
    539 }
    540