190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang/* 290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * Copyright (C) 2010, The Android Open Source Project 390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * 490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * Licensed under the Apache License, Version 2.0 (the "License"); 590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * you may not use this file except in compliance with the License. 690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * You may obtain a copy of the License at 790e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * 890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * http://www.apache.org/licenses/LICENSE-2.0 990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * 1090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * Unless required by applicable law or agreed to in writing, software 1190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * distributed under the License is distributed on an "AS IS" BASIS, 1290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * See the License for the specific language governing permissions and 1490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * limitations under the License. 1590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang */ 1690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang 1790e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangpackage com.android.connectivitymanagertest.stress; 1890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang 19d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport android.app.Activity; 2090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport android.content.Context; 2190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport android.net.ConnectivityManager; 22d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport android.net.NetworkInfo; 2390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport android.net.NetworkInfo.State; 2490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport android.net.wifi.ScanResult; 256346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.net.wifi.WifiConfiguration; 2690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport android.net.wifi.WifiManager; 27d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport android.os.Bundle; 2890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport android.os.Environment; 2990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport android.os.PowerManager; 30df362d264c5a0204f27da6ee66d741031626c4e5Xia Wangimport android.os.SystemClock; 3190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport android.provider.Settings; 3290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport android.test.suitebuilder.annotation.LargeTest; 3390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport android.util.Log; 3490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang 354dfa295ad8b75a8c0976e7de078ebe4f654a6a89Brett Chabotimport com.android.connectivitymanagertest.ConnectivityManagerStressTestRunner; 3619306af73a8175e1327101132e26a35c7dfe5168Xia Wangimport com.android.connectivitymanagertest.ConnectivityManagerTestBase; 372591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Roweimport com.android.connectivitymanagertest.WifiConfigurationHelper; 384dfa295ad8b75a8c0976e7de078ebe4f654a6a89Brett Chabot 3990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport java.io.BufferedWriter; 4090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport java.io.File; 4190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport java.io.FileWriter; 4290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport java.io.IOException; 4390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport java.util.List; 4490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang 4590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang/** 4690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * Stress Wi-Fi connection, scanning and reconnection after sleep. 4790e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * 4890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * To run this stress test suite, type 4990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * adb shell am instrument -e class com.android.connectivitymanagertest.stress.WifiStressTest 5090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * -w com.android.connectivitymanagertest/.ConnectivityManagerStressTestRunner 5190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang */ 52d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhupublic class WifiStressTest extends ConnectivityManagerTestBase { 53df362d264c5a0204f27da6ee66d741031626c4e5Xia Wang private final static long SCREEN_OFF_TIMER = 500; //500ms 5490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang /** 5590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * Wi-Fi idle time for default sleep policy 5690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang */ 57d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu private final static long WIFI_IDLE_MS = 15 * 1000; 5890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang 5990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang /** 6010a3e8fae865f17c10816d1767d2efa3d4a18935Xia Wang * Delay after issuing wifi shutdown. 6110a3e8fae865f17c10816d1767d2efa3d4a18935Xia Wang * The framework keep driver up for at leat 2 minutes to avoid problems 6210a3e8fae865f17c10816d1767d2efa3d4a18935Xia Wang * that a quick shutdown could cause on wext driver and protentially 6310a3e8fae865f17c10816d1767d2efa3d4a18935Xia Wang * on cfg based driver 6490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang */ 6510a3e8fae865f17c10816d1767d2efa3d4a18935Xia Wang private final static long WIFI_SHUTDOWN_DELAY = 2 * 60 * 1000; 6690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang 6790e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang private final static String OUTPUT_FILE = "WifiStressTestOutput.txt"; 6890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang private int mReconnectIterations; 69d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu private long mWifiSleepTime; 7090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang private int mScanIterations; 7190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang private String mSsid; 7290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang private String mPassword; 7390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang private ConnectivityManagerStressTestRunner mRunner; 7490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang private BufferedWriter mOutputWriter = null; 75776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang private boolean mWifiOnlyFlag; 7690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang 772591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe public WifiStressTest() { 782591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe super(WifiStressTest.class.getSimpleName()); 792591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 802591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 8190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang @Override 82d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected void setUp() throws Exception { 8390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang super.setUp(); 842f19a3103c2cdcf5613eb70493122fb366d509efXia Wang 8590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang mRunner = (ConnectivityManagerStressTestRunner) getInstrumentation(); 86d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu mReconnectIterations = mRunner.getReconnectIterations(); 87d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu mSsid = mRunner.getReconnectSsid(); 88d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu mPassword = mRunner.getReconnectPassword(); 89d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu mScanIterations = mRunner.getScanIterations(); 90d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu mWifiSleepTime = mRunner.getSleepTime(); 91d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu mWifiOnlyFlag = mRunner.isWifiOnly(); 922591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv(String.format("mReconnectIterations(%d), mSsid(%s), mPassword(%s)," 93a4c2caac05009512213454d329579a79dde11e5fXia Wang + "mScanIterations(%d), mWifiSleepTime(%d)", mReconnectIterations, mSsid, 94a4c2caac05009512213454d329579a79dde11e5fXia Wang mPassword, mScanIterations, mWifiSleepTime)); 9590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang mOutputWriter = new BufferedWriter(new FileWriter(new File( 9690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang Environment.getExternalStorageDirectory(), OUTPUT_FILE), true)); 9719306af73a8175e1327101132e26a35c7dfe5168Xia Wang turnScreenOn(); 9819306af73a8175e1327101132e26a35c7dfe5168Xia Wang if (!mWifiManager.isWifiEnabled()) { 992591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("Enable wi-fi before stress tests."); 10019306af73a8175e1327101132e26a35c7dfe5168Xia Wang if (!enableWifi()) { 10190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang tearDown(); 10290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang fail("enable wifi failed."); 10390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 10419306af73a8175e1327101132e26a35c7dfe5168Xia Wang sleep(SHORT_TIMEOUT, "Interruped while waiting for wifi on"); 10590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 10690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 10790e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang 10890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang @Override 109d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu protected void tearDown() throws Exception { 1102591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("tearDown()"); 11190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang if (mOutputWriter != null) { 11290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang mOutputWriter.close(); 11390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 11490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang super.tearDown(); 11590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 11690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang 11790e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang private void writeOutput(String s) { 1182591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("write message: " + s); 11990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang if (mOutputWriter == null) { 1202591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("no writer attached to file " + OUTPUT_FILE); 12190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang return; 12290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 12390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang try { 12490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang mOutputWriter.write(s + "\n"); 12590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang mOutputWriter.flush(); 12690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } catch (IOException e) { 1272591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("failed to write output."); 12890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 12990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 13090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang 13190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang private void sleep(long sometime, String errorMsg) { 13290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang try { 13390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang Thread.sleep(sometime); 13490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } catch (InterruptedException e) { 13590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang fail(errorMsg); 13690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 13790e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 13890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang 13990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang /** 14090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * Stress Wifi Scanning 14190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang * TODO: test the scanning quality for each frequency band 14290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang */ 14390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang @LargeTest 14490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang public void testWifiScanning() { 145d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu long scanTimeSum = 0, i, averageScanTime = -1; 14690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang int ssidAppearInScanResultsCount = 0; // count times of given ssid appear in scan results. 147d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu for (i = 1; i <= mScanIterations; i++) { 1482591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("testWifiScanning: iteration: " + i); 149d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu averageScanTime = scanTimeSum / i; 150d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu writeOutput(String.format("iteration %d out of %d", i, mScanIterations)); 15190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang writeOutput(String.format("average scanning time is %d", averageScanTime)); 1528c1c1e875e836cfb2377effdf850f5caa1fe6f4dXia Wang writeOutput(String.format("ssid appear %d out of %d scan iterations", 15393ca011c60c140facb5a790c25a882a384460a86Xia Wang ssidAppearInScanResultsCount, i)); 154d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu List<ScanResult> scanResultLocal = null; 155d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu // wait for a scan result 156d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu long start = 0; 157d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu synchronized (mWifiScanResultLock) { 158d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu start = SystemClock.uptimeMillis(); 159d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertTrue("start scan failed", mWifiManager.startScan()); 160d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu try { 161d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu mWifiScanResultLock.wait(WAIT_FOR_SCAN_RESULT); 162d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } catch (InterruptedException e) { 163d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu // ignore 16490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 165d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu scanTimeSum += SystemClock.uptimeMillis() - start; 166d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu // save the scan result while in lock 167d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu scanResultLocal = mLastScanResult; 16890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 169d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if (scanResultLocal == null || scanResultLocal.isEmpty()) { 17090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang fail("Scan results are empty "); 17190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 1722591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("size of scan result list: " + scanResultLocal.size()); 173d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu for (ScanResult sr : scanResultLocal) { 1742591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv(String.format("scan result: " + sr.toString())); 175d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if (mSsid.equals(sr.SSID)) { 176d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu ssidAppearInScanResultsCount += 1; 177d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu break; 17890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 17990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 18090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 181d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu Bundle result = new Bundle(); 182d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu result.putLong("actual-iterations", i - 1); 183d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu result.putLong("avg-scan-time", averageScanTime); 184d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu result.putInt("ap-discovered", ssidAppearInScanResultsCount); 185d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu getInstrumentation().sendStatus(Activity.RESULT_FIRST_USER, result); 186d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if (i == mScanIterations + 1) { 1874547dac01f3136393cc708bb49ff546413a45d6cJoshua Schwarz writeOutput(String.format("iteration %d out of %d", i - 1, mScanIterations)); 188d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu writeOutput(String.format("average scanning time is %d", scanTimeSum / (i - 1))); 18990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang writeOutput(String.format("ssid appear %d out of %d scan iterations", 1904547dac01f3136393cc708bb49ff546413a45d6cJoshua Schwarz ssidAppearInScanResultsCount, i - 1)); 19190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 19290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 19390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang 19490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang // Stress Wifi reconnection to secure net after sleep 19590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang @LargeTest 19690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang public void testWifiReconnectionAfterSleep() { 19712747ab3aafc92f3b86da7df2b1d992866cbaf52Guang Zhu // set always scan to false 19812747ab3aafc92f3b86da7df2b1d992866cbaf52Guang Zhu Settings.Global.putInt(mRunner.getContext().getContentResolver(), 19912747ab3aafc92f3b86da7df2b1d992866cbaf52Guang Zhu Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0); 200d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu // set wifi sleep policy to never on while in sleep 201d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu Settings.Global.putInt(mRunner.getContext().getContentResolver(), 202ef1a177e6c5c3d5b33a3debf899737a03d3c9c85Eric Rowe Settings.Global.WIFI_SLEEP_POLICY, Settings.Global.WIFI_SLEEP_POLICY_DEFAULT); 203d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu // set idle timeout for wifi to 15s 2043272a38dbc5fdf2d68b653592a244059cd29255aXia Wang Settings.Global.putLong(mRunner.getContext().getContentResolver(), 2053272a38dbc5fdf2d68b653592a244059cd29255aXia Wang Settings.Global.WIFI_IDLE_MS, WIFI_IDLE_MS); 20690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang 2072591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe WifiConfiguration config; 2082591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if (mPassword == null) { 2092591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config = WifiConfigurationHelper.createOpenConfig(mSsid); 21090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } else { 2112591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config = WifiConfigurationHelper.createPskConfig(mSsid, mPassword); 21290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 21390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang 21490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang assertTrue("Failed to connect to Wi-Fi network: " + mSsid, 21519306af73a8175e1327101132e26a35c7dfe5168Xia Wang connectToWifiWithConfiguration(config)); 216d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertTrue("wifi not connected", waitForNetworkState(ConnectivityManager.TYPE_WIFI, 217d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu State.CONNECTED, WIFI_CONNECTION_TIMEOUT)); 2186bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang // Run ping test to verify the data connection 21958a3ddf5aafacbd84de7104f07a994bb06a9b374Eric Rowe assertTrue("Wi-Fi is connected, but no data connection.", pingTest()); 2206bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang 221d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu long i, sum = 0, avgReconnectTime = 0; 222d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu for (i = 1; i <= mReconnectIterations; i++) { 22373055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang // 1. Put device into sleep mode 22473055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang // 2. Wait for the device to sleep for sometime, verify wi-fi is off and mobile is on. 22573055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang // 3. Maintain the sleep mode for some time, 22673055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang // 4. Verify the Wi-Fi is still off, and data is on 22773055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang // 5. Wake up the device, verify Wi-Fi is enabled and connected. 22893ca011c60c140facb5a790c25a882a384460a86Xia Wang writeOutput(String.format("iteration %d out of %d", 22990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang i, mReconnectIterations)); 2302591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("iteration: " + i); 23119306af73a8175e1327101132e26a35c7dfe5168Xia Wang turnScreenOff(); 232df362d264c5a0204f27da6ee66d741031626c4e5Xia Wang // Use clock time since boot for intervals. 233df362d264c5a0204f27da6ee66d741031626c4e5Xia Wang long start = SystemClock.uptimeMillis(); 23490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang PowerManager pm = 23590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang (PowerManager)mRunner.getContext().getSystemService(Context.POWER_SERVICE); 236d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu while (pm.isInteractive() && 237d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu ((SystemClock.uptimeMillis() - start) < SCREEN_OFF_TIMER)) { 238d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu SystemClock.sleep(100); 239df362d264c5a0204f27da6ee66d741031626c4e5Xia Wang } 240d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertFalse("screen still on", pm.isInteractive()); 241d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu // wait for WiFi timeout 242d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu SystemClock.sleep(WIFI_IDLE_MS + WIFI_SHUTDOWN_DELAY); 243d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu // below check temporarily disabled due to bug in ConnectivityManager return 244d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu// assertTrue("Wait for Wi-Fi to idle timeout", 245d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu// waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.DISCONNECTED, 246d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu// 6 * SHORT_TIMEOUT)); 247d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if (mWifiOnlyFlag) { 248d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertTrue("expected wifi disconnect, still has active connection", 249d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu waitUntilNoActiveNetworkConnection(2 * LONG_TIMEOUT)); 250d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } else { 2513d58d63b03edd95352b70b9b18251c4f72f17b74Xia Wang // use long timeout as the pppd startup may take several retries. 252d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertTrue("no fallback on mobile or wifi didn't disconnect", 25319306af73a8175e1327101132e26a35c7dfe5168Xia Wang waitForNetworkState(ConnectivityManager.TYPE_MOBILE, State.CONNECTED, 25419306af73a8175e1327101132e26a35c7dfe5168Xia Wang 2 * LONG_TIMEOUT)); 2553d58d63b03edd95352b70b9b18251c4f72f17b74Xia Wang } 256d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu SystemClock.sleep(mWifiSleepTime); 257d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu // verify the wi-fi is still off and either we have no connectivity or fallback on mobile 258d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if (mWifiOnlyFlag) { 259d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu NetworkInfo ni = mCm.getActiveNetworkInfo(); 260d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if (ni != null) { 2612591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe Log.e(mLogTag, "has active network while in wifi sleep: " + ni.toString()); 262d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu fail("active network detected"); 263d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } 264d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu } else { 265d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertEquals("mobile not connected", State.CONNECTED, 266d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu mCm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState()); 26758a3ddf5aafacbd84de7104f07a994bb06a9b374Eric Rowe assertTrue("no connectivity over mobile", pingTest()); 2683d58d63b03edd95352b70b9b18251c4f72f17b74Xia Wang } 2696bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang 27090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang // Turn screen on again 27119306af73a8175e1327101132e26a35c7dfe5168Xia Wang turnScreenOn(); 272a4c2caac05009512213454d329579a79dde11e5fXia Wang // Measure the time for Wi-Fi to get connected 273df362d264c5a0204f27da6ee66d741031626c4e5Xia Wang long startTime = SystemClock.uptimeMillis(); 274d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertTrue("screen on: wifi not enabled before timeout", 275d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu waitForWifiState(WifiManager.WIFI_STATE_ENABLED, SHORT_TIMEOUT)); 276d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu assertTrue("screen on: wifi not connected before timeout", 27719306af73a8175e1327101132e26a35c7dfe5168Xia Wang waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED, 278d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu LONG_TIMEOUT)); 279df362d264c5a0204f27da6ee66d741031626c4e5Xia Wang long connectionTime = SystemClock.uptimeMillis() - startTime; 280a4c2caac05009512213454d329579a79dde11e5fXia Wang sum += connectionTime; 281d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu avgReconnectTime = sum / i; 2822591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe logv("average reconnection time is: " + avgReconnectTime); 283a4c2caac05009512213454d329579a79dde11e5fXia Wang 28458a3ddf5aafacbd84de7104f07a994bb06a9b374Eric Rowe assertTrue("Reconnect to Wi-Fi network, but no data connection.", pingTest()); 28590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 286d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu Bundle result = new Bundle(); 287d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu result.putLong("actual-iterations", i - 1); 288d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu result.putLong("avg-reconnect-time", avgReconnectTime); 289d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu getInstrumentation().sendStatus(Activity.RESULT_FIRST_USER, result); 290d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu if (i == mReconnectIterations + 1) { 29193ca011c60c140facb5a790c25a882a384460a86Xia Wang writeOutput(String.format("iteration %d out of %d", 2924547dac01f3136393cc708bb49ff546413a45d6cJoshua Schwarz i - 1, mReconnectIterations)); 29390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 29490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang } 29590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang} 296