blob: 060724a03b27017ed49510c1891c3e10923f02cd [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.wifi;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import android.app.test.MockAnswerUtil.AnswerWithArguments;
import android.net.IpConfiguration;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiEnterpriseConfig;
import android.test.suitebuilder.annotation.SmallTest;
import android.text.TextUtils;
import android.util.SparseArray;
import com.android.server.net.IpConfigStore;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Unit tests for {@link com.android.server.wifi.WifiConfigStoreLegacy}.
*/
@SmallTest
public class WifiConfigStoreLegacyTest {
private static final String MASKED_FIELD_VALUE = "*";
// Test mocks
@Mock private WifiSupplicantControl mWifiSupplicantControl;
@Mock private WifiNetworkHistory mWifiNetworkHistory;
@Mock private IpConfigStore mIpconfigStore;
/**
* Test instance of WifiConfigStore.
*/
private WifiConfigStoreLegacy mWifiConfigStore;
/**
* Setup the test environment.
*/
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mWifiConfigStore =
new WifiConfigStoreLegacy(
mWifiNetworkHistory, mWifiSupplicantControl, mIpconfigStore);
}
/**
* Called after each test
*/
@After
public void cleanup() {
validateMockitoUsage();
}
/**
* Verify loading of network configurations from legacy stores. This is verifying the population
* of the masked wpa_supplicant fields using wpa_supplicant.conf file.
*/
@Test
public void testLoadFromStores() {
WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
WifiConfiguration eapNetwork = WifiConfigurationTestUtil.createEapNetwork();
eapNetwork.enterpriseConfig.setPassword("EapPassword");
final List<WifiConfiguration> networks = new ArrayList<>();
networks.add(pskNetwork);
networks.add(wepNetwork);
networks.add(eapNetwork);
// Return the config data with passwords masked from wpa_supplicant control interface.
doAnswer(new AnswerWithArguments() {
public int answer(Map<String, WifiConfiguration> configs,
SparseArray<Map<String, String>> networkExtras) {
for (Map.Entry<String, WifiConfiguration> entry:
createWpaSupplicantLoadData(networks).entrySet()) {
configs.put(entry.getKey(), entry.getValue());
}
return 0;
}
}).when(mWifiSupplicantControl).loadNetworks(any(Map.class), any(SparseArray.class));
// Return the unmasked values during file parsing.
doAnswer(new AnswerWithArguments() {
public Map<String, String> answer(String fieldName) {
if (fieldName.equals(WifiConfiguration.pskVarName)) {
return createPskMap(networks);
} else if (fieldName.equals(WifiConfiguration.wepKeyVarNames[0])) {
return createWepKey0Map(networks);
} else if (fieldName.equals(WifiConfiguration.wepKeyVarNames[1])) {
return createWepKey1Map(networks);
} else if (fieldName.equals(WifiConfiguration.wepKeyVarNames[2])) {
return createWepKey2Map(networks);
} else if (fieldName.equals(WifiConfiguration.wepKeyVarNames[3])) {
return createWepKey3Map(networks);
} else if (fieldName.equals(WifiEnterpriseConfig.PASSWORD_KEY)) {
return createEapPasswordMap(networks);
}
return new HashMap<>();
}
}).when(mWifiSupplicantControl).readNetworkVariablesFromSupplicantFile(anyString());
WifiConfigStoreLegacy.WifiConfigStoreDataLegacy storeData = mWifiConfigStore.read();
WifiConfigurationTestUtil.assertConfigurationsEqualForConfigStore(
networks, storeData.getConfigurations());
}
private SparseArray<IpConfiguration> createIpConfigStoreLoadData(
List<WifiConfiguration> configurations) {
SparseArray<IpConfiguration> newIpConfigurations = new SparseArray<>();
for (WifiConfiguration config : configurations) {
newIpConfigurations.put(
config.configKey().hashCode(),
new IpConfiguration(config.getIpConfiguration()));
}
return newIpConfigurations;
}
private Map<String, String> createPskMap(List<WifiConfiguration> configurations) {
Map<String, String> pskMap = new HashMap<>();
for (WifiConfiguration config : configurations) {
if (!TextUtils.isEmpty(config.preSharedKey)) {
pskMap.put(config.configKey(), config.preSharedKey);
}
}
return pskMap;
}
private Map<String, String> createWepKey0Map(List<WifiConfiguration> configurations) {
Map<String, String> wepKeyMap = new HashMap<>();
for (WifiConfiguration config : configurations) {
if (!TextUtils.isEmpty(config.wepKeys[0])) {
wepKeyMap.put(config.configKey(), config.wepKeys[0]);
}
}
return wepKeyMap;
}
private Map<String, String> createWepKey1Map(List<WifiConfiguration> configurations) {
Map<String, String> wepKeyMap = new HashMap<>();
for (WifiConfiguration config : configurations) {
if (!TextUtils.isEmpty(config.wepKeys[1])) {
wepKeyMap.put(config.configKey(), config.wepKeys[1]);
}
}
return wepKeyMap;
}
private Map<String, String> createWepKey2Map(List<WifiConfiguration> configurations) {
Map<String, String> wepKeyMap = new HashMap<>();
for (WifiConfiguration config : configurations) {
if (!TextUtils.isEmpty(config.wepKeys[2])) {
wepKeyMap.put(config.configKey(), config.wepKeys[2]);
}
}
return wepKeyMap;
}
private Map<String, String> createWepKey3Map(List<WifiConfiguration> configurations) {
Map<String, String> wepKeyMap = new HashMap<>();
for (WifiConfiguration config : configurations) {
if (!TextUtils.isEmpty(config.wepKeys[3])) {
wepKeyMap.put(config.configKey(), config.wepKeys[3]);
}
}
return wepKeyMap;
}
private Map<String, String> createEapPasswordMap(List<WifiConfiguration> configurations) {
Map<String, String> eapPasswordMap = new HashMap<>();
for (WifiConfiguration config : configurations) {
if (!TextUtils.isEmpty(config.enterpriseConfig.getPassword())) {
eapPasswordMap.put(config.configKey(), config.enterpriseConfig.getPassword());
}
}
return eapPasswordMap;
}
private Map<String, WifiConfiguration> createWpaSupplicantLoadData(
List<WifiConfiguration> configurations) {
List<WifiConfiguration> newConfigurations = createMaskedWifiConfigurations(configurations);
Map<String, WifiConfiguration> configurationMap = new HashMap<>();
for (WifiConfiguration config : newConfigurations) {
configurationMap.put(config.configKey(true), config);
}
return configurationMap;
}
private List<WifiConfiguration> createMaskedWifiConfigurations(
List<WifiConfiguration> configurations) {
List<WifiConfiguration> newConfigurations = new ArrayList<>();
for (WifiConfiguration config : configurations) {
newConfigurations.add(createMaskedWifiConfiguration(config));
}
return newConfigurations;
}
private WifiConfiguration createMaskedWifiConfiguration(WifiConfiguration configuration) {
WifiConfiguration newConfig = new WifiConfiguration(configuration);
if (!TextUtils.isEmpty(configuration.preSharedKey)) {
newConfig.preSharedKey = MASKED_FIELD_VALUE;
}
if (!TextUtils.isEmpty(configuration.wepKeys[0])) {
newConfig.wepKeys[0] = MASKED_FIELD_VALUE;
}
if (!TextUtils.isEmpty(configuration.wepKeys[1])) {
newConfig.wepKeys[1] = MASKED_FIELD_VALUE;
}
if (!TextUtils.isEmpty(configuration.wepKeys[2])) {
newConfig.wepKeys[2] = MASKED_FIELD_VALUE;
}
if (!TextUtils.isEmpty(configuration.wepKeys[3])) {
newConfig.wepKeys[3] = MASKED_FIELD_VALUE;
}
if (!TextUtils.isEmpty(configuration.enterpriseConfig.getPassword())) {
newConfig.enterpriseConfig.setPassword(MASKED_FIELD_VALUE);
}
return newConfig;
}
}