/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.connectivitymanagertest.functional; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.NetworkInfo.State; import android.net.wifi.WifiManager; import android.os.SystemClock; import android.provider.Settings; import android.test.suitebuilder.annotation.LargeTest; import com.android.connectivitymanagertest.ConnectivityManagerTestBase; import com.android.connectivitymanagertest.ConnectivityManagerTestRunner; public class ConnectivityManagerMobileTest extends ConnectivityManagerTestBase { public ConnectivityManagerMobileTest() { super(ConnectivityManagerMobileTest.class.getSimpleName()); } private String mSsid; private String mPassword; private boolean mWifiOnlyFlag; @Override public void setUp() throws Exception { super.setUp(); ConnectivityManagerTestRunner mRunner = (ConnectivityManagerTestRunner)getInstrumentation(); mSsid = mRunner.getWifiSsid(); mPassword = mRunner.getWifiPassword(); mWifiOnlyFlag = mRunner.isWifiOnly(); // Each test case will start with cellular connection if (Settings.Global.getInt(getInstrumentation().getContext().getContentResolver(), Settings.Global.AIRPLANE_MODE_ON) == 1) { logv("airplane is not disabled, disable it."); mCm.setAirplaneMode(false); } if (!mWifiOnlyFlag) { if (!waitForNetworkState(ConnectivityManager.TYPE_MOBILE, State.CONNECTED, LONG_TIMEOUT)) { // Note: When the test fails in setUp(), tearDown is not called. In that case, // the activity is destroyed which blocks the next test at "getActivity()". // tearDown() is called here to avoid that situation. tearDown(); fail("Device is not connected to Mobile, setUp failed"); } } } @Override public void tearDown() throws Exception { removeConfiguredNetworksAndDisableWifi(); mCm.setAirplaneMode(false); super.tearDown(); } // Test case 1: Test enabling Wifi without associating with any AP, no broadcast on network // event should be expected. @LargeTest public void test3GToWifiNotification() { if (mWifiOnlyFlag) { logv(getName() + " is excluded for wifi-only test"); return; } // disable WiFi assertTrue("failed to disable WiFi", disableWifi()); // wait for mobile assertTrue("failed to wait for mobile connection", waitForNetworkState( ConnectivityManager.TYPE_MOBILE, State.CONNECTED, LONG_TIMEOUT)); // assert that we are indeed using mobile NetworkInfo ni = mCm.getActiveNetworkInfo(); assertEquals("active network is not mobile", ConnectivityManager.TYPE_MOBILE, ni.getType()); long timestamp = SystemClock.uptimeMillis(); // now enable WiFi assertTrue("failed to enable WiFi", enableWifi()); // assert that WiFi state settles at disconnected since no AP should be configured assertTrue("WiFi state is not DISCONNECTED after enabling", waitForWifiState( WifiManager.WIFI_STATE_DISABLED, LONG_TIMEOUT)); // assert that no connectivity change broadcast was sent since we enable wifi assertTrue("connectivity has changed since wifi enable", timestamp > getLastConnectivityChangeTime()); // verify that the device is still connected to MOBILE verifyCellularConnection(); // verify that connection actually works assertTrue("no network connectivity at end of test", checkNetworkConnectivity()); } // Test case 2: test connection to a given AP @LargeTest public void testConnectToWifi() { assertNotNull("SSID is null", mSsid); // assert that we are able to connect to the ap assertTrue("failed to connect to " + mSsid, connectToWifi(mSsid, mPassword)); // assert that WifiManager reports correct state assertTrue("wifi not enabled", waitForWifiState( WifiManager.WIFI_STATE_ENABLED, LONG_TIMEOUT)); // assert that ConnectivityManager reports correct state for Wifi assertTrue("wifi not connected", waitForNetworkState( ConnectivityManager.TYPE_WIFI, State.CONNECTED, WIFI_CONNECTION_TIMEOUT)); // below check disbabled since we have bug in what ConnectivityManager returns // if (!mWifiOnlyFlag) { // // assert that ConnectivityManager reports correct state for mobile // assertTrue("mobile not disconnected", waitForNetworkState( // ConnectivityManager.TYPE_MOBILE, State.DISCONNECTED, LONG_TIMEOUT)); // } // verify that connection actually works assertTrue("no network connectivity at end of test", checkNetworkConnectivity()); } // Test case 3: connect & reconnect to Wifi with known AP @LargeTest public void testConnectToWifWithKnownAP() { assertNotNull("SSID is null", mSsid); // enable WiFi assertTrue("failed to enable wifi", enableWifi()); // wait for wifi enable assertTrue("wifi not enabled", waitForWifiState( WifiManager.WIFI_STATE_ENABLED, LONG_TIMEOUT)); // Connect to AP assertTrue("failed to connect to " + mSsid, connectToWifi(mSsid, mPassword)); // verify wifi connected as reported by ConnectivityManager assertTrue("wifi not connected", waitForNetworkState( ConnectivityManager.TYPE_WIFI, State.CONNECTED, WIFI_CONNECTION_TIMEOUT)); assertTrue("failed to disable wifi", disableWifi()); // Wait for the Wifi state to be DISABLED assertTrue("wifi state not disabled", waitForWifiState( WifiManager.WIFI_STATE_DISABLED, LONG_TIMEOUT)); // below check disbabled since we have bug in what ConnectivityManager returns // assertTrue("wifi not disconnected", waitForNetworkState(ConnectivityManager.TYPE_WIFI, // State.DISCONNECTED, LONG_TIMEOUT)); if (!mWifiOnlyFlag) { assertTrue("mobile not connected after wifi disable", waitForNetworkState( ConnectivityManager.TYPE_MOBILE, State.CONNECTED, LONG_TIMEOUT)); } // wait for 30s before restart wifi SystemClock.sleep(LONG_TIMEOUT); assertTrue("failed to enable wifi after disable", enableWifi()); // wait for wifi enable assertTrue("wifi not enabled after toggle", waitForWifiState( WifiManager.WIFI_STATE_ENABLED, LONG_TIMEOUT)); // Wait for Wifi to be connected and mobile to be disconnected assertTrue("wifi not connected after toggle", waitForNetworkState( ConnectivityManager.TYPE_WIFI, State.CONNECTED, WIFI_CONNECTION_TIMEOUT)); // below check disbabled since we have bug in what ConnectivityManager returns // if (!mWifiOnlyFlag) { // assertTrue("mobile not disconnected after wifi toggle", waitForNetworkState( // ConnectivityManager.TYPE_MOBILE, State.DISCONNECTED, LONG_TIMEOUT)); // } // verify that connection actually works assertTrue("no network connectivity at end of test", checkNetworkConnectivity()); } // Test case 4: test disconnect and clear wifi settings @LargeTest public void testDisconnectWifi() { assertNotNull("SSID is null", mSsid); // enable WiFi assertTrue("failed to enable wifi", enableWifi()); // wait for wifi enable assertTrue("wifi not enabled", waitForWifiState( WifiManager.WIFI_STATE_ENABLED, LONG_TIMEOUT)); // connect to Wifi assertTrue("failed to connect to " + mSsid, connectToWifi(mSsid, mPassword)); assertTrue("wifi not connected", waitForNetworkState( ConnectivityManager.TYPE_WIFI, State.CONNECTED, WIFI_CONNECTION_TIMEOUT)); // clear Wifi removeConfiguredNetworksAndDisableWifi(); // assert that wifi has been disabled assertTrue("wifi state not disabled", waitForWifiState( WifiManager.WIFI_STATE_DISABLED, LONG_TIMEOUT)); if (!mWifiOnlyFlag) { // assert that mobile is now connected assertTrue("mobile not enabled", waitForNetworkState(ConnectivityManager.TYPE_MOBILE, State.CONNECTED, LONG_TIMEOUT)); // verify that connection actually works assertTrue("no network connectivity at end of test", checkNetworkConnectivity()); } } // Test case 5: test connectivity with mobile->airplane mode->mobile @LargeTest public void testDataConnectionWith3GToAmTo3G() { if (mWifiOnlyFlag) { logv(getName() + " is excluded for wifi-only test"); return; } // disable wifi assertTrue("failed to disable wifi", disableWifi()); assertTrue("wifi state not disabled", waitForWifiState( WifiManager.WIFI_STATE_DISABLED, LONG_TIMEOUT)); // assert that we have mobile connection assertTrue("no mobile connection", waitForNetworkState( ConnectivityManager.TYPE_MOBILE, State.CONNECTED, LONG_TIMEOUT)); // enable airplane mode mCm.setAirplaneMode(true); // assert no active network connection after airplane mode enabled assertTrue("still has active network connection", waitUntilNoActiveNetworkConnection(LONG_TIMEOUT)); // disable airplane mode mCm.setAirplaneMode(false); // assert there is active network connection after airplane mode disabled assertTrue("no active network connection after airplane mode disable", waitForActiveNetworkConnection(LONG_TIMEOUT)); // assert that we have mobile connection assertTrue("no mobile connection", waitForNetworkState( ConnectivityManager.TYPE_MOBILE, State.CONNECTED, LONG_TIMEOUT)); // verify that connection actually works assertTrue("no network connectivity at end of test", checkNetworkConnectivity()); } // Test case 6: test connectivity with airplane mode on but wifi enabled @LargeTest public void testDataConnectionOverAMWithWifi() { assertNotNull("SSID is null", mSsid); // enable airplane mode mCm.setAirplaneMode(true); // assert there is active network connection after airplane mode disabled assertTrue("still has active network connection", waitUntilNoActiveNetworkConnection(LONG_TIMEOUT)); // connect to Wifi assertTrue("failed to connect to " + mSsid, connectToWifi(mSsid, mPassword)); assertTrue("wifi not connected", waitForNetworkState( ConnectivityManager.TYPE_WIFI, State.CONNECTED, WIFI_CONNECTION_TIMEOUT)); // verify that connection actually works assertTrue("no network connectivity after wifi enable", checkNetworkConnectivity()); // disable airplane mode mCm.setAirplaneMode(false); } // Test case 7: test connectivity while transit from Wifi->AM->Wifi @LargeTest public void testDataConnectionWithWifiToAMToWifi () { // connect to mTestAccessPoint assertNotNull("SSID is null", mSsid); // enable WiFi assertTrue("failed to enable wifi", enableWifi()); // wait for wifi enable assertTrue("wifi not enabled", waitForWifiState( WifiManager.WIFI_STATE_ENABLED, LONG_TIMEOUT)); // connect to Wifi assertTrue("failed to connect to " + mSsid, connectToWifi(mSsid, mPassword)); assertTrue("wifi not connected", waitForNetworkState( ConnectivityManager.TYPE_WIFI, State.CONNECTED, WIFI_CONNECTION_TIMEOUT)); // enable airplane mode without clearing Wifi mCm.setAirplaneMode(true); // assert there is active network connection after airplane mode disabled assertTrue("still has active network connection", waitUntilNoActiveNetworkConnection(LONG_TIMEOUT)); // disable airplane mode mCm.setAirplaneMode(false); // assert there is active network connection after airplane mode disabled assertTrue("no active network connection after airplane mode disable", waitForActiveNetworkConnection(LONG_TIMEOUT)); // assert that we have a Wifi connection assertTrue("wifi not connected after airplane mode disable", waitForNetworkState( ConnectivityManager.TYPE_WIFI, State.CONNECTED, WIFI_CONNECTION_TIMEOUT)); // verify that connection actually works assertTrue("no network connectivity at end of test", checkNetworkConnectivity()); } // Test case 8: test wifi state change while connecting/disconnecting to/from an AP @LargeTest public void testWifiStateChange () { assertNotNull("SSID is null", mSsid); // enable WiFi assertTrue("failed to enable wifi", enableWifi()); // wait for wifi enable assertTrue("wifi not enabled", waitForWifiState( WifiManager.WIFI_STATE_ENABLED, LONG_TIMEOUT)); // connect to Wifi assertTrue("failed to connect to " + mSsid, connectToWifi(mSsid, mPassword)); assertTrue("wifi not connected", waitForNetworkState( ConnectivityManager.TYPE_WIFI, State.CONNECTED, WIFI_CONNECTION_TIMEOUT)); assertNotNull("not associated with any AP", mWifiManager.getConnectionInfo().getBSSID()); // disconnect from the current AP assertTrue("failed to disconnect from AP", disconnectAP()); // below check disbabled since we have bug in what ConnectivityManager returns // Verify the connectivity state for Wifi is DISCONNECTED // assertTrue(waitForNetworkState(ConnectivityManager.TYPE_WIFI, // State.DISCONNECTED, LONG_TIMEOUT)); // disable WiFi assertTrue("failed to disable wifi", disableWifi()); assertTrue("wifi state not disabled", waitForWifiState( WifiManager.WIFI_STATE_DISABLED, LONG_TIMEOUT)); } // help function to verify 3G connection private void verifyCellularConnection() { NetworkInfo extraNetInfo = mCm.getActiveNetworkInfo(); assertEquals("network type is not MOBILE", ConnectivityManager.TYPE_MOBILE, extraNetInfo.getType()); assertTrue("not connected to cellular network", extraNetInfo.isConnected()); } }