2 * Copyright (C) 2010 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package com.android.connectivitymanagertest.functional;
19 import com.android.connectivitymanagertest.ConnectivityManagerTestActivity;
21 import android.content.Intent;
22 import android.content.Context;
23 import android.os.PowerManager;
24 import android.os.PowerManager.WakeLock;
25 import android.app.Instrumentation;
26 import android.os.Handler;
27 import android.os.Message;
28 import android.net.ConnectivityManager;
29 import android.net.NetworkInfo;
30 import android.net.NetworkInfo.State;
31 import android.net.NetworkInfo.DetailedState;
32 import android.net.wifi.WifiManager;
34 import android.test.suitebuilder.annotation.LargeTest;
35 import android.test.ActivityInstrumentationTestCase2;
36 import com.android.connectivitymanagertest.ConnectivityManagerTestRunner;
37 import com.android.connectivitymanagertest.NetworkState;
38 import android.util.Log;
40 public class ConnectivityManagerMobileTest
41 extends ActivityInstrumentationTestCase2<ConnectivityManagerTestActivity> {
42 private static final String LOG_TAG = "ConnectivityManagerMobileTest";
43 private static final String PKG_NAME = "com.android.connectivitymanagertest";
45 private String TEST_ACCESS_POINT;
46 private ConnectivityManagerTestActivity cmActivity;
49 public ConnectivityManagerMobileTest() {
50 super(PKG_NAME, ConnectivityManagerTestActivity.class);
54 public void setUp() throws Exception {
56 cmActivity = getActivity();
57 ConnectivityManagerTestRunner mRunner =
58 (ConnectivityManagerTestRunner)getInstrumentation();
59 TEST_ACCESS_POINT = mRunner.TEST_SSID;
60 PowerManager pm = (PowerManager)getInstrumentation().
61 getContext().getSystemService(Context.POWER_SERVICE);
62 wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "CMWakeLock");
64 // Each test case will start with cellular connection
65 if (!cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE, State.CONNECTED,
66 ConnectivityManagerTestActivity.LONG_TIMEOUT)) {
67 // Note: When the test fails in setUp(), tearDown is not called. In that case,
68 // the activity is destroyed which blocks the next test at "getActivity()".
69 // tearDown() is called hear to avoid that situation.
71 fail("Device is not connected to Mobile, setUp failed");
76 public void tearDown() throws Exception {
78 Log.v(LOG_TAG, "tear down ConnectivityManagerTestActivity");
80 cmActivity.removeConfiguredNetworksAndDisableWifi();
84 // help function to verify 3G connection
85 public void verifyCellularConnection() {
86 NetworkInfo extraNetInfo = cmActivity.mCM.getActiveNetworkInfo();
87 assertEquals("network type is not MOBILE", ConnectivityManager.TYPE_MOBILE,
88 extraNetInfo.getType());
89 assertTrue("not connected to cellular network", extraNetInfo.isConnected());
90 assertTrue("no data connection", cmActivity.mState.equals(State.CONNECTED));
93 // Test case 1: Test enabling Wifi without associating with any AP
95 public void test3GToWifiNotification() {
96 // To avoid UNKNOWN state when device boots up
97 cmActivity.enableWifi();
99 Thread.sleep(2 * ConnectivityManagerTestActivity.SHORT_TIMEOUT);
100 } catch (Exception e) {
101 Log.v(LOG_TAG, "exception: " + e.toString());
104 cmActivity.disableWifi();
105 // As Wifi stays in DISCONNECTED, the connectivity manager will not broadcast
106 // any network connectivity event for Wifi
107 NetworkInfo networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
108 cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE, networkInfo.getState(),
109 NetworkState.DO_NOTHING, State.CONNECTED);
110 networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
111 cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI, networkInfo.getState(),
112 NetworkState.DO_NOTHING, State.DISCONNECTED);
114 cmActivity.enableWifi();
116 Thread.sleep(2 * ConnectivityManagerTestActivity.SHORT_TIMEOUT);
117 } catch (Exception e) {
118 Log.v(LOG_TAG, "exception: " + e.toString());
121 // validate state and broadcast
122 if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
123 Log.v(LOG_TAG, "the state for WIFI is changed");
124 Log.v(LOG_TAG, "reason: " +
125 cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
126 assertTrue("state validation fail", false);
128 if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_MOBILE)) {
129 Log.v(LOG_TAG, "the state for MOBILE is changed");
130 Log.v(LOG_TAG, "reason: " +
131 cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_MOBILE));
132 assertTrue("state validation fail", false);
134 // Verify that the device is still connected to MOBILE
135 verifyCellularConnection();
138 // Test case 2: test connection to a given AP
140 public void testConnectToWifi() {
141 assertNotNull("SSID is null", TEST_ACCESS_POINT);
142 //Prepare for connectivity verification
143 NetworkInfo networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
144 cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE, networkInfo.getState(),
145 NetworkState.TO_DISCONNECTION, State.DISCONNECTED);
146 networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
147 cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI, networkInfo.getState(),
148 NetworkState.TO_CONNECTION, State.CONNECTED);
150 // Enable Wifi and connect to a test access point
151 assertTrue("failed to connect to " + TEST_ACCESS_POINT,
152 cmActivity.connectToWifi(TEST_ACCESS_POINT));
154 assertTrue(cmActivity.waitForWifiState(WifiManager.WIFI_STATE_ENABLED,
155 ConnectivityManagerTestActivity.LONG_TIMEOUT));
156 Log.v(LOG_TAG, "wifi state is enabled");
157 assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
158 ConnectivityManagerTestActivity.LONG_TIMEOUT));
159 assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE, State.DISCONNECTED,
160 ConnectivityManagerTestActivity.LONG_TIMEOUT));
163 if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
164 Log.v(LOG_TAG, "Wifi state transition validation failed.");
165 Log.v(LOG_TAG, "reason: " +
166 cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
169 if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_MOBILE)) {
170 Log.v(LOG_TAG, "Mobile state transition validation failed.");
171 Log.v(LOG_TAG, "reason: " +
172 cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_MOBILE));
177 // Test case 3: connect to Wifi with known AP
179 public void testConnectToWifWithKnownAP() {
180 assertNotNull("SSID is null", TEST_ACCESS_POINT);
181 // Connect to TEST_ACCESS_POINT
182 assertTrue("failed to connect to " + TEST_ACCESS_POINT,
183 cmActivity.connectToWifi(TEST_ACCESS_POINT));
184 assertTrue(cmActivity.waitForWifiState(WifiManager.WIFI_STATE_ENABLED,
185 ConnectivityManagerTestActivity.LONG_TIMEOUT));
186 assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
187 ConnectivityManagerTestActivity.LONG_TIMEOUT));
190 Thread.sleep(ConnectivityManagerTestActivity.SHORT_TIMEOUT);
191 } catch (Exception e) {
192 Log.v(LOG_TAG, "exception: " + e.toString());
196 Log.v(LOG_TAG, "Disable Wifi");
197 if (!cmActivity.disableWifi()) {
198 Log.v(LOG_TAG, "disable Wifi failed");
202 // Wait for the Wifi state to be DISABLED
203 assertTrue(cmActivity.waitForWifiState(WifiManager.WIFI_STATE_DISABLED,
204 ConnectivityManagerTestActivity.LONG_TIMEOUT));
205 assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.DISCONNECTED,
206 ConnectivityManagerTestActivity.LONG_TIMEOUT));
207 assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE, State.CONNECTED,
208 ConnectivityManagerTestActivity.LONG_TIMEOUT));
210 //Prepare for connectivity state verification
211 NetworkInfo networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
212 cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE,
213 networkInfo.getState(), NetworkState.DO_NOTHING,
215 networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
216 cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI, networkInfo.getState(),
217 NetworkState.TO_CONNECTION, State.CONNECTED);
220 Log.v(LOG_TAG, "Enable Wifi again");
221 cmActivity.enableWifi();
223 // Wait for Wifi to be connected and mobile to be disconnected
224 assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
225 ConnectivityManagerTestActivity.LONG_TIMEOUT));
226 assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE, State.DISCONNECTED,
227 ConnectivityManagerTestActivity.LONG_TIMEOUT));
229 // validate wifi states
230 if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
231 Log.v(LOG_TAG, "Wifi state transition validation failed.");
232 Log.v(LOG_TAG, "reason: " +
233 cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
238 // Test case 4: test disconnect Wifi
240 public void testDisconnectWifi() {
241 assertNotNull("SSID is null", TEST_ACCESS_POINT);
244 assertTrue("failed to connect to " + TEST_ACCESS_POINT,
245 cmActivity.connectToWifi(TEST_ACCESS_POINT));
247 assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
248 ConnectivityManagerTestActivity.LONG_TIMEOUT));
250 // Wait for a few seconds to avoid the state that both Mobile and Wifi is connected
252 Thread.sleep(ConnectivityManagerTestActivity.SHORT_TIMEOUT);
253 } catch (Exception e) {
254 Log.v(LOG_TAG, "exception: " + e.toString());
257 NetworkInfo networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
258 cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE,
259 networkInfo.getState(),
260 NetworkState.TO_CONNECTION,
262 networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
263 cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI, networkInfo.getState(),
264 NetworkState.TO_DISCONNECTION, State.DISCONNECTED);
267 cmActivity.removeConfiguredNetworksAndDisableWifi();
269 assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.DISCONNECTED,
270 ConnectivityManagerTestActivity.LONG_TIMEOUT));
271 assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE, State.CONNECTED,
272 ConnectivityManagerTestActivity.LONG_TIMEOUT));
275 if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
276 Log.v(LOG_TAG, "Wifi state transition validation failed.");
277 Log.v(LOG_TAG, "reason: " +
278 cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
281 if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_MOBILE)) {
282 Log.v(LOG_TAG, "Mobile state transition validation failed.");
283 Log.v(LOG_TAG, "reason: " +
284 cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_MOBILE));
289 // Test case 5: test connectivity from 3G to airplane mode, then to 3G again
291 public void testDataConnectionWith3GToAmTo3G() {
292 //Prepare for state verification
293 NetworkInfo networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
294 cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE,
295 networkInfo.getState(),
296 NetworkState.TO_DISCONNECTION,
298 networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
299 assertEquals(State.DISCONNECTED, networkInfo.getState());
300 cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI, networkInfo.getState(),
301 NetworkState.DO_NOTHING, State.DISCONNECTED);
303 // Enable airplane mode
304 cmActivity.setAirplaneMode(getInstrumentation().getContext(), true);
306 Thread.sleep(ConnectivityManagerTestActivity.SHORT_TIMEOUT);
307 } catch (Exception e) {
308 Log.v(LOG_TAG, "exception: " + e.toString());
311 // Validate the state transition
312 if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
313 Log.v(LOG_TAG, "Wifi state transition validation failed.");
314 Log.v(LOG_TAG, "reason: " +
315 cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
318 if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_MOBILE)) {
319 Log.v(LOG_TAG, "Mobile state transition validation failed.");
320 Log.v(LOG_TAG, "reason: " +
321 cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_MOBILE));
325 // reset state recorder
326 networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
327 cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE,
328 networkInfo.getState(),
329 NetworkState.TO_CONNECTION,
331 networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
332 cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI, networkInfo.getState(),
333 NetworkState.DO_NOTHING, State.DISCONNECTED);
335 // disable airplane mode
336 cmActivity.setAirplaneMode(getInstrumentation().getContext(), false);
338 assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE, State.CONNECTED,
339 ConnectivityManagerTestActivity.LONG_TIMEOUT));
341 // Validate the state transition
342 if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_MOBILE)) {
343 Log.v(LOG_TAG, "Mobile state transition validation failed.");
344 Log.v(LOG_TAG, "reason: " +
345 cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_MOBILE));
348 if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
349 Log.v(LOG_TAG, "Wifi state transition validation failed.");
350 Log.v(LOG_TAG, "reason: " +
351 cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
356 // Test case 6: test connectivity with airplane mode Wifi connected
358 public void testDataConnectionOverAMWithWifi() {
359 assertNotNull("SSID is null", TEST_ACCESS_POINT);
360 // Eanble airplane mode
361 cmActivity.setAirplaneMode(getInstrumentation().getContext(), true);
363 assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE, State.DISCONNECTED,
364 ConnectivityManagerTestActivity.LONG_TIMEOUT));
366 NetworkInfo networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
367 cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_MOBILE,
368 networkInfo.getState(),
369 NetworkState.DO_NOTHING,
371 networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
372 cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI, networkInfo.getState(),
373 NetworkState.TO_CONNECTION, State.CONNECTED);
376 assertTrue("failed to connect to " + TEST_ACCESS_POINT,
377 cmActivity.connectToWifi(TEST_ACCESS_POINT));
378 assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
379 ConnectivityManagerTestActivity.LONG_TIMEOUT));
381 // validate state and broadcast
382 if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
383 Log.v(LOG_TAG, "state validate for Wifi failed");
384 Log.v(LOG_TAG, "reason: " +
385 cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
386 assertTrue("State validation failed", false);
388 if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_MOBILE)) {
389 Log.v(LOG_TAG, "state validation for Mobile failed");
390 Log.v(LOG_TAG, "reason: " +
391 cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_MOBILE));
392 assertTrue("state validation failed", false);
394 cmActivity.setAirplaneMode(getInstrumentation().getContext(), false);
397 // Test case 7: test connectivity while transit from Wifi->AM->Wifi
399 public void testDataConnectionWithWifiToAMToWifi () {
400 // Connect to TEST_ACCESS_POINT
401 assertNotNull("SSID is null", TEST_ACCESS_POINT);
403 assertTrue("failed to connect to " + TEST_ACCESS_POINT,
404 cmActivity.connectToWifi(TEST_ACCESS_POINT));
406 assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
407 ConnectivityManagerTestActivity.LONG_TIMEOUT));
410 Thread.sleep(ConnectivityManagerTestActivity.SHORT_TIMEOUT);
411 } catch (Exception e) {
412 Log.v(LOG_TAG, "exception: " + e.toString());
415 // Enable airplane mode without clearing Wifi
416 cmActivity.setAirplaneMode(getInstrumentation().getContext(), true);
418 assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.DISCONNECTED,
419 ConnectivityManagerTestActivity.LONG_TIMEOUT));
422 Thread.sleep(ConnectivityManagerTestActivity.SHORT_TIMEOUT);
423 } catch (Exception e) {
424 Log.v(LOG_TAG, "exception: " + e.toString());
427 // Prepare for state validation
428 NetworkInfo networkInfo = cmActivity.mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
429 assertEquals(State.DISCONNECTED, networkInfo.getState());
430 cmActivity.setStateTransitionCriteria(ConnectivityManager.TYPE_WIFI,
431 networkInfo.getState(), NetworkState.TO_CONNECTION, State.CONNECTED);
433 // Disable airplane mode
434 cmActivity.setAirplaneMode(getInstrumentation().getContext(), false);
436 assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
437 ConnectivityManagerTestActivity.LONG_TIMEOUT));
438 assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE, State.DISCONNECTED,
439 ConnectivityManagerTestActivity.LONG_TIMEOUT));
441 // validate the state transition
442 if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_WIFI)) {
443 Log.v(LOG_TAG, "Wifi state transition validation failed.");
444 Log.v(LOG_TAG, "reason: " +
445 cmActivity.getTransitionFailureReason(ConnectivityManager.TYPE_WIFI));
450 // Test case 8: test wifi state change while connecting/disconnecting to/from an AP
452 public void testWifiStateChange () {
453 assertNotNull("SSID is null", TEST_ACCESS_POINT);
454 //Connect to TEST_ACCESS_POINT
455 assertTrue("failed to connect to " + TEST_ACCESS_POINT,
456 cmActivity.connectToWifi(TEST_ACCESS_POINT));
457 assertTrue(cmActivity.waitForWifiState(WifiManager.WIFI_STATE_ENABLED,
458 ConnectivityManagerTestActivity.LONG_TIMEOUT));
459 assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
460 ConnectivityManagerTestActivity.LONG_TIMEOUT));
461 assertNotNull("Not associated with any AP",
462 cmActivity.mWifiManager.getConnectionInfo().getBSSID());
465 Thread.sleep(ConnectivityManagerTestActivity.SHORT_TIMEOUT);
466 } catch (Exception e) {
467 Log.v(LOG_TAG, "exception: " + e.toString());
470 // Disconnect from the current AP
471 Log.v(LOG_TAG, "disconnect from the AP");
472 if (!cmActivity.disconnectAP()) {
473 Log.v(LOG_TAG, "failed to disconnect from " + TEST_ACCESS_POINT);
476 // Verify the connectivity state for Wifi is DISCONNECTED
477 assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.DISCONNECTED,
478 ConnectivityManagerTestActivity.LONG_TIMEOUT));
480 if (!cmActivity.disableWifi()) {
481 Log.v(LOG_TAG, "disable Wifi failed");
484 assertTrue(cmActivity.waitForWifiState(WifiManager.WIFI_STATE_DISABLED,
485 ConnectivityManagerTestActivity.LONG_TIMEOUT));