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 com.android.connectivitymanagertest.ConnectivityManagerStressTestRunner;
     20 import com.android.connectivitymanagertest.ConnectivityManagerTestActivity;
     21 import com.android.connectivitymanagertest.ConnectivityManagerTestRunner;
     22 import com.android.connectivitymanagertest.NetworkState;
     23 
     24 import android.R;
     25 import android.app.Activity;
     26 import android.content.ContentResolver;
     27 import android.content.Intent;
     28 import android.content.Context;
     29 import android.content.res.Resources;
     30 import android.net.wifi.WifiConfiguration;
     31 import android.net.wifi.WifiConfiguration.Status;
     32 import android.net.wifi.WifiInfo;
     33 import android.net.wifi.WifiManager;
     34 import android.net.ConnectivityManager;
     35 import android.net.DhcpInfo;
     36 import android.net.NetworkInfo;
     37 import android.net.NetworkInfo.State;
     38 import android.provider.Settings;
     39 
     40 import android.test.suitebuilder.annotation.LargeTest;
     41 import android.test.ActivityInstrumentationTestCase2;
     42 import android.util.Log;
     43 
     44 import java.util.ArrayList;
     45 import java.util.HashMap;
     46 import java.util.HashSet;
     47 import java.util.List;
     48 import java.util.Map.Entry;
     49 import java.util.Set;
     50 
     51 /**
     52  * Test Wi-Fi connection with different configuration
     53  * To run this tests:
     54  *     adb shell am instrument -e class
     55  *          com.android.connectivitymanagertest.functional.WifiConnectionTest
     56  *          -w com.android.connectivitymanagertest/.ConnectivityManagerTestRunner
     57  */
     58 public class WifiConnectionTest
     59     extends ActivityInstrumentationTestCase2<ConnectivityManagerTestActivity> {
     60     private static final String TAG = "WifiConnectionTest";
     61     private static final boolean DEBUG = false;
     62     private List<WifiConfiguration> networks = new ArrayList<WifiConfiguration>();
     63     private ConnectivityManagerTestActivity mAct;
     64     private HashMap<String, DhcpInfo> hm = null;
     65     private ConnectivityManagerTestRunner mRunner;
     66     private ContentResolver cr;
     67     private Set<WifiConfiguration> enabledNetworks = null;
     68     private WifiManager mWifiManager = null;
     69 
     70     public WifiConnectionTest() {
     71         super(ConnectivityManagerTestActivity.class);
     72     }
     73 
     74     @Override
     75     public void setUp() throws Exception {
     76         super.setUp();
     77         log("before we launch the test activity, we preserve all the configured networks.");
     78         mRunner = ((ConnectivityManagerTestRunner)getInstrumentation());
     79         mWifiManager = (WifiManager) mRunner.getContext().getSystemService(Context.WIFI_SERVICE);
     80         enabledNetworks = getEnabledNetworks(mWifiManager.getConfiguredNetworks());
     81 
     82         mAct = getActivity();
     83         cr = mRunner.getContext().getContentResolver();
     84         networks = mAct.loadNetworkConfigurations();
     85         hm = mAct.getDhcpInfo();
     86         if (DEBUG) {
     87             printNetworkConfigurations();
     88             printDhcpInfo();
     89         }
     90 
     91         // enable Wifi and verify wpa_supplicant is started
     92         assertTrue("enable Wifi failed", mAct.enableWifi());
     93         sleep(2 * ConnectivityManagerTestActivity.SHORT_TIMEOUT,
     94                 "interrupted while waiting for WPA_SUPPLICANT to start");
     95         WifiInfo mConnection = mAct.mWifiManager.getConnectionInfo();
     96         assertNotNull(mConnection);
     97         assertTrue("wpa_supplicant is not started ", mAct.mWifiManager.pingSupplicant());
     98     }
     99 
    100     private void printNetworkConfigurations() {
    101         log("==== print network configurations parsed from XML file ====");
    102         log("number of access points: " + networks.size());
    103         for (WifiConfiguration config : networks) {
    104             log(config.toString());
    105         }
    106     }
    107 
    108     private void printDhcpInfo() {
    109         if (hm == null) {
    110             return;
    111         } else {
    112             Set<Entry<String, DhcpInfo>> set = hm.entrySet();
    113             for (Entry<String, DhcpInfo> me: set) {
    114                log("SSID: " + me.getKey());
    115                DhcpInfo dhcp = me.getValue();
    116                log("IP: " + intToIpString(dhcp.ipAddress));
    117                log("gateway: " + intToIpString(dhcp.gateway));
    118                log("Netmask: " + intToIpString(dhcp.netmask));
    119                log("DNS1: " + intToIpString(dhcp.dns1));
    120                log("DNS2: " + intToIpString(dhcp.dns2));
    121             }
    122         }
    123     }
    124 
    125     @Override
    126     public void tearDown() throws Exception {
    127         log("tear down");
    128         mAct.removeConfiguredNetworksAndDisableWifi();
    129         reEnableNetworks(enabledNetworks);
    130         mWifiManager.saveConfiguration();
    131         super.tearDown();
    132     }
    133 
    134     private Set<WifiConfiguration> getEnabledNetworks(List<WifiConfiguration> configuredNetworks) {
    135         Set<WifiConfiguration> networks = new HashSet<WifiConfiguration>();
    136         for (WifiConfiguration wifiConfig : configuredNetworks) {
    137             if (wifiConfig.status == Status.ENABLED || wifiConfig.status == Status.CURRENT) {
    138                 networks.add(wifiConfig);
    139                 log("remembering enabled network " + wifiConfig.SSID +
    140                         " status is " + wifiConfig.status);
    141             }
    142         }
    143         return networks;
    144     }
    145 
    146     private void reEnableNetworks(Set<WifiConfiguration> enabledWifiConfig) {
    147         if (!mWifiManager.isWifiEnabled()) {
    148             log("reEnableNetworks: enable Wifi");
    149             mWifiManager.setWifiEnabled(true);
    150             sleep(ConnectivityManagerTestActivity.SHORT_TIMEOUT,
    151                     "interruped while waiting for wifi to be enabled");
    152         }
    153         for (WifiConfiguration wifiConfig : enabledWifiConfig) {
    154             log("recover wifi configuration: " + wifiConfig.toString());
    155             int netId = mWifiManager.addNetwork(wifiConfig);
    156             if (wifiConfig.status == Status.CURRENT) {
    157                 mWifiManager.enableNetwork(netId, true);
    158                 mWifiManager.reconnect();
    159                 sleep(ConnectivityManagerTestActivity.SHORT_TIMEOUT,
    160                         String.format("interruped while connecting to %s", wifiConfig.SSID));
    161                 log("re-connecting to network " + wifiConfig.SSID);
    162             }
    163         }
    164         List<WifiConfiguration> wifiConfigurations = mWifiManager.getConfiguredNetworks();
    165         for (WifiConfiguration wifiConfig: wifiConfigurations) {
    166             if (wifiConfig.status == Status.DISABLED) {
    167                 mWifiManager.enableNetwork(wifiConfig.networkId, false);
    168             }
    169         }
    170     }
    171 
    172     private String intToIpString(int i) {
    173         return ((i & 0xFF) + "." +
    174                 ((i >> 8) & 0xFF) + "." +
    175                 ((i >> 16) & 0xFF) + "." +
    176                 ((i >> 24) & 0xFF));
    177     }
    178 
    179     private void sleep(long sometime, String errorMsg) {
    180         try {
    181             Thread.sleep(sometime);
    182         } catch (InterruptedException e) {
    183             fail(errorMsg);
    184         }
    185     }
    186 
    187     private void log(String message) {
    188         Log.v(TAG, message);
    189     }
    190     /**
    191      * Connect to the provided Wi-Fi network
    192      * @param config is the network configuration
    193      * @return true if the connection is successful.
    194      */
    195     private void connectToWifi(WifiConfiguration config) {
    196         // step 1: connect to the test access point
    197         boolean isStaticIP = false;
    198         if (hm.containsKey(config.SSID)) {
    199             DhcpInfo dhcpInfo = hm.get(config.SSID);
    200             if (dhcpInfo != null) {
    201                 isStaticIP = true;
    202                 // set the system settings:
    203                 Settings.System.putInt(cr,Settings.System.WIFI_USE_STATIC_IP, 1);
    204                 Settings.System.putString(cr, Settings.System.WIFI_STATIC_IP,
    205                         intToIpString(dhcpInfo.ipAddress));
    206                 Settings.System.putString(cr, Settings.System.WIFI_STATIC_GATEWAY,
    207                         intToIpString(dhcpInfo.gateway));
    208                 Settings.System.putString(cr, Settings.System.WIFI_STATIC_NETMASK,
    209                         intToIpString(dhcpInfo.netmask));
    210                 Settings.System.putString(cr, Settings.System.WIFI_STATIC_DNS1,
    211                         intToIpString(dhcpInfo.dns1));
    212                 Settings.System.putString(cr, Settings.System.WIFI_STATIC_DNS2,
    213                         intToIpString(dhcpInfo.dns2));
    214             }
    215         }
    216 
    217         assertTrue("failed to connect to " + config.SSID,
    218                 mAct.connectToWifiWithConfiguration(config));
    219 
    220         // step 2: verify Wifi state and network state;
    221         assertTrue(mAct.waitForWifiState(WifiManager.WIFI_STATE_ENABLED,
    222                 ConnectivityManagerTestActivity.SHORT_TIMEOUT));
    223         // 802.1x requires long time for connection.
    224         assertTrue(mAct.waitForNetworkState(ConnectivityManager.TYPE_WIFI,
    225                 State.CONNECTED, 2 * ConnectivityManagerTestActivity.LONG_TIMEOUT));
    226 
    227         // step 3: verify the current connected network is the given SSID
    228         assertNotNull("Wifi connection returns null", mAct.mWifiManager.getConnectionInfo());
    229         if (DEBUG) {
    230             log("config.SSID = " + config.SSID);
    231             log("mAct.mWifiManager.getConnectionInfo.getSSID()" +
    232                     mAct.mWifiManager.getConnectionInfo().getSSID());
    233         }
    234         assertTrue(config.SSID.contains(mAct.mWifiManager.getConnectionInfo().getSSID()));
    235         if (isStaticIP) {
    236             Settings.System.putInt(cr, Settings.System.WIFI_USE_STATIC_IP, 0);
    237             Settings.System.putString(cr, Settings.System.WIFI_STATIC_IP, "");
    238             Settings.System.putString(cr, Settings.System.WIFI_STATIC_GATEWAY, "");
    239             Settings.System.putString(cr, Settings.System.WIFI_STATIC_NETMASK, "");
    240             Settings.System.putString(cr, Settings.System.WIFI_STATIC_DNS1, "");
    241             Settings.System.putString(cr, Settings.System.WIFI_STATIC_DNS2, "");
    242         }
    243     }
    244 
    245     @LargeTest
    246     public void testWifiConnections() {
    247         for (int i = 0; i < networks.size(); i++) {
    248             String ssid = networks.get(i).SSID;
    249             log("-- START Wi-Fi connection test for SSID: " + ssid + " --");
    250             connectToWifi(networks.get(i));
    251             sleep(2 * ConnectivityManagerTestActivity.SHORT_TIMEOUT,
    252                     String.format("Interrupted while connecting to ", ssid));
    253             log("-- END Wi-Fi connection test for SSID: " + ssid + " --");
    254         }
    255     }
    256 }
    257