158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang/*
258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * Copyright (C) 2013, The Android Open Source Project
358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang *
458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * Licensed under the Apache License, Version 2.0 (the "License");
558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * you may not use this file except in compliance with the License.
658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * You may obtain a copy of the License at
758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang *
858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang *      http://www.apache.org/licenses/LICENSE-2.0
958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang *
1058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * Unless required by applicable law or agreed to in writing, software
1158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * distributed under the License is distributed on an "AS IS" BASIS,
1258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * See the License for the specific language governing permissions and
1458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * limitations under the License.
1558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang */
1658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang
1758a5db37b3de268aea18b160234f9fd4d70a970dXia Wangpackage com.android.connectivitymanagertest.functional;
1858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang
1958a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration;
2058a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration.AuthAlgorithm;
2158a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration.GroupCipher;
2258a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration.PairwiseCipher;
2358a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.net.wifi.WifiConfiguration.Protocol;
24d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport android.net.wifi.WifiInfo;
25485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Roweimport android.net.wifi.WifiManager;
26d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport android.os.Bundle;
2758a5db37b3de268aea18b160234f9fd4d70a970dXia Wangimport android.test.suitebuilder.annotation.LargeTest;
2858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang
29d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport com.android.connectivitymanagertest.ConnectivityManagerTestBase;
30d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuimport com.android.connectivitymanagertest.WifiAssociationTestRunner;
312591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Roweimport com.android.connectivitymanagertest.WifiConfigurationHelper;
32d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu
3358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang/**
3458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * Test Wi-Fi connection with different configuration
3558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang * To run this tests:
361c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang *  * adb shell am instrument -e ssid <ssid> -e password <password> \
371c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang * -e security-type [OPEN|WEP64|WEP128|WPA_TKIP|WPA2_AES] -e frequency-band [2.4|5.0|auto]
381c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang * -w com.android.connectivitymanagertest/.WifiAssociationTestRunner"
3958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang */
40d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhupublic class WifiAssociationTest extends ConnectivityManagerTestBase {
41485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe    private enum SecurityType {
4258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang        OPEN, WEP64, WEP128, WPA_TKIP, WPA2_AES
4358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang    }
4458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang
452591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe    public WifiAssociationTest() {
462591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe        super(WifiAssociationTest.class.getSimpleName());
472591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe    }
482591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe
49485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe    /**
50485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe     * Test that the wifi can associate with a given access point.
51485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe     */
52485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe    @LargeTest
53485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe    public void testWifiAssociation() {
54485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        WifiAssociationTestRunner runner = (WifiAssociationTestRunner) getInstrumentation();
55d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        Bundle arguments = runner.getArguments();
56485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe
57485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        String ssid = arguments.getString("ssid");
58485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        assertNotNull("ssid is empty", ssid);
59485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe
60485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        String securityTypeStr = arguments.getString("security-type");
61485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        assertNotNull("security-type is empty", securityTypeStr);
62485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        SecurityType securityType = SecurityType.valueOf(securityTypeStr);
63485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe
64485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        String password = arguments.getString("password");
65485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe
66485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        String freqStr = arguments.getString("frequency-band");
67485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        if (freqStr != null) {
68485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe            setFrequencyBand(freqStr);
69485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        }
70485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe
71d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertTrue("enable Wifi failed", enableWifi());
72d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        WifiInfo wi = mWifiManager.getConnectionInfo();
73485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        logv("%s", wi);
74d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu        assertNotNull("no active wifi info", wi);
75485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe
76485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        WifiConfiguration config = getConfig(ssid, securityType, password);
77485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe
78485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        logv("Network config: %s", config.toString());
79485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        connectToWifi(config);
8058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang    }
8158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang
82485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe    /**
83485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe     * Set the frequency band and verify that it has been set.
84485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe     */
85485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe    private void setFrequencyBand(String frequencyBandStr) {
86485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        int frequencyBand = -1;
87485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        if ("2.4".equals(frequencyBandStr)) {
88485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe            frequencyBand = WifiManager.WIFI_FREQUENCY_BAND_2GHZ;
89485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        } else if ("5.0".equals(frequencyBandStr)) {
90485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe            frequencyBand = WifiManager.WIFI_FREQUENCY_BAND_5GHZ;
91485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        } else if ("auto".equals(frequencyBandStr)) {
92485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe            frequencyBand = WifiManager.WIFI_FREQUENCY_BAND_AUTO;
93485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        } else {
94485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe            fail("Invalid frequency-band");
95485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        }
96485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        if (mWifiManager.getFrequencyBand() != frequencyBand) {
97485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe            logv("Set frequency band to %s", frequencyBandStr);
98485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe            mWifiManager.setFrequencyBand(frequencyBand, true);
99485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        }
100485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        assertEquals("Specified frequency band does not match operational band",
101485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe                frequencyBand, mWifiManager.getFrequencyBand());
1021c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang    }
1031c6911ac1d6c4cfecaaa1c1d6814707d77aed4beXia Wang
104485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe    /**
105485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe     * Get the {@link WifiConfiguration} based on ssid, security, and password.
106485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe     */
107485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe    private WifiConfiguration getConfig(String ssid, SecurityType securityType, String password) {
108485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        logv("Security type is %s", securityType.toString());
109485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe
1102591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe        WifiConfiguration config = null;
111485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        switch (securityType) {
11258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang            case OPEN:
113485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe                config = WifiConfigurationHelper.createOpenConfig(ssid);
11458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang                break;
11558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang            case WEP64:
116485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe                assertNotNull("password is empty", password);
1172591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe                // always use hex pair for WEP-40
118485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe                assertTrue(WifiConfigurationHelper.isHex(password, 10));
119485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe                config = WifiConfigurationHelper.createWepConfig(ssid, password);
12058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang                config.allowedGroupCiphers.set(GroupCipher.WEP40);
12158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang                break;
12258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang            case WEP128:
123485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe                assertNotNull("password is empty", password);
1242591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe                // always use hex pair for WEP-104
125485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe                assertTrue(WifiConfigurationHelper.isHex(password, 26));
126485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe                config = WifiConfigurationHelper.createWepConfig(ssid, password);
12758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang                config.allowedGroupCiphers.set(GroupCipher.WEP104);
12858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang                break;
12958a5db37b3de268aea18b160234f9fd4d70a970dXia Wang            case WPA_TKIP:
130485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe                assertNotNull("password is empty", password);
131485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe                config = WifiConfigurationHelper.createPskConfig(ssid, password);
13258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang                config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN);
13358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang                config.allowedProtocols.set(Protocol.WPA);
13458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang                config.allowedPairwiseCiphers.set(PairwiseCipher.TKIP);
13558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang                config.allowedGroupCiphers.set(GroupCipher.TKIP);
13658a5db37b3de268aea18b160234f9fd4d70a970dXia Wang                break;
13758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang            case WPA2_AES:
138485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe                assertNotNull("password is empty", password);
139485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe                config = WifiConfigurationHelper.createPskConfig(ssid, password);
14058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang                config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN);
14158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang                config.allowedProtocols.set(Protocol.RSN);
14258a5db37b3de268aea18b160234f9fd4d70a970dXia Wang                config.allowedPairwiseCiphers.set(PairwiseCipher.CCMP);
14358a5db37b3de268aea18b160234f9fd4d70a970dXia Wang                config.allowedGroupCiphers.set(GroupCipher.CCMP);
14458a5db37b3de268aea18b160234f9fd4d70a970dXia Wang                break;
14558a5db37b3de268aea18b160234f9fd4d70a970dXia Wang            default:
146485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe                fail("Not a valid security type: " + securityType);
14758a5db37b3de268aea18b160234f9fd4d70a970dXia Wang                break;
14858a5db37b3de268aea18b160234f9fd4d70a970dXia Wang        }
149485ceb8506f8566f8cf2f48b40b5ed41233e9941Eric Rowe        return config;
15058a5db37b3de268aea18b160234f9fd4d70a970dXia Wang    }
15158a5db37b3de268aea18b160234f9fd4d70a970dXia Wang}
152