blob: 7b0044a740b64a42c33eeb320cc0173f9057bb9b [file] [log] [blame]
/*
* Copyright (C) 2019 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.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.net.MacAddress;
import android.net.wifi.SoftApConfiguration;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiMigration;
import android.util.SparseIntArray;
import android.util.Xml;
import androidx.test.filters.SmallTest;
import com.android.internal.util.FastXmlSerializer;
import com.android.modules.utils.build.SdkLevel;
import com.android.server.wifi.util.SettingsMigrationDataHolder;
import com.android.server.wifi.util.WifiConfigStoreEncryptionUtil;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
/**
* Unit tests for {@link com.android.server.wifi.SoftApStoreData}.
*/
@SmallTest
public class SoftApStoreDataTest extends WifiBaseTest {
private static final String TEST_SSID = "SSID";
private static final String TEST_BSSID = "aa:22:33:aa:bb:cc";
private static final String TEST_PASSPHRASE = "TestPassphrase";
private static final String TEST_WPA2_PASSPHRASE = "Wpa2Test";
private static final int TEST_CHANNEL = 0;
private static final int TEST_CHANNEL_2G = 1;
private static final int TEST_CHANNEL_5G = 149;
private static final boolean TEST_HIDDEN = false;
private static final int TEST_BAND = SoftApConfiguration.BAND_2GHZ
| SoftApConfiguration.BAND_5GHZ;
private static final int TEST_BAND_2G = SoftApConfiguration.BAND_2GHZ;
private static final int TEST_BAND_5G = SoftApConfiguration.BAND_5GHZ;
private static final int TEST_OLD_BAND = WifiConfiguration.AP_BAND_ANY;
private static final int TEST_SECURITY = SoftApConfiguration.SECURITY_TYPE_WPA2_PSK;
private static final boolean TEST_CLIENT_CONTROL_BY_USER = false;
private static final boolean TEST_AUTO_SHUTDOWN_ENABLED = true;
private static final int TEST_MAX_NUMBER_OF_CLIENTS = 10;
private static final long TEST_SHUTDOWN_TIMEOUT_MILLIS = 600_000;
private static final ArrayList<MacAddress> TEST_BLOCKEDLIST = new ArrayList<>();
private static final String TEST_BLOCKED_CLIENT = "11:22:33:44:55:66";
private static final ArrayList<MacAddress> TEST_ALLOWEDLIST = new ArrayList<>();
private static final String TEST_ALLOWED_CLIENT = "aa:bb:cc:dd:ee:ff";
private static final boolean TEST_BRIDGED_OPPORTUNISTIC_SHUTDOWN_ENABLED = false;
private static final int TEST_MAC_RANDOMIZATIONSETTING =
SoftApConfiguration.RANDOMIZATION_NONE;
private static final SparseIntArray TEST_CHANNELS = new SparseIntArray() {{
put(TEST_BAND_2G, TEST_CHANNEL_2G);
put(TEST_BAND_5G, TEST_CHANNEL_5G);
}};
private static final SparseIntArray TEST_CHANNELS_IN_R_CONFIG = new SparseIntArray() {{
put(TEST_BAND, TEST_CHANNEL);
}};
private static final boolean TEST_80211AX_ENABLED = false;
private static final boolean TEST_USER_CONFIGURATION = false;
private static final String TEST_CONFIG_STRING_FROM_WIFICONFIGURATION =
"<string name=\"SSID\">" + TEST_SSID + "</string>\n"
+ "<int name=\"Band\" value=\"" + TEST_OLD_BAND + "\" />\n"
+ "<int name=\"Channel\" value=\"" + TEST_CHANNEL + "\" />\n"
+ "<boolean name=\"HiddenSSID\" value=\"" + TEST_HIDDEN + "\" />\n"
+ "<int name=\"SecurityType\" value=\"" + TEST_SECURITY + "\" />\n"
+ "<string name=\"Wpa2Passphrase\">" + TEST_WPA2_PASSPHRASE + "</string>\n";
private static final String TEST_CONFIG_STRING_WITH_NEW_BAND_DESIGN_IN_R =
"<string name=\"SSID\">" + TEST_SSID + "</string>\n"
+ "<int name=\"ApBand\" value=\"" + TEST_BAND + "\" />\n"
+ "<int name=\"Channel\" value=\"" + TEST_CHANNEL + "\" />\n"
+ "<boolean name=\"HiddenSSID\" value=\"" + TEST_HIDDEN + "\" />\n"
+ "<int name=\"SecurityType\" value=\"" + TEST_SECURITY + "\" />\n"
+ "<string name=\"Passphrase\">" + TEST_PASSPHRASE + "</string>\n";
private static final String TEST_CONFIG_STRING_WITH_ALL_CONFIG_IN_R =
"<string name=\"SSID\">" + TEST_SSID + "</string>\n"
+ "<string name=\"Bssid\">" + TEST_BSSID + "</string>\n"
+ "<int name=\"ApBand\" value=\"" + TEST_BAND + "\" />\n"
+ "<int name=\"Channel\" value=\"" + TEST_CHANNEL + "\" />\n"
+ "<boolean name=\"HiddenSSID\" value=\"" + TEST_HIDDEN + "\" />\n"
+ "<int name=\"SecurityType\" value=\"" + TEST_SECURITY + "\" />\n"
+ "<string name=\"Passphrase\">" + TEST_PASSPHRASE + "</string>\n"
+ "<int name=\"MaxNumberOfClients\" value=\""
+ TEST_MAX_NUMBER_OF_CLIENTS + "\" />\n"
+ "<boolean name=\"ClientControlByUser\" value=\""
+ TEST_CLIENT_CONTROL_BY_USER + "\" />\n"
+ "<boolean name=\"AutoShutdownEnabled\" value=\""
+ TEST_AUTO_SHUTDOWN_ENABLED + "\" />\n"
+ "<long name=\"ShutdownTimeoutMillis\" value=\""
+ TEST_SHUTDOWN_TIMEOUT_MILLIS + "\" />\n"
+ "<BlockedClientList>\n"
+ "<string name=\"ClientMacAddress\">" + TEST_BLOCKED_CLIENT + "</string>\n"
+ "</BlockedClientList>\n"
+ "<AllowedClientList>\n"
+ "<string name=\"ClientMacAddress\">" + TEST_ALLOWED_CLIENT + "</string>\n"
+ "</AllowedClientList>\n";
private static final String TEST_CONFIG_STRING_WITH_ALL_CONFIG_IN_R_EXCEPT_AUTO_SHUTDOWN =
"<string name=\"SSID\">" + TEST_SSID + "</string>\n"
+ "<int name=\"ApBand\" value=\"" + TEST_BAND + "\" />\n"
+ "<int name=\"Channel\" value=\"" + TEST_CHANNEL + "\" />\n"
+ "<boolean name=\"HiddenSSID\" value=\"" + TEST_HIDDEN + "\" />\n"
+ "<int name=\"SecurityType\" value=\"" + TEST_SECURITY + "\" />\n"
+ "<string name=\"Passphrase\">" + TEST_PASSPHRASE + "</string>\n"
+ "<int name=\"MaxNumberOfClients\" value=\""
+ TEST_MAX_NUMBER_OF_CLIENTS + "\" />\n"
+ "<boolean name=\"ClientControlByUser\" value=\""
+ TEST_CLIENT_CONTROL_BY_USER + "\" />\n"
+ "<long name=\"ShutdownTimeoutMillis\" value=\""
+ TEST_SHUTDOWN_TIMEOUT_MILLIS + "\" />\n"
+ "<BlockedClientList>\n"
+ "<string name=\"ClientMacAddress\">" + TEST_BLOCKED_CLIENT + "</string>\n"
+ "</BlockedClientList>\n"
+ "<AllowedClientList>\n"
+ "<string name=\"ClientMacAddress\">" + TEST_ALLOWED_CLIENT + "</string>\n"
+ "</AllowedClientList>\n";
private static final String TEST_CONFIG_STRING_WITH_INT_TYPE_SHUTDOWNTIMOUTMILLIS =
"<string name=\"SSID\">" + TEST_SSID + "</string>\n"
+ "<int name=\"ApBand\" value=\"" + TEST_BAND + "\" />\n"
+ "<int name=\"Channel\" value=\"" + TEST_CHANNEL + "\" />\n"
+ "<boolean name=\"HiddenSSID\" value=\"" + TEST_HIDDEN + "\" />\n"
+ "<int name=\"SecurityType\" value=\"" + TEST_SECURITY + "\" />\n"
+ "<string name=\"Passphrase\">" + TEST_PASSPHRASE + "</string>\n"
+ "<int name=\"MaxNumberOfClients\" value=\""
+ TEST_MAX_NUMBER_OF_CLIENTS + "\" />\n"
+ "<boolean name=\"ClientControlByUser\" value=\""
+ TEST_CLIENT_CONTROL_BY_USER + "\" />\n"
+ "<boolean name=\"AutoShutdownEnabled\" value=\""
+ TEST_AUTO_SHUTDOWN_ENABLED + "\" />\n"
+ "<int name=\"ShutdownTimeoutMillis\" value=\""
+ TEST_SHUTDOWN_TIMEOUT_MILLIS + "\" />\n"
+ "<BlockedClientList>\n"
+ "<string name=\"ClientMacAddress\">" + TEST_BLOCKED_CLIENT + "</string>\n"
+ "</BlockedClientList>\n"
+ "<AllowedClientList>\n"
+ "<string name=\"ClientMacAddress\">" + TEST_ALLOWED_CLIENT + "</string>\n"
+ "</AllowedClientList>\n";
private static final String TEST_CONFIG_STRING_WITH_ALL_CONFIG_IN_R_EXCEPT_BSSID =
"<string name=\"SSID\">" + TEST_SSID + "</string>\n"
+ "<int name=\"ApBand\" value=\"" + TEST_BAND + "\" />\n"
+ "<int name=\"Channel\" value=\"" + TEST_CHANNEL + "\" />\n"
+ "<boolean name=\"HiddenSSID\" value=\"" + TEST_HIDDEN + "\" />\n"
+ "<int name=\"SecurityType\" value=\"" + TEST_SECURITY + "\" />\n"
+ "<string name=\"Passphrase\">" + TEST_PASSPHRASE + "</string>\n"
+ "<int name=\"MaxNumberOfClients\" value=\""
+ TEST_MAX_NUMBER_OF_CLIENTS + "\" />\n"
+ "<boolean name=\"ClientControlByUser\" value=\""
+ TEST_CLIENT_CONTROL_BY_USER + "\" />\n"
+ "<boolean name=\"AutoShutdownEnabled\" value=\""
+ TEST_AUTO_SHUTDOWN_ENABLED + "\" />\n"
+ "<int name=\"ShutdownTimeoutMillis\" value=\""
+ TEST_SHUTDOWN_TIMEOUT_MILLIS + "\" />\n"
+ "<BlockedClientList>\n"
+ "<string name=\"ClientMacAddress\">" + TEST_BLOCKED_CLIENT + "</string>\n"
+ "</BlockedClientList>\n"
+ "<AllowedClientList>\n"
+ "<string name=\"ClientMacAddress\">" + TEST_ALLOWED_CLIENT + "</string>\n"
+ "</AllowedClientList>\n";
private static final String TEST_CONFIG_STRING_WITH_ALL_CONFIG_IN_S_EXCEPT_USER_CONFIGURATION =
"<string name=\"SSID\">" + TEST_SSID + "</string>\n"
+ "<string name=\"Bssid\">" + TEST_BSSID + "</string>\n"
+ "<boolean name=\"HiddenSSID\" value=\"" + TEST_HIDDEN + "\" />\n"
+ "<int name=\"SecurityType\" value=\"" + TEST_SECURITY + "\" />\n"
+ "<string name=\"Passphrase\">" + TEST_PASSPHRASE + "</string>\n"
+ "<int name=\"MaxNumberOfClients\" value=\""
+ TEST_MAX_NUMBER_OF_CLIENTS + "\" />\n"
+ "<boolean name=\"ClientControlByUser\" value=\""
+ TEST_CLIENT_CONTROL_BY_USER + "\" />\n"
+ "<boolean name=\"AutoShutdownEnabled\" value=\""
+ TEST_AUTO_SHUTDOWN_ENABLED + "\" />\n"
+ "<long name=\"ShutdownTimeoutMillis\" value=\""
+ TEST_SHUTDOWN_TIMEOUT_MILLIS + "\" />\n"
+ "<BlockedClientList>\n"
+ "<string name=\"ClientMacAddress\">" + TEST_BLOCKED_CLIENT + "</string>\n"
+ "</BlockedClientList>\n"
+ "<AllowedClientList>\n"
+ "<string name=\"ClientMacAddress\">" + TEST_ALLOWED_CLIENT + "</string>\n"
+ "</AllowedClientList>\n"
+ "<boolean name=\"BridgedModeOpportunisticShutdownEnabled\" value=\""
+ TEST_BRIDGED_OPPORTUNISTIC_SHUTDOWN_ENABLED + "\" />\n"
+ "<int name=\"MacRandomizationSetting\" value=\""
+ TEST_MAC_RANDOMIZATIONSETTING + "\" />\n"
+ "<BandChannelMap>\n"
+ "<BandChannel>\n"
+ "<int name=\"Band\" value=\"" + TEST_BAND_2G + "\" />\n"
+ "<int name=\"Channel\" value=\"" + TEST_CHANNEL_2G + "\" />\n"
+ "</BandChannel>\n"
+ "<BandChannel>\n"
+ "<int name=\"Band\" value=\"" + TEST_BAND_5G + "\" />\n"
+ "<int name=\"Channel\" value=\"" + TEST_CHANNEL_5G + "\" />\n"
+ "</BandChannel>\n"
+ "</BandChannelMap>\n"
+ "<boolean name=\"80211axEnabled\" value=\""
+ TEST_80211AX_ENABLED + "\" />\n";
private static final String TEST_CONFIG_STRING_WITH_ALL_CONFIG_LAST_VERSION =
TEST_CONFIG_STRING_WITH_ALL_CONFIG_IN_S_EXCEPT_USER_CONFIGURATION
+ "<boolean name=\"UserConfiguration\" value=\""
+ TEST_USER_CONFIGURATION + "\" />\n";
@Mock private Context mContext;
@Mock SoftApStoreData.DataSource mDataSource;
@Mock private WifiMigration.SettingsMigrationData mOemMigrationData;
@Mock private SettingsMigrationDataHolder mSettingsMigrationDataHolder;
SoftApStoreData mSoftApStoreData;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
when(mSettingsMigrationDataHolder.retrieveData())
.thenReturn(mOemMigrationData);
when(mOemMigrationData.isSoftApTimeoutEnabled()).thenReturn(true);
mSoftApStoreData = new SoftApStoreData(mContext, mSettingsMigrationDataHolder, mDataSource);
TEST_BLOCKEDLIST.add(MacAddress.fromString(TEST_BLOCKED_CLIENT));
TEST_ALLOWEDLIST.add(MacAddress.fromString(TEST_ALLOWED_CLIENT));
}
/**
* Called after each test
*/
@After
public void cleanup() {
TEST_BLOCKEDLIST.clear();
TEST_ALLOWEDLIST.clear();
}
/**
* Helper function for serializing configuration data to a XML block.
*
* @return byte[] of the XML data
* @throws Exception
*/
private byte[] serializeData() throws Exception {
final XmlSerializer out = new FastXmlSerializer();
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
out.setOutput(outputStream, StandardCharsets.UTF_8.name());
mSoftApStoreData.serializeData(out, mock(WifiConfigStoreEncryptionUtil.class));
out.flush();
return outputStream.toByteArray();
}
/**
* Helper function for parsing configuration data from a XML block.
*
* @param data XML data to parse from
* @throws Exception
*/
private void deserializeData(byte[] data) throws Exception {
final XmlPullParser in = Xml.newPullParser();
final ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
in.setInput(inputStream, StandardCharsets.UTF_8.name());
mSoftApStoreData.deserializeData(in, in.getDepth(),
WifiConfigStore.ENCRYPT_CREDENTIALS_CONFIG_STORE_DATA_VERSION,
mock(WifiConfigStoreEncryptionUtil.class));
}
/**
* Verify that parsing an empty data doesn't cause any crash and no configuration should
* be deserialized.
*
* @throws Exception
*/
@Test
public void deserializeEmptyStoreData() throws Exception {
deserializeData(new byte[0]);
verify(mDataSource, never()).fromDeserialized(any());
}
/**
* Verify that SoftApStoreData is written to
* {@link WifiConfigStore#STORE_FILE_SHARED_SOFTAP}.
*
* @throws Exception
*/
@Test
public void getUserStoreFileId() throws Exception {
assertEquals(WifiConfigStore.STORE_FILE_SHARED_SOFTAP,
mSoftApStoreData.getStoreFileId());
}
/**
* Verify that the store data is serialized correctly, matches the predefined test XML data.
*
* @throws Exception
*/
@Test
public void serializeSoftAp() throws Exception {
SoftApConfiguration.Builder softApConfigBuilder = new SoftApConfiguration.Builder();
softApConfigBuilder.setSsid(TEST_SSID);
softApConfigBuilder.setBssid(MacAddress.fromString(TEST_BSSID));
softApConfigBuilder.setPassphrase(TEST_PASSPHRASE,
SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
if (SdkLevel.isAtLeastS()) {
softApConfigBuilder.setChannels(TEST_CHANNELS);
} else {
softApConfigBuilder.setBand(TEST_BAND);
}
softApConfigBuilder.setClientControlByUserEnabled(TEST_CLIENT_CONTROL_BY_USER);
softApConfigBuilder.setMaxNumberOfClients(TEST_MAX_NUMBER_OF_CLIENTS);
softApConfigBuilder.setAutoShutdownEnabled(true);
softApConfigBuilder.setShutdownTimeoutMillis(TEST_SHUTDOWN_TIMEOUT_MILLIS);
softApConfigBuilder.setAllowedClientList(TEST_ALLOWEDLIST);
softApConfigBuilder.setBlockedClientList(TEST_BLOCKEDLIST);
if (SdkLevel.isAtLeastS()) {
softApConfigBuilder.setMacRandomizationSetting(TEST_MAC_RANDOMIZATIONSETTING);
softApConfigBuilder.setBridgedModeOpportunisticShutdownEnabled(
TEST_BRIDGED_OPPORTUNISTIC_SHUTDOWN_ENABLED);
softApConfigBuilder.setIeee80211axEnabled(TEST_80211AX_ENABLED);
softApConfigBuilder.setUserConfiguration(TEST_USER_CONFIGURATION);
}
when(mDataSource.toSerialize()).thenReturn(softApConfigBuilder.build());
byte[] actualData = serializeData();
if (SdkLevel.isAtLeastS()) {
assertEquals(TEST_CONFIG_STRING_WITH_ALL_CONFIG_LAST_VERSION, new String(actualData));
} else {
assertEquals(TEST_CONFIG_STRING_WITH_ALL_CONFIG_IN_R, new String(actualData));
}
}
/**
* Verify that the store data is deserialized correctly using the predefined test XML data.
*
* @throws Exception
*/
@Test
public void deserializeSoftAp() throws Exception {
if (SdkLevel.isAtLeastS()) {
deserializeData(TEST_CONFIG_STRING_WITH_ALL_CONFIG_LAST_VERSION.getBytes());
} else {
deserializeData(TEST_CONFIG_STRING_WITH_ALL_CONFIG_IN_R.getBytes());
}
ArgumentCaptor<SoftApConfiguration> softapConfigCaptor =
ArgumentCaptor.forClass(SoftApConfiguration.class);
verify(mDataSource).fromDeserialized(softapConfigCaptor.capture());
SoftApConfiguration softApConfig = softapConfigCaptor.getValue();
assertNotNull(softApConfig);
assertEquals(softApConfig.getSsid(), TEST_SSID);
assertEquals(softApConfig.getBssid().toString(), TEST_BSSID);
assertEquals(softApConfig.getPassphrase(), TEST_PASSPHRASE);
assertEquals(softApConfig.getSecurityType(), SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
assertEquals(softApConfig.isHiddenSsid(), TEST_HIDDEN);
if (SdkLevel.isAtLeastS()) {
assertEquals(softApConfig.getBand(), TEST_BAND_2G);
assertEquals(softApConfig.getChannel(), TEST_CHANNEL_2G);
} else {
assertEquals(softApConfig.getBand(), TEST_BAND);
assertEquals(softApConfig.getChannel(), TEST_CHANNEL);
}
assertEquals(softApConfig.isClientControlByUserEnabled(), TEST_CLIENT_CONTROL_BY_USER);
assertEquals(softApConfig.getMaxNumberOfClients(), TEST_MAX_NUMBER_OF_CLIENTS);
assertTrue(softApConfig.isAutoShutdownEnabled());
assertEquals(softApConfig.getShutdownTimeoutMillis(), TEST_SHUTDOWN_TIMEOUT_MILLIS);
assertEquals(softApConfig.getBlockedClientList(), TEST_BLOCKEDLIST);
assertEquals(softApConfig.getAllowedClientList(), TEST_ALLOWEDLIST);
if (SdkLevel.isAtLeastS()) {
assertEquals(softApConfig.getChannels().toString(), TEST_CHANNELS.toString());
assertEquals(softApConfig.getMacRandomizationSetting(), TEST_MAC_RANDOMIZATIONSETTING);
assertEquals(softApConfig.isBridgedModeOpportunisticShutdownEnabled(),
TEST_BRIDGED_OPPORTUNISTIC_SHUTDOWN_ENABLED);
assertEquals(softApConfig.isIeee80211axEnabled(), TEST_80211AX_ENABLED);
assertEquals(softApConfig.isUserConfiguration(), TEST_USER_CONFIGURATION);
}
}
/**
* Verify that the store data is deserialized correctly using the predefined test XML data.
*
* @throws Exception
*/
@Test
public void deserializeOldSoftApXMLWhichShutdownTimeoutIsInt() throws Exception {
deserializeData(TEST_CONFIG_STRING_WITH_INT_TYPE_SHUTDOWNTIMOUTMILLIS
.getBytes());
ArgumentCaptor<SoftApConfiguration> softapConfigCaptor =
ArgumentCaptor.forClass(SoftApConfiguration.class);
verify(mDataSource).fromDeserialized(softapConfigCaptor.capture());
SoftApConfiguration softApConfig = softapConfigCaptor.getValue();
assertNotNull(softApConfig);
assertEquals(softApConfig.getSsid(), TEST_SSID);
assertEquals(softApConfig.getPassphrase(), TEST_PASSPHRASE);
assertEquals(softApConfig.getSecurityType(), SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
assertEquals(softApConfig.isHiddenSsid(), TEST_HIDDEN);
assertEquals(softApConfig.getBand(), TEST_BAND);
assertEquals(softApConfig.isClientControlByUserEnabled(), TEST_CLIENT_CONTROL_BY_USER);
assertEquals(softApConfig.getMaxNumberOfClients(), TEST_MAX_NUMBER_OF_CLIENTS);
assertTrue(softApConfig.isAutoShutdownEnabled());
assertEquals(softApConfig.getShutdownTimeoutMillis(), TEST_SHUTDOWN_TIMEOUT_MILLIS);
assertEquals(softApConfig.getBlockedClientList(), TEST_BLOCKEDLIST);
assertEquals(softApConfig.getAllowedClientList(), TEST_ALLOWEDLIST);
}
/**
* Verify that the old format is deserialized correctly.
*
* @throws Exception
*/
@Test
public void deserializeOldBandSoftAp() throws Exception {
// Start with the old serialized data
deserializeData(TEST_CONFIG_STRING_FROM_WIFICONFIGURATION.getBytes());
ArgumentCaptor<SoftApConfiguration> softapConfigCaptor =
ArgumentCaptor.forClass(SoftApConfiguration.class);
verify(mDataSource).fromDeserialized(softapConfigCaptor.capture());
SoftApConfiguration softApConfig = softapConfigCaptor.getValue();
assertNotNull(softApConfig);
assertEquals(softApConfig.getSsid(), TEST_SSID);
assertEquals(softApConfig.getPassphrase(), TEST_WPA2_PASSPHRASE);
assertEquals(softApConfig.getSecurityType(), SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
assertEquals(softApConfig.isHiddenSsid(), TEST_HIDDEN);
assertEquals(softApConfig.getBand(), TEST_BAND);
}
/**
* Verify that the old format is deserialized correctly.
*
* @throws Exception
*/
@Test
public void deserializeNewBandSoftApButNoNewConfig() throws Exception {
// Start with the old serialized data
deserializeData(TEST_CONFIG_STRING_WITH_NEW_BAND_DESIGN_IN_R.getBytes());
ArgumentCaptor<SoftApConfiguration> softapConfigCaptor =
ArgumentCaptor.forClass(SoftApConfiguration.class);
verify(mDataSource).fromDeserialized(softapConfigCaptor.capture());
SoftApConfiguration softApConfig = softapConfigCaptor.getValue();
assertNotNull(softApConfig);
assertEquals(softApConfig.getSsid(), TEST_SSID);
assertEquals(softApConfig.getPassphrase(), TEST_PASSPHRASE);
assertEquals(softApConfig.getSecurityType(), SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
assertEquals(softApConfig.isHiddenSsid(), TEST_HIDDEN);
assertEquals(softApConfig.getBand(), TEST_BAND);
}
/**
* Verify that the store data is serialized/deserialized correctly.
*
* @throws Exception
*/
@Test
public void serializeDeserializeSoftAp() throws Exception {
SoftApConfiguration.Builder softApConfigBuilder = new SoftApConfiguration.Builder();
softApConfigBuilder.setSsid(TEST_SSID);
softApConfigBuilder.setPassphrase(TEST_PASSPHRASE,
SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
softApConfigBuilder.setBand(TEST_BAND);
SoftApConfiguration softApConfig = softApConfigBuilder.build();
// Serialize first.
when(mDataSource.toSerialize()).thenReturn(softApConfigBuilder.build());
byte[] serializedData = serializeData();
// Now deserialize first.
deserializeData(serializedData);
ArgumentCaptor<SoftApConfiguration> softapConfigCaptor =
ArgumentCaptor.forClass(SoftApConfiguration.class);
verify(mDataSource).fromDeserialized(softapConfigCaptor.capture());
SoftApConfiguration softApConfigDeserialized = softapConfigCaptor.getValue();
assertNotNull(softApConfigDeserialized);
assertEquals(softApConfig.getSsid(), softApConfigDeserialized.getSsid());
assertEquals(softApConfig.getPassphrase(),
softApConfigDeserialized.getPassphrase());
assertEquals(softApConfig.getSecurityType(),
softApConfigDeserialized.getSecurityType());
assertEquals(softApConfig.isHiddenSsid(), softApConfigDeserialized.isHiddenSsid());
assertEquals(softApConfig.getBand(), softApConfigDeserialized.getBand());
assertEquals(softApConfig.getChannel(), softApConfigDeserialized.getChannel());
}
/**
* Verify that the stored wpa3-sae data is serialized/deserialized correctly.
*
* @throws Exception
*/
@Test
public void serializeDeserializeSoftApWpa3Sae() throws Exception {
SoftApConfiguration.Builder softApConfigBuilder = new SoftApConfiguration.Builder();
softApConfigBuilder.setSsid(TEST_SSID);
softApConfigBuilder.setPassphrase(TEST_PASSPHRASE,
SoftApConfiguration.SECURITY_TYPE_WPA3_SAE);
softApConfigBuilder.setBand(TEST_BAND);
SoftApConfiguration softApConfig = softApConfigBuilder.build();
// Serialize first.
when(mDataSource.toSerialize()).thenReturn(softApConfigBuilder.build());
byte[] serializedData = serializeData();
// Now deserialize first.
deserializeData(serializedData);
ArgumentCaptor<SoftApConfiguration> softapConfigCaptor =
ArgumentCaptor.forClass(SoftApConfiguration.class);
verify(mDataSource).fromDeserialized(softapConfigCaptor.capture());
SoftApConfiguration softApConfigDeserialized = softapConfigCaptor.getValue();
assertNotNull(softApConfigDeserialized);
assertEquals(softApConfig.getSsid(), softApConfigDeserialized.getSsid());
assertEquals(softApConfig.getPassphrase(),
softApConfigDeserialized.getPassphrase());
assertEquals(softApConfig.getSecurityType(),
softApConfigDeserialized.getSecurityType());
assertEquals(softApConfig.isHiddenSsid(), softApConfigDeserialized.isHiddenSsid());
assertEquals(softApConfig.getBand(), softApConfigDeserialized.getBand());
assertEquals(softApConfig.getChannel(), softApConfigDeserialized.getChannel());
}
/**
* Verify that the stored wpa3-sae-transition data is serialized/deserialized correctly.
*
* @throws Exception
*/
@Test
public void serializeDeserializeSoftApWpa3SaeTransition() throws Exception {
SoftApConfiguration.Builder softApConfigBuilder = new SoftApConfiguration.Builder();
softApConfigBuilder.setSsid(TEST_SSID);
softApConfigBuilder.setPassphrase(TEST_PASSPHRASE,
SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION);
softApConfigBuilder.setBand(TEST_BAND);
SoftApConfiguration softApConfig = softApConfigBuilder.build();
// Serialize first.
when(mDataSource.toSerialize()).thenReturn(softApConfigBuilder.build());
byte[] serializedData = serializeData();
// Now deserialize first.
deserializeData(serializedData);
ArgumentCaptor<SoftApConfiguration> softapConfigCaptor =
ArgumentCaptor.forClass(SoftApConfiguration.class);
verify(mDataSource).fromDeserialized(softapConfigCaptor.capture());
SoftApConfiguration softApConfigDeserialized = softapConfigCaptor.getValue();
assertNotNull(softApConfigDeserialized);
assertEquals(softApConfig.getSsid(), softApConfigDeserialized.getSsid());
assertEquals(softApConfig.getPassphrase(),
softApConfigDeserialized.getPassphrase());
assertEquals(softApConfig.getSecurityType(),
softApConfigDeserialized.getSecurityType());
assertEquals(softApConfig.isHiddenSsid(), softApConfigDeserialized.isHiddenSsid());
assertEquals(softApConfig.getBand(), softApConfigDeserialized.getBand());
assertEquals(softApConfig.getChannel(), softApConfigDeserialized.getChannel());
}
/**
* Verify that the store data is deserialized correctly using the predefined test XML data
* when the auto shutdown tag is retrieved from
* {@link WifiMigration.loadFromSettings(Context)}.
*
* @throws Exception
*/
@Test
public void deserializeSoftApWithNoAutoShutdownTag() throws Exception {
// Toggle on when migrating.
when(mOemMigrationData.isSoftApTimeoutEnabled()).thenReturn(true);
deserializeData(
TEST_CONFIG_STRING_WITH_ALL_CONFIG_IN_R_EXCEPT_AUTO_SHUTDOWN.getBytes());
ArgumentCaptor<SoftApConfiguration> softapConfigCaptor =
ArgumentCaptor.forClass(SoftApConfiguration.class);
verify(mDataSource).fromDeserialized(softapConfigCaptor.capture());
SoftApConfiguration softApConfig = softapConfigCaptor.getValue();
assertNotNull(softApConfig);
assertEquals(softApConfig.getSsid(), TEST_SSID);
assertTrue(softApConfig.isAutoShutdownEnabled());
// Toggle off when migrating.
when(mOemMigrationData.isSoftApTimeoutEnabled()).thenReturn(false);
deserializeData(
TEST_CONFIG_STRING_WITH_ALL_CONFIG_IN_R_EXCEPT_AUTO_SHUTDOWN.getBytes());
verify(mDataSource, times(2)).fromDeserialized(softapConfigCaptor.capture());
softApConfig = softapConfigCaptor.getValue();
assertNotNull(softApConfig);
assertEquals(softApConfig.getSsid(), TEST_SSID);
assertFalse(softApConfig.isAutoShutdownEnabled());
}
/**
* Verify that the old format is deserialized correctly.
*
* @throws Exception
*/
@Test
public void deserializeSoftApWithNoBssidTag() throws Exception {
// Start with the old serialized data
deserializeData(TEST_CONFIG_STRING_WITH_ALL_CONFIG_IN_R_EXCEPT_BSSID
.getBytes());
ArgumentCaptor<SoftApConfiguration> softapConfigCaptor =
ArgumentCaptor.forClass(SoftApConfiguration.class);
verify(mDataSource).fromDeserialized(softapConfigCaptor.capture());
SoftApConfiguration softApConfig = softapConfigCaptor.getValue();
assertNotNull(softApConfig);
assertEquals(softApConfig.getSsid(), TEST_SSID);
assertEquals(softApConfig.getPassphrase(), TEST_PASSPHRASE);
assertEquals(softApConfig.getSecurityType(), SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
assertEquals(softApConfig.isHiddenSsid(), TEST_HIDDEN);
assertEquals(softApConfig.getBand(), TEST_BAND);
assertEquals(softApConfig.isClientControlByUserEnabled(), TEST_CLIENT_CONTROL_BY_USER);
assertEquals(softApConfig.getMaxNumberOfClients(), TEST_MAX_NUMBER_OF_CLIENTS);
assertTrue(softApConfig.isAutoShutdownEnabled());
assertEquals(softApConfig.getShutdownTimeoutMillis(), TEST_SHUTDOWN_TIMEOUT_MILLIS);
assertEquals(softApConfig.getBlockedClientList(), TEST_BLOCKEDLIST);
assertEquals(softApConfig.getAllowedClientList(), TEST_ALLOWEDLIST);
}
/**
* Verify that the old format is deserialized correctly.
*
* @throws Exception
*/
@Test
public void deserializeSoftApWithAllConfigInR() throws Exception {
// Start with the old serialized data
deserializeData(TEST_CONFIG_STRING_WITH_ALL_CONFIG_IN_R
.getBytes());
ArgumentCaptor<SoftApConfiguration> softapConfigCaptor =
ArgumentCaptor.forClass(SoftApConfiguration.class);
verify(mDataSource).fromDeserialized(softapConfigCaptor.capture());
SoftApConfiguration softApConfig = softapConfigCaptor.getValue();
assertNotNull(softApConfig);
assertEquals(softApConfig.getSsid(), TEST_SSID);
assertEquals(softApConfig.getBssid().toString(), TEST_BSSID);
assertEquals(softApConfig.getPassphrase(), TEST_PASSPHRASE);
assertEquals(softApConfig.getSecurityType(), SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
assertEquals(softApConfig.isHiddenSsid(), TEST_HIDDEN);
assertEquals(softApConfig.getBand(), TEST_BAND);
assertEquals(softApConfig.isClientControlByUserEnabled(), TEST_CLIENT_CONTROL_BY_USER);
assertEquals(softApConfig.getMaxNumberOfClients(), TEST_MAX_NUMBER_OF_CLIENTS);
assertTrue(softApConfig.isAutoShutdownEnabled());
assertEquals(softApConfig.getShutdownTimeoutMillis(), TEST_SHUTDOWN_TIMEOUT_MILLIS);
assertEquals(softApConfig.getBlockedClientList(), TEST_BLOCKEDLIST);
assertEquals(softApConfig.getAllowedClientList(), TEST_ALLOWEDLIST);
if (SdkLevel.isAtLeastS()) {
assertEquals(softApConfig.getChannels().toString(),
TEST_CHANNELS_IN_R_CONFIG.toString());
}
}
/**
* Verify that the old format is deserialized correctly.
*
* @throws Exception
*/
@Test
public void deserializeSoftApWithAllConfigInSExceptUserConfiguration() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
// Start with the old serialized data
deserializeData(TEST_CONFIG_STRING_WITH_ALL_CONFIG_IN_S_EXCEPT_USER_CONFIGURATION
.getBytes());
ArgumentCaptor<SoftApConfiguration> softapConfigCaptor =
ArgumentCaptor.forClass(SoftApConfiguration.class);
verify(mDataSource).fromDeserialized(softapConfigCaptor.capture());
SoftApConfiguration softApConfig = softapConfigCaptor.getValue();
assertNotNull(softApConfig);
assertEquals(softApConfig.getSsid(), TEST_SSID);
assertEquals(softApConfig.getBssid().toString(), TEST_BSSID);
assertEquals(softApConfig.getPassphrase(), TEST_PASSPHRASE);
assertEquals(softApConfig.getSecurityType(), SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
assertEquals(softApConfig.isHiddenSsid(), TEST_HIDDEN);
assertEquals(softApConfig.getBand(), TEST_BAND_2G);
assertEquals(softApConfig.getChannel(), TEST_CHANNEL_2G);
assertEquals(softApConfig.getChannels().toString(), TEST_CHANNELS.toString());
assertEquals(softApConfig.isClientControlByUserEnabled(), TEST_CLIENT_CONTROL_BY_USER);
assertEquals(softApConfig.getMaxNumberOfClients(), TEST_MAX_NUMBER_OF_CLIENTS);
assertTrue(softApConfig.isAutoShutdownEnabled());
assertEquals(softApConfig.getShutdownTimeoutMillis(), TEST_SHUTDOWN_TIMEOUT_MILLIS);
assertEquals(softApConfig.getBlockedClientList(), TEST_BLOCKEDLIST);
assertEquals(softApConfig.getAllowedClientList(), TEST_ALLOWEDLIST);
assertEquals(softApConfig.getMacRandomizationSetting(), TEST_MAC_RANDOMIZATIONSETTING);
assertEquals(softApConfig.isBridgedModeOpportunisticShutdownEnabled(),
TEST_BRIDGED_OPPORTUNISTIC_SHUTDOWN_ENABLED);
assertEquals(softApConfig.isIeee80211axEnabled(), TEST_80211AX_ENABLED);
assertEquals(softApConfig.isUserConfiguration(), true);
}
}