Home | History | Annotate | Download | only in stress
      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.stress;
     18 
     19 import android.content.Context;
     20 import android.net.ConnectivityManager;
     21 import android.net.NetworkInfo.State;
     22 import android.net.wifi.ScanResult;
     23 import android.net.wifi.WifiConfiguration;
     24 import android.net.wifi.WifiConfiguration.IpAssignment;
     25 import android.net.wifi.WifiConfiguration.KeyMgmt;
     26 import android.net.wifi.WifiConfiguration.ProxySettings;
     27 import android.net.wifi.WifiManager;
     28 import android.os.Environment;
     29 import android.os.PowerManager;
     30 import android.provider.Settings;
     31 import android.test.ActivityInstrumentationTestCase2;
     32 import android.test.suitebuilder.annotation.LargeTest;
     33 import android.util.Log;
     34 
     35 import com.android.connectivitymanagertest.ConnectivityManagerStressTestRunner;
     36 import com.android.connectivitymanagertest.ConnectivityManagerTestActivity;
     37 
     38 import java.io.BufferedWriter;
     39 import java.io.File;
     40 import java.io.FileWriter;
     41 import java.io.IOException;
     42 import java.util.List;
     43 
     44 /**
     45  * Stress Wi-Fi connection, scanning and reconnection after sleep.
     46  *
     47  * To run this stress test suite, type
     48  * adb shell am instrument -e class com.android.connectivitymanagertest.stress.WifiStressTest
     49  *                  -w com.android.connectivitymanagertest/.ConnectivityManagerStressTestRunner
     50  */
     51 public class WifiStressTest
     52     extends ActivityInstrumentationTestCase2<ConnectivityManagerTestActivity> {
     53     private final static String TAG = "WifiStressTest";
     54 
     55     /**
     56      * Wi-Fi idle time for default sleep policy
     57      */
     58     private final static long WIFI_IDLE_MS = 60 * 1000;
     59 
     60     /**
     61      * Delay after issuing wifi shutdown.
     62      * The framework keep driver up for at leat 2 minutes to avoid problems
     63      * that a quick shutdown could cause on wext driver and protentially
     64      * on cfg based driver
     65      */
     66     private final static long WIFI_SHUTDOWN_DELAY = 2 * 60 * 1000;
     67 
     68     private final static String OUTPUT_FILE = "WifiStressTestOutput.txt";
     69     private ConnectivityManagerTestActivity mAct;
     70     private int mReconnectIterations;
     71     private int mWifiSleepTime;
     72     private int mScanIterations;
     73     private String mSsid;
     74     private String mPassword;
     75     private ConnectivityManagerStressTestRunner mRunner;
     76     private BufferedWriter mOutputWriter = null;
     77     private boolean mWifiOnlyFlag;
     78 
     79     public WifiStressTest() {
     80         super(ConnectivityManagerTestActivity.class);
     81     }
     82 
     83     @Override
     84     public void setUp() throws Exception {
     85         super.setUp();
     86 
     87         mAct = getActivity();
     88         mRunner = (ConnectivityManagerStressTestRunner) getInstrumentation();
     89         mReconnectIterations = mRunner.mReconnectIterations;
     90         mSsid = mRunner.mReconnectSsid;
     91         mPassword = mRunner.mReconnectPassword;
     92         mScanIterations = mRunner.mScanIterations;
     93         mWifiSleepTime = mRunner.mSleepTime;
     94         mWifiOnlyFlag = mRunner.mWifiOnlyFlag;
     95         log(String.format("mReconnectIterations(%d), mSsid(%s), mPassword(%s),"
     96             + "mScanIterations(%d), mWifiSleepTime(%d)", mReconnectIterations, mSsid,
     97             mPassword, mScanIterations, mWifiSleepTime));
     98         mOutputWriter = new BufferedWriter(new FileWriter(new File(
     99                 Environment.getExternalStorageDirectory(), OUTPUT_FILE), true));
    100         mAct.turnScreenOn();
    101         if (!mAct.mWifiManager.isWifiEnabled()) {
    102             log("Enable wi-fi before stress tests.");
    103             if (!mAct.enableWifi()) {
    104                 tearDown();
    105                 fail("enable wifi failed.");
    106             }
    107             sleep(ConnectivityManagerTestActivity.SHORT_TIMEOUT,
    108                     "Interruped while waiting for wifi on");
    109         }
    110     }
    111 
    112     @Override
    113     public void tearDown() throws Exception {
    114         log("tearDown()");
    115         if (mOutputWriter != null) {
    116             mOutputWriter.close();
    117         }
    118         super.tearDown();
    119     }
    120 
    121     private void writeOutput(String s) {
    122         log("write message: " + s);
    123         if (mOutputWriter == null) {
    124             log("no writer attached to file " + OUTPUT_FILE);
    125             return;
    126         }
    127         try {
    128             mOutputWriter.write(s + "\n");
    129             mOutputWriter.flush();
    130         } catch (IOException e) {
    131             log("failed to write output.");
    132         }
    133     }
    134 
    135     public void log(String message) {
    136         Log.v(TAG, message);
    137     }
    138 
    139     private void sleep(long sometime, String errorMsg) {
    140         try {
    141             Thread.sleep(sometime);
    142         } catch (InterruptedException e) {
    143             fail(errorMsg);
    144         }
    145     }
    146 
    147     /**
    148      *  Stress Wifi Scanning
    149      *  TODO: test the scanning quality for each frequency band
    150      */
    151     @LargeTest
    152     public void testWifiScanning() {
    153         int scanTimeSum = 0;
    154         int i;
    155         int ssidAppearInScanResultsCount = 0; // count times of given ssid appear in scan results.
    156         for (i = 0; i < mScanIterations; i++) {
    157             log("testWifiScanning: iteration: " + i);
    158             int averageScanTime = 0;
    159             if (i > 0) {
    160                 averageScanTime = scanTimeSum/i;
    161             }
    162             writeOutput(String.format("iteration %d out of %d",
    163                     i, mScanIterations));
    164             writeOutput(String.format("average scanning time is %d", averageScanTime));
    165             writeOutput(String.format("ssid appear %d out of %d scan iterations",
    166                     ssidAppearInScanResultsCount, i));
    167             long startTime = System.currentTimeMillis();
    168             mAct.scanResultAvailable = false;
    169             assertTrue("start scan failed", mAct.mWifiManager.startScanActive());
    170             while (true) {
    171                 if ((System.currentTimeMillis() - startTime) >
    172                 ConnectivityManagerTestActivity.WIFI_SCAN_TIMEOUT) {
    173                     fail("Wifi scanning takes more than " +
    174                             ConnectivityManagerTestActivity.WIFI_SCAN_TIMEOUT + " ms");
    175                 }
    176                 synchronized(mAct) {
    177                     try {
    178                         mAct.wait(ConnectivityManagerTestActivity.WAIT_FOR_SCAN_RESULT);
    179                     } catch (InterruptedException e) {
    180                         e.printStackTrace();
    181                     }
    182                     if (mAct.scanResultAvailable) {
    183                         long scanTime = (System.currentTimeMillis() - startTime);
    184                         scanTimeSum += scanTime;
    185                         break;
    186                     }
    187                 }
    188             }
    189             if ((mAct.mWifiManager.getScanResults() == null) ||
    190                     (mAct.mWifiManager.getScanResults().size() <= 0)) {
    191                 fail("Scan results are empty ");
    192             }
    193 
    194             List<ScanResult> netList = mAct.mWifiManager.getScanResults();
    195             if (netList != null) {
    196                 log("size of scan result list: " + netList.size());
    197                 for (int s = 0; s < netList.size(); s++) {
    198                     ScanResult sr= netList.get(s);
    199                     log(String.format("scan result for %s is: %s", sr.SSID, sr.toString()));
    200                     log(String.format("signal level for %s is %d ", sr.SSID, sr.level));
    201                     if (sr.SSID.equals(mSsid)) {
    202                         ssidAppearInScanResultsCount += 1;
    203                         log("Number of times " + mSsid + " appear in the scan list: " +
    204                                 ssidAppearInScanResultsCount);
    205                         break;
    206                     }
    207                 }
    208             }
    209         }
    210         if (i == mScanIterations) {
    211             writeOutput(String.format("iteration %d out of %d",
    212                     i, mScanIterations));
    213             writeOutput(String.format("average scanning time is %d", scanTimeSum/mScanIterations));
    214             writeOutput(String.format("ssid appear %d out of %d scan iterations",
    215                     ssidAppearInScanResultsCount, mScanIterations));
    216         }
    217     }
    218 
    219     // Stress Wifi reconnection to secure net after sleep
    220     @LargeTest
    221     public void testWifiReconnectionAfterSleep() {
    222         int value = Settings.System.getInt(mRunner.getContext().getContentResolver(),
    223                 Settings.System.WIFI_SLEEP_POLICY, -1);
    224         if (value < 0) {
    225             Settings.System.putInt(mRunner.getContext().getContentResolver(),
    226                     Settings.System.WIFI_SLEEP_POLICY, Settings.System.WIFI_SLEEP_POLICY_DEFAULT);
    227             log("set wifi sleep policy to default value");
    228         }
    229         Settings.Secure.putLong(mRunner.getContext().getContentResolver(),
    230                 Settings.Secure.WIFI_IDLE_MS, WIFI_IDLE_MS);
    231 
    232         // Connect to a Wi-Fi network
    233         WifiConfiguration config = new WifiConfiguration();
    234         config.SSID = mSsid;
    235         config.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
    236         if (mPassword.matches("[0-9A-Fa-f]{64}")) {
    237             config.preSharedKey = mPassword;
    238         } else {
    239             config.preSharedKey = '"' + mPassword + '"';
    240         }
    241         config.ipAssignment = IpAssignment.DHCP;
    242         config.proxySettings = ProxySettings.NONE;
    243 
    244         assertTrue("Failed to connect to Wi-Fi network: " + mSsid,
    245                 mAct.connectToWifiWithConfiguration(config));
    246         assertTrue(mAct.waitForWifiState(WifiManager.WIFI_STATE_ENABLED,
    247                 ConnectivityManagerTestActivity.SHORT_TIMEOUT));
    248         assertTrue(mAct.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
    249                 ConnectivityManagerTestActivity.LONG_TIMEOUT));
    250         // Run ping test to verify the data connection
    251         assertTrue("Wi-Fi is connected, but no data connection.", mAct.pingTest(null));
    252 
    253         int i;
    254         long sum = 0;
    255         for (i = 0; i < mReconnectIterations; i++) {
    256             // 1. Put device into sleep mode
    257             // 2. Wait for the device to sleep for sometime, verify wi-fi is off and mobile is on.
    258             // 3. Maintain the sleep mode for some time,
    259             // 4. Verify the Wi-Fi is still off, and data is on
    260             // 5. Wake up the device, verify Wi-Fi is enabled and connected.
    261             writeOutput(String.format("iteration %d out of %d",
    262                     i, mReconnectIterations));
    263             log("iteration: " + i);
    264             mAct.turnScreenOff();
    265             PowerManager pm =
    266                 (PowerManager)mRunner.getContext().getSystemService(Context.POWER_SERVICE);
    267             assertFalse(pm.isScreenOn());
    268             sleep(WIFI_IDLE_MS + WIFI_SHUTDOWN_DELAY, "Interruped while wait for wifi to be idle");
    269             assertTrue("Wait for Wi-Fi to idle timeout",
    270                     mAct.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.DISCONNECTED,
    271                     6 * ConnectivityManagerTestActivity.SHORT_TIMEOUT));
    272             if (!mWifiOnlyFlag) {
    273                 // use long timeout as the pppd startup may take several retries.
    274                 assertTrue("Wait for cellular connection timeout",
    275                         mAct.waitForNetworkState(ConnectivityManager.TYPE_MOBILE, State.CONNECTED,
    276                         2 * ConnectivityManagerTestActivity.LONG_TIMEOUT));
    277             }
    278             sleep(mWifiSleepTime, "Interrupted while device is in sleep mode");
    279             // Verify the wi-fi is still off and data connection is on
    280             assertEquals("Wi-Fi is reconnected", State.DISCONNECTED,
    281                     mAct.mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState());
    282 
    283             if (!mWifiOnlyFlag) {
    284                 assertEquals("Cellular connection is down", State.CONNECTED,
    285                              mAct.mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState());
    286                 assertTrue("Mobile is connected, but no data connection.", mAct.pingTest(null));
    287             }
    288 
    289             // Turn screen on again
    290             mAct.turnScreenOn();
    291             // Measure the time for Wi-Fi to get connected
    292             long startTime = System.currentTimeMillis();
    293             assertTrue("Wait for Wi-Fi enable timeout after wake up",
    294                     mAct.waitForWifiState(WifiManager.WIFI_STATE_ENABLED,
    295                     ConnectivityManagerTestActivity.SHORT_TIMEOUT));
    296             assertTrue("Wait for Wi-Fi connection timeout after wake up",
    297                     mAct.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
    298                     6 * ConnectivityManagerTestActivity.LONG_TIMEOUT));
    299             long connectionTime = System.currentTimeMillis() - startTime;
    300             sum += connectionTime;
    301             log("average reconnection time is: " + sum/(i+1));
    302 
    303             assertTrue("Reconnect to Wi-Fi network, but no data connection.", mAct.pingTest(null));
    304         }
    305         if (i == mReconnectIterations) {
    306             writeOutput(String.format("iteration %d out of %d",
    307                     i, mReconnectIterations));
    308         }
    309     }
    310 }
    311