WifiApConfigStoreTest.java revision c79666b79e273ceaa2f74090b02ca6cf83c61387
1/*
2 * Copyright (C) 2016 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
17package com.android.server.wifi;
18
19import static org.junit.Assert.assertEquals;
20import static org.junit.Assert.assertTrue;
21import static org.mockito.Mockito.when;
22
23import android.content.Context;
24import android.net.wifi.WifiConfiguration;
25import android.net.wifi.WifiConfiguration.KeyMgmt;
26import android.test.suitebuilder.annotation.SmallTest;
27
28import com.android.internal.R;
29
30import org.junit.After;
31import org.junit.Before;
32import org.junit.Test;
33import org.mockito.Mock;
34import org.mockito.MockitoAnnotations;
35
36import java.io.File;
37import java.lang.reflect.Method;
38
39/**
40 * Unit tests for {@link com.android.server.wifi.WifiApConfigStore}.
41 */
42@SmallTest
43public class WifiApConfigStoreTest {
44
45    private static final String TAG = "WifiApConfigStoreTest";
46
47    private static final String TEST_AP_CONFIG_FILE_PREFIX = "APConfig_";
48    private static final String TEST_DEFAULT_2G_CHANNEL_LIST = "1,2,3,4,5,6";
49    private static final String TEST_DEFAULT_AP_SSID = "TestAP";
50    private static final String TEST_CONFIGURED_AP_SSID = "ConfiguredAP";
51
52    @Mock Context mContext;
53    File mApConfigFile;
54
55    @Before
56    public void setUp() throws Exception {
57        MockitoAnnotations.initMocks(this);
58
59        /* Create a temporary file for AP config file storage. */
60        mApConfigFile = File.createTempFile(TEST_AP_CONFIG_FILE_PREFIX, "");
61
62        /* Setup expectations for Resources to return some default settings. */
63        MockResources resources = new MockResources();
64        resources.setString(R.string.config_wifi_framework_sap_2G_channel_list,
65                            TEST_DEFAULT_2G_CHANNEL_LIST);
66        resources.setString(R.string.wifi_tether_configure_ssid_default,
67                            TEST_DEFAULT_AP_SSID);
68        when(mContext.getResources()).thenReturn(resources);
69    }
70
71    @After
72    public void cleanUp() {
73        /* Remove the temporary AP config file. */
74        mApConfigFile.delete();
75    }
76
77    /**
78     * Generate a WifiConfiguration based on the specified parameters.
79     */
80    private WifiConfiguration setupApConfig(
81            String ssid, String preSharedKey, int keyManagement, int band, int channel) {
82        WifiConfiguration config = new WifiConfiguration();
83        config.SSID = ssid;
84        config.preSharedKey = preSharedKey;
85        config.allowedKeyManagement.set(keyManagement);
86        config.apBand = band;
87        config.apChannel = channel;
88        return config;
89    }
90
91    private boolean writeApConfigFile(WifiConfiguration config) throws Exception {
92        Method m = WifiApConfigStore.class.getDeclaredMethod(
93                "writeApConfiguration", String.class, WifiConfiguration.class);
94        m.setAccessible(true);
95        return (boolean) m.invoke(null, mApConfigFile.getPath(), config);
96    }
97
98    private void verifyApConfig(WifiConfiguration config1, WifiConfiguration config2) {
99        assertEquals(config1.SSID, config2.SSID);
100        assertEquals(config1.preSharedKey, config2.preSharedKey);
101        assertEquals(config1.getAuthType(), config2.getAuthType());
102        assertEquals(config1.apBand, config2.apBand);
103        assertEquals(config1.apChannel, config2.apChannel);
104    }
105
106    private void verifyDefaultApConfig(WifiConfiguration config) {
107        assertEquals(TEST_DEFAULT_AP_SSID, config.SSID);
108        assertTrue(config.allowedKeyManagement.get(KeyMgmt.WPA2_PSK));
109    }
110
111    /**
112     * AP Configuration is not specified in the config file,
113     * WifiApConfigStore should fallback to use the default configuration.
114     */
115    @Test
116    public void initWithDefaultConfiguration() throws Exception {
117        WifiApConfigStore store = new WifiApConfigStore(mContext, mApConfigFile.getPath());
118        verifyDefaultApConfig(store.getApConfiguration());
119    }
120
121    /**
122     * Verify WifiApConfigStore can correctly load the existing configuration
123     * from the config file.
124     */
125    @Test
126    public void initWithExistingConfiguration() throws Exception {
127        WifiConfiguration expectedConfig = setupApConfig(
128                "ConfiguredAP",    /* SSID */
129                "randomKey",       /* preshared key */
130                KeyMgmt.WPA_EAP,   /* key management */
131                1,                 /* AP band (5GHz) */
132                40                 /* AP channel */);
133        assertTrue(writeApConfigFile(expectedConfig));
134        WifiApConfigStore store = new WifiApConfigStore(mContext, mApConfigFile.getPath());
135        verifyApConfig(expectedConfig, store.getApConfiguration());
136    }
137
138    /**
139     * Verify the handling of setting a null ap configuration.
140     * WifiApConfigStore should fallback to the default configuration when
141     * null ap configuration is provided.
142     */
143    @Test
144    public void setNullApConfiguration() throws Exception {
145        /* Initialize WifiApConfigStore with existing configuration. */
146        WifiConfiguration expectedConfig = setupApConfig(
147                "ConfiguredAP",    /* SSID */
148                "randomKey",       /* preshared key */
149                KeyMgmt.WPA_EAP,   /* key management */
150                1,                 /* AP band (5GHz) */
151                40                 /* AP channel */);
152        assertTrue(writeApConfigFile(expectedConfig));
153        WifiApConfigStore store = new WifiApConfigStore(mContext, mApConfigFile.getPath());
154        verifyApConfig(expectedConfig, store.getApConfiguration());
155
156        store.setApConfiguration(null);
157        verifyDefaultApConfig(store.getApConfiguration());
158    }
159
160    /**
161     * Verify AP configuration is correctly updated via setApConfiguration call.
162     */
163    @Test
164    public void updateApConfiguration() throws Exception {
165        /* Initialize WifiApConfigStore with default configuration. */
166        WifiApConfigStore store = new WifiApConfigStore(mContext, mApConfigFile.getPath());
167        verifyDefaultApConfig(store.getApConfiguration());
168
169        /* Update with a valid configuration. */
170        WifiConfiguration expectedConfig = setupApConfig(
171                "ConfiguredAP",    /* SSID */
172                "randomKey",       /* preshared key */
173                KeyMgmt.WPA_EAP,   /* key management */
174                1,                 /* AP band (5GHz) */
175                40                 /* AP channel */);
176        store.setApConfiguration(expectedConfig);
177        verifyApConfig(expectedConfig, store.getApConfiguration());
178    }
179}
180