16026d52710d7a6195a33885020d29aa1330fa855Xia Wang/*
26026d52710d7a6195a33885020d29aa1330fa855Xia Wang * Copyright (C) 2010, The Android Open Source Project
36026d52710d7a6195a33885020d29aa1330fa855Xia Wang *
46026d52710d7a6195a33885020d29aa1330fa855Xia Wang * Licensed under the Apache License, Version 2.0 (the "License");
56026d52710d7a6195a33885020d29aa1330fa855Xia Wang * you may not use this file except in compliance with the License.
66026d52710d7a6195a33885020d29aa1330fa855Xia Wang * You may obtain a copy of the License at
76026d52710d7a6195a33885020d29aa1330fa855Xia Wang *
86026d52710d7a6195a33885020d29aa1330fa855Xia Wang *      http://www.apache.org/licenses/LICENSE-2.0
96026d52710d7a6195a33885020d29aa1330fa855Xia Wang *
106026d52710d7a6195a33885020d29aa1330fa855Xia Wang * Unless required by applicable law or agreed to in writing, software
116026d52710d7a6195a33885020d29aa1330fa855Xia Wang * distributed under the License is distributed on an "AS IS" BASIS,
126026d52710d7a6195a33885020d29aa1330fa855Xia Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136026d52710d7a6195a33885020d29aa1330fa855Xia Wang * See the License for the specific language governing permissions and
146026d52710d7a6195a33885020d29aa1330fa855Xia Wang * limitations under the License.
156026d52710d7a6195a33885020d29aa1330fa855Xia Wang */
166026d52710d7a6195a33885020d29aa1330fa855Xia Wang
176026d52710d7a6195a33885020d29aa1330fa855Xia Wangpackage com.android.connectivitymanagertest.stress;
186026d52710d7a6195a33885020d29aa1330fa855Xia Wang
196026d52710d7a6195a33885020d29aa1330fa855Xia Wang
206026d52710d7a6195a33885020d29aa1330fa855Xia Wangimport com.android.connectivitymanagertest.ConnectivityManagerStressTestRunner;
216026d52710d7a6195a33885020d29aa1330fa855Xia Wangimport com.android.connectivitymanagertest.ConnectivityManagerTestActivity;
226026d52710d7a6195a33885020d29aa1330fa855Xia Wang
2390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport android.content.Context;
246026d52710d7a6195a33885020d29aa1330fa855Xia Wangimport android.net.wifi.WifiConfiguration;
256026d52710d7a6195a33885020d29aa1330fa855Xia Wangimport android.net.wifi.WifiConfiguration.KeyMgmt;
266026d52710d7a6195a33885020d29aa1330fa855Xia Wangimport android.net.wifi.WifiConfiguration.AuthAlgorithm;
2790e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport android.net.wifi.WifiManager;
2890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport android.os.Environment;
2973055f12d7764e322f3f83717525a2dba01f9ef9Xia Wangimport android.os.IPowerManager;
3090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport android.os.PowerManager;
3173055f12d7764e322f3f83717525a2dba01f9ef9Xia Wangimport android.os.ServiceManager;
3273055f12d7764e322f3f83717525a2dba01f9ef9Xia Wangimport android.os.SystemClock;
336026d52710d7a6195a33885020d29aa1330fa855Xia Wangimport android.test.ActivityInstrumentationTestCase2;
346026d52710d7a6195a33885020d29aa1330fa855Xia Wangimport android.test.suitebuilder.annotation.LargeTest;
356026d52710d7a6195a33885020d29aa1330fa855Xia Wangimport android.util.Log;
366026d52710d7a6195a33885020d29aa1330fa855Xia Wang
3790e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport java.io.BufferedWriter;
3890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport java.io.File;
3990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangimport java.io.FileWriter;
4090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
416026d52710d7a6195a33885020d29aa1330fa855Xia Wang/**
426026d52710d7a6195a33885020d29aa1330fa855Xia Wang * Stress the wifi driver as access point.
436026d52710d7a6195a33885020d29aa1330fa855Xia Wang */
446026d52710d7a6195a33885020d29aa1330fa855Xia Wangpublic class WifiApStress
456026d52710d7a6195a33885020d29aa1330fa855Xia Wang    extends ActivityInstrumentationTestCase2<ConnectivityManagerTestActivity> {
466026d52710d7a6195a33885020d29aa1330fa855Xia Wang    private final static String TAG = "WifiApStress";
476026d52710d7a6195a33885020d29aa1330fa855Xia Wang    private static String NETWORK_ID = "AndroidAPTest";
486026d52710d7a6195a33885020d29aa1330fa855Xia Wang    private static String PASSWD = "androidwifi";
4993ca011c60c140facb5a790c25a882a384460a86Xia Wang    private final static String OUTPUT_FILE = "WifiStressTestOutput.txt";
5090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang    private ConnectivityManagerTestActivity mAct;
5190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang    private int iterations;
5290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang    private BufferedWriter mOutputWriter = null;
5390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang    private int mLastIteration = 0;
54776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang    private boolean mWifiOnlyFlag;
556026d52710d7a6195a33885020d29aa1330fa855Xia Wang
566026d52710d7a6195a33885020d29aa1330fa855Xia Wang    public WifiApStress() {
576026d52710d7a6195a33885020d29aa1330fa855Xia Wang        super(ConnectivityManagerTestActivity.class);
586026d52710d7a6195a33885020d29aa1330fa855Xia Wang    }
596026d52710d7a6195a33885020d29aa1330fa855Xia Wang
606026d52710d7a6195a33885020d29aa1330fa855Xia Wang    @Override
616026d52710d7a6195a33885020d29aa1330fa855Xia Wang    public void setUp() throws Exception {
626026d52710d7a6195a33885020d29aa1330fa855Xia Wang        super.setUp();
636026d52710d7a6195a33885020d29aa1330fa855Xia Wang        mAct = getActivity();
6490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang        ConnectivityManagerStressTestRunner mRunner =
6590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang            (ConnectivityManagerStressTestRunner)getInstrumentation();
6690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang        iterations = mRunner.mSoftapIterations;
67776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        mWifiOnlyFlag = mRunner.mWifiOnlyFlag;
6873055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang        mAct.turnScreenOn();
696026d52710d7a6195a33885020d29aa1330fa855Xia Wang    }
706026d52710d7a6195a33885020d29aa1330fa855Xia Wang
716026d52710d7a6195a33885020d29aa1330fa855Xia Wang    @Override
726026d52710d7a6195a33885020d29aa1330fa855Xia Wang    public void tearDown() throws Exception {
7390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang        // write the total number of iterations into output file
7490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang        mOutputWriter = new BufferedWriter(new FileWriter(new File(
7590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang                Environment.getExternalStorageDirectory(), OUTPUT_FILE)));
7693ca011c60c140facb5a790c25a882a384460a86Xia Wang        mOutputWriter.write(String.format("iteration %d out of %d\n", mLastIteration, iterations));
7790e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang        mOutputWriter.flush();
7890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang        mOutputWriter.close();
796026d52710d7a6195a33885020d29aa1330fa855Xia Wang        super.tearDown();
806026d52710d7a6195a33885020d29aa1330fa855Xia Wang    }
816026d52710d7a6195a33885020d29aa1330fa855Xia Wang
826026d52710d7a6195a33885020d29aa1330fa855Xia Wang    @LargeTest
836026d52710d7a6195a33885020d29aa1330fa855Xia Wang    public void testWifiHotSpot() {
84776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        if (mWifiOnlyFlag) {
85776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang            Log.v(TAG, this.getName() + " is excluded for wi-fi only test");
86776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang            return;
87776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang        }
886026d52710d7a6195a33885020d29aa1330fa855Xia Wang        WifiConfiguration config = new WifiConfiguration();
896026d52710d7a6195a33885020d29aa1330fa855Xia Wang        config.SSID = NETWORK_ID;
906026d52710d7a6195a33885020d29aa1330fa855Xia Wang        config.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
916026d52710d7a6195a33885020d29aa1330fa855Xia Wang        config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN);
926026d52710d7a6195a33885020d29aa1330fa855Xia Wang        config.preSharedKey = PASSWD;
936026d52710d7a6195a33885020d29aa1330fa855Xia Wang
946026d52710d7a6195a33885020d29aa1330fa855Xia Wang        // If Wifi is enabled, disable it
956026d52710d7a6195a33885020d29aa1330fa855Xia Wang        if (mAct.mWifiManager.isWifiEnabled()) {
966026d52710d7a6195a33885020d29aa1330fa855Xia Wang            mAct.disableWifi();
976026d52710d7a6195a33885020d29aa1330fa855Xia Wang        }
9890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang        int i;
9990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang        for (i = 0; i < iterations; i++) {
1006026d52710d7a6195a33885020d29aa1330fa855Xia Wang            Log.v(TAG, "iteration: " + i);
10190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang            mLastIteration = i;
1026026d52710d7a6195a33885020d29aa1330fa855Xia Wang            // enable Wifi tethering
1036026d52710d7a6195a33885020d29aa1330fa855Xia Wang            assertTrue(mAct.mWifiManager.setWifiApEnabled(config, true));
1046026d52710d7a6195a33885020d29aa1330fa855Xia Wang            // Wait for wifi ap state to be ENABLED
10590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang            assertTrue(mAct.waitForWifiAPState(WifiManager.WIFI_AP_STATE_ENABLED,
1062f19a3103c2cdcf5613eb70493122fb366d509efXia Wang                    2 * ConnectivityManagerTestActivity.LONG_TIMEOUT));
1076026d52710d7a6195a33885020d29aa1330fa855Xia Wang            // Wait for wifi tethering result
10890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang            assertEquals(ConnectivityManagerTestActivity.SUCCESS,
10990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang                    mAct.waitForTetherStateChange(2*ConnectivityManagerTestActivity.SHORT_TIMEOUT));
1106026d52710d7a6195a33885020d29aa1330fa855Xia Wang            // Allow the wifi tethering to be enabled for 10 seconds
1116026d52710d7a6195a33885020d29aa1330fa855Xia Wang            try {
1126026d52710d7a6195a33885020d29aa1330fa855Xia Wang                Thread.sleep(2 * ConnectivityManagerTestActivity.SHORT_TIMEOUT);
1136026d52710d7a6195a33885020d29aa1330fa855Xia Wang            } catch (Exception e) {
1146026d52710d7a6195a33885020d29aa1330fa855Xia Wang                fail("thread in sleep is interrupted");
1156026d52710d7a6195a33885020d29aa1330fa855Xia Wang            }
1166bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang            assertTrue("no uplink data connection after Wi-Fi tethering", mAct.pingTest(null));
1176bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang            // Disable soft AP
1186026d52710d7a6195a33885020d29aa1330fa855Xia Wang            assertTrue(mAct.mWifiManager.setWifiApEnabled(config, false));
119ec841adcf70edfdffce096b039e2cd3930633131Xia Wang            // Wait for 30 seconds until Wi-Fi tethering is stopped
120ec841adcf70edfdffce096b039e2cd3930633131Xia Wang            try {
121ec841adcf70edfdffce096b039e2cd3930633131Xia Wang                Thread.sleep(30 * 1000);
122ec841adcf70edfdffce096b039e2cd3930633131Xia Wang                Log.v(TAG, "wait for Wi-Fi tethering to be disabled.");
123ec841adcf70edfdffce096b039e2cd3930633131Xia Wang            } catch (Exception e) {
124ec841adcf70edfdffce096b039e2cd3930633131Xia Wang                fail("thread in sleep is interrupted");
125ec841adcf70edfdffce096b039e2cd3930633131Xia Wang            }
126ec841adcf70edfdffce096b039e2cd3930633131Xia Wang            assertFalse("Wi-Fi AP disable failed", mAct.mWifiManager.isWifiApEnabled());
1276026d52710d7a6195a33885020d29aa1330fa855Xia Wang        }
12890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang        if (i == iterations) {
12990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang            mLastIteration = iterations;
13090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang        }
1316026d52710d7a6195a33885020d29aa1330fa855Xia Wang    }
1326026d52710d7a6195a33885020d29aa1330fa855Xia Wang
1336026d52710d7a6195a33885020d29aa1330fa855Xia Wang}
134