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