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