summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiApConfigStoreTest.java131
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiConfigStoreTest.java138
2 files changed, 141 insertions, 128 deletions
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiApConfigStoreTest.java b/tests/wifitests/src/com/android/server/wifi/WifiApConfigStoreTest.java
index 14cb6043a..54761e2be 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiApConfigStoreTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiApConfigStoreTest.java
@@ -24,7 +24,6 @@ import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
@@ -36,15 +35,12 @@ import android.content.pm.ApplicationInfo;
import android.net.MacAddress;
import android.net.wifi.SoftApConfiguration;
import android.net.wifi.SoftApConfiguration.Builder;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiConfiguration.KeyMgmt;
import android.os.Build;
import android.os.Handler;
import android.os.test.TestLooper;
import androidx.test.filters.SmallTest;
-import com.android.server.wifi.util.ApConfigUtil;
import com.android.wifi.resources.R;
import org.junit.Before;
@@ -53,12 +49,6 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import java.io.BufferedOutputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
@@ -71,11 +61,9 @@ public class WifiApConfigStoreTest extends WifiBaseTest {
private static final String TAG = "WifiApConfigStoreTest";
- private static final String TEST_AP_CONFIG_FILE_PREFIX = "APConfig_";
private static final String TEST_DEFAULT_2G_CHANNEL_LIST = "1,2,3,4,5,6";
private static final String TEST_DEFAULT_AP_SSID = "TestAP";
private static final String TEST_DEFAULT_HOTSPOT_SSID = "TestShare";
- private static final String TEST_DEFAULT_HOTSPOT_PSK = "TestPassword";
private static final int RAND_SSID_INT_MIN = 1000;
private static final int RAND_SSID_INT_MAX = 9999;
private static final String TEST_CHAR_SET_AS_STRING = "abcdefghijklmnopqrstuvwxyz0123456789";
@@ -96,7 +84,6 @@ public class WifiApConfigStoreTest extends WifiBaseTest {
@Mock private WifiConfigStore mWifiConfigStore;
@Mock private WifiConfigManager mWifiConfigManager;
@Mock private ActiveModeWarden mActiveModeWarden;
- private File mLegacyApConfigFile;
private Random mRandom;
private MockResources mResources;
@Mock private ApplicationInfo mMockApplInfo;
@@ -136,19 +123,10 @@ public class WifiApConfigStoreTest extends WifiBaseTest {
/**
* Helper method to create and verify actions for the ApConfigStore used in the following tests.
*/
- private WifiApConfigStore createWifiApConfigStore(File legacyFile) throws Exception {
- WifiApConfigStore store;
- if (legacyFile == null) {
- store = new WifiApConfigStore(
- mContext, mWifiInjector, mHandler, mBackupManagerProxy,
- mWifiConfigStore, mWifiConfigManager, mActiveModeWarden);
- } else {
- store = new WifiApConfigStore(
- mContext, mWifiInjector, mHandler, mBackupManagerProxy,
- mWifiConfigStore, mWifiConfigManager, mActiveModeWarden,
- new FileInputStream(legacyFile));
- }
-
+ private WifiApConfigStore createWifiApConfigStore() throws Exception {
+ WifiApConfigStore store = new WifiApConfigStore(
+ mContext, mWifiInjector, mHandler, mBackupManagerProxy,
+ mWifiConfigStore, mWifiConfigManager, mActiveModeWarden);
verify(mWifiConfigStore).registerStoreData(any());
ArgumentCaptor<SoftApStoreData.DataSource> dataStoreSourceArgumentCaptor =
ArgumentCaptor.forClass(SoftApStoreData.DataSource.class);
@@ -158,10 +136,6 @@ public class WifiApConfigStoreTest extends WifiBaseTest {
return store;
}
- private WifiApConfigStore createWifiApConfigStore() throws Exception {
- return createWifiApConfigStore(null);
- }
-
/**
* Generate a SoftApConfiguration based on the specified parameters.
*/
@@ -180,62 +154,6 @@ public class WifiApConfigStoreTest extends WifiBaseTest {
return configBuilder.build();
}
- /**
- * Generate a WifiConfiguration based on the specified parameters.
- */
- private WifiConfiguration setupWifiConfigurationApConfig(
- String ssid, String preSharedKey, int keyManagement, int band, int channel,
- boolean hiddenSSID) {
- WifiConfiguration config = new WifiConfiguration();
- config.SSID = ssid;
- config.preSharedKey = preSharedKey;
- config.allowedKeyManagement.set(keyManagement);
- config.apBand = band;
- config.apChannel = channel;
- config.hiddenSSID = hiddenSSID;
- return config;
- }
-
- private void writeLegacyApConfigFile(WifiConfiguration config) throws Exception {
- try (DataOutputStream out = new DataOutputStream(new BufferedOutputStream(
- new FileOutputStream(mLegacyApConfigFile)))) {
- out.writeInt(WifiApConfigStore.AP_CONFIG_FILE_VERSION);
- out.writeUTF(config.SSID);
- out.writeInt(config.apBand);
- out.writeInt(config.apChannel);
- out.writeBoolean(config.hiddenSSID);
- int authType = config.getAuthType();
- out.writeInt(authType);
- if (authType != KeyMgmt.NONE) {
- out.writeUTF(config.preSharedKey);
- }
- } catch (IOException e) {
- fail("Error writing hotspot configuration" + e);
- }
- }
-
- /**
- * Asserts that the WifiConfigurations equal to SoftApConfiguration.
- * This only compares the elements saved
- * for softAp used.
- */
- public static void assertWifiConfigurationEqualSoftApConfiguration(
- WifiConfiguration backup, SoftApConfiguration restore) {
- assertEquals(backup.SSID, restore.getSsid());
- assertEquals(backup.BSSID, restore.getBssid());
- assertEquals(ApConfigUtil.convertWifiConfigBandToSoftApConfigBand(backup.apBand),
- restore.getBand());
- assertEquals(backup.apChannel, restore.getChannel());
- assertEquals(backup.preSharedKey, restore.getPassphrase());
- int authType = backup.getAuthType();
- if (backup.getAuthType() == WifiConfiguration.KeyMgmt.WPA2_PSK) {
- assertEquals(SoftApConfiguration.SECURITY_TYPE_WPA2_PSK, restore.getSecurityType());
- } else {
- assertEquals(SoftApConfiguration.SECURITY_TYPE_OPEN, restore.getSecurityType());
- }
- assertEquals(backup.hiddenSSID, restore.isHiddenSsid());
- }
-
private void verifyApConfig(SoftApConfiguration config1, SoftApConfiguration config2) {
assertEquals(config1.getSsid(), config2.getSsid());
assertEquals(config1.getPassphrase(), config2.getPassphrase());
@@ -299,47 +217,6 @@ public class WifiApConfigStoreTest extends WifiBaseTest {
verify(mWifiConfigManager).saveToStore(true);
}
- /**
- * Verify WifiApConfigStore can correctly load the existing configuration
- * from the legacy config file and migrate it to the new config store.
- */
- @Test
- public void initWithExistingConfigurationInLegacyFile() throws Exception {
- WifiConfiguration backupConfig = setupWifiConfigurationApConfig(
- "ConfiguredAP", /* SSID */
- "randomKey", /* preshared key */
- KeyMgmt.WPA2_PSK, /* key management */
- 1, /* AP band (5GHz) */
- 40, /* AP channel */
- true /* Hidden SSID */);
-
- /* Create a temporary file for AP config file storage. */
- mLegacyApConfigFile = File.createTempFile(TEST_AP_CONFIG_FILE_PREFIX, "");
-
- SoftApConfiguration expectedConfig = setupApConfig(
- "ConfiguredAP", /* SSID */
- "randomKey", /* preshared key */
- SECURITY_TYPE_WPA2_PSK, /* security type */
- SoftApConfiguration.BAND_5GHZ, /* AP band (5GHz) */
- 40, /* AP channel */
- true /* Hidden SSID */);
-
- assertWifiConfigurationEqualSoftApConfiguration(backupConfig, expectedConfig);
-
- writeLegacyApConfigFile(backupConfig);
- WifiApConfigStore store = createWifiApConfigStore(mLegacyApConfigFile);
- verify(mWifiConfigManager).saveToStore(true);
- verify(mBackupManagerProxy).notifyDataChanged();
- verifyApConfig(expectedConfig, store.getApConfiguration());
- verifyApConfig(expectedConfig, mDataStoreSource.toSerialize());
- // Simulate the config store read to trigger the write to new config store.
- mDataStoreSource.reset();
- mLooper.dispatchAll();
- // Triggers write twice:
- // a) On reading the legacy file (new config store not ready yet)
- // b) When the new config store is ready.
- verify(mWifiConfigManager, times(2)).saveToStore(true);
- }
/**
* Verify the handling of setting a null ap configuration.
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiConfigStoreTest.java b/tests/wifitests/src/com/android/server/wifi/WifiConfigStoreTest.java
index 967c029ba..ca368733a 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiConfigStoreTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiConfigStoreTest.java
@@ -19,6 +19,7 @@ package com.android.server.wifi;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
+import android.app.test.MockAnswerUtil;
import android.app.test.TestAlarmManager;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -46,12 +47,14 @@ import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.MockitoSession;
+import org.mockito.stubbing.Answer;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
import java.io.File;
import java.io.IOException;
+import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
@@ -153,6 +156,12 @@ public class WifiConfigStoreTest extends WifiBaseTest {
+ "</Integrity>\n"
+ "<%s />\n"
+ "</WifiConfigStoreData>\n";
+ private static final String TEST_DATA_XML_STRING_FORMAT_V3_WITH_ONE_DATA_SOURCE =
+ "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
+ + "<WifiConfigStoreData>\n"
+ + "<int name=\"Version\" value=\"3\" />\n"
+ + "<%s />\n"
+ + "</WifiConfigStoreData>\n";
// Test mocks
@Mock private Context mContext;
@Mock private PackageManager mPackageManager;
@@ -162,6 +171,7 @@ public class WifiConfigStoreTest extends WifiBaseTest {
@Mock private WifiMetrics mWifiMetrics;
@Mock private WifiConfigStoreEncryptionUtil mEncryptionUtil;
private MockStoreFile mSharedStore;
+ private MockStoreFile mSharedSoftApStore;
private MockStoreFile mUserStore;
private MockStoreFile mUserNetworkSuggestionsStore;
private List<StoreFile> mUserStores = new ArrayList<StoreFile>();
@@ -190,6 +200,7 @@ public class WifiConfigStoreTest extends WifiBaseTest {
when(mEncryptionUtil.decrypt(any(EncryptedData.class)))
.thenReturn(new byte[0]);
mSharedStore = new MockStoreFile(WifiConfigStore.STORE_FILE_SHARED_GENERAL);
+ mSharedSoftApStore = new MockStoreFile(WifiConfigStore.STORE_FILE_SHARED_SOFTAP);
mUserStore = new MockStoreFile(WifiConfigStore.STORE_FILE_USER_GENERAL);
mUserNetworkSuggestionsStore =
new MockStoreFile(WifiConfigStore.STORE_FILE_USER_NETWORK_SUGGESTIONS);
@@ -214,7 +225,7 @@ public class WifiConfigStoreTest extends WifiBaseTest {
setupMocks();
mWifiConfigStore = new WifiConfigStore(mContext, new Handler(mLooper.getLooper()), mClock,
- mWifiMetrics, Arrays.asList(mSharedStore));
+ mWifiMetrics, Arrays.asList(mSharedStore, mSharedSoftApStore));
// Enable verbose logging before tests.
mWifiConfigStore.enableVerboseLogging(true);
}
@@ -847,6 +858,131 @@ public class WifiConfigStoreTest extends WifiBaseTest {
}
/**
+ * Tests the complete migration path all the way from reading from the migration stream to
+ * parsing the XML data and sending it to the appropriate registered data sources.
+ */
+ @Test
+ public void testMigration() throws Exception {
+ // Setup both shared & user store migrations.
+ StoreFile sharedStoreFile1 = mock(StoreFile.class);
+ when(sharedStoreFile1.getFileId())
+ .thenReturn(WifiConfigStore.STORE_FILE_SHARED_GENERAL);
+ StoreFile sharedStoreFile2 = mock(StoreFile.class);
+ when(sharedStoreFile2.getFileId())
+ .thenReturn(WifiConfigStore.STORE_FILE_SHARED_SOFTAP);
+ StoreFile userStoreFile1 = mock(StoreFile.class);
+ when(userStoreFile1.getFileId())
+ .thenReturn(WifiConfigStore.STORE_FILE_USER_GENERAL);
+ StoreFile userStoreFile2 = mock(StoreFile.class);
+ when(userStoreFile2.getFileId())
+ .thenReturn(WifiConfigStore.STORE_FILE_USER_NETWORK_SUGGESTIONS);
+ mWifiConfigStore = new WifiConfigStore(mContext, new Handler(mLooper.getLooper()), mClock,
+ mWifiMetrics, Arrays.asList(sharedStoreFile1, sharedStoreFile2));
+ mWifiConfigStore.setUserStores(Arrays.asList(userStoreFile1, userStoreFile2));
+
+ // Register data container.
+ StoreData sharedStoreData = mock(StoreData.class);
+ when(sharedStoreData.getStoreFileId())
+ .thenReturn(WifiConfigStore.STORE_FILE_SHARED_GENERAL);
+ when(sharedStoreData.getName()).thenReturn(TEST_SHARE_DATA);
+ StoreData userStoreData = mock(StoreData.class);
+ when(userStoreData.getStoreFileId())
+ .thenReturn(WifiConfigStore.STORE_FILE_USER_GENERAL);
+ when(userStoreData.getName()).thenReturn(TEST_USER_DATA);
+ mWifiConfigStore.registerStoreData(sharedStoreData);
+ mWifiConfigStore.registerStoreData(userStoreData);
+
+ // Migration data
+ InputStream sharedStream1 = mock(InputStream.class);
+ InputStream sharedStream2 = mock(InputStream.class);
+ InputStream userStream1 = mock(InputStream.class);
+ InputStream userStream2 = mock(InputStream.class);
+ when(WifiMigration.convertAndRetrieveSharedConfigStoreFile(
+ WifiMigration.STORE_FILE_SHARED_GENERAL))
+ .thenReturn(sharedStream1);
+ when(WifiMigration.convertAndRetrieveSharedConfigStoreFile(
+ WifiMigration.STORE_FILE_SHARED_SOFTAP))
+ .thenReturn(sharedStream2);
+ when(WifiMigration.convertAndRetrieveUserConfigStoreFile(
+ eq(WifiMigration.STORE_FILE_USER_GENERAL), any()))
+ .thenReturn(userStream1);
+ when(WifiMigration.convertAndRetrieveUserConfigStoreFile(
+ eq(WifiMigration.STORE_FILE_USER_NETWORK_SUGGESTIONS), any()))
+ .thenReturn(userStream2);
+
+ byte[] sharedStoreXmlBytes =
+ String.format(TEST_DATA_XML_STRING_FORMAT_V3_WITH_ONE_DATA_SOURCE,
+ TEST_SHARE_DATA).getBytes();
+ byte[] userStoreXmlBytes =
+ String.format(TEST_DATA_XML_STRING_FORMAT_V3_WITH_ONE_DATA_SOURCE,
+ TEST_USER_DATA).getBytes();
+ when(sharedStream1.available())
+ .thenReturn(sharedStoreXmlBytes.length) // first time return file contents, then 0.
+ .thenReturn(0);
+ when(sharedStream2.available())
+ .thenReturn(sharedStoreXmlBytes.length) // first time return file contents, then 0.
+ .thenReturn(0);
+ when(userStream1.available())
+ .thenReturn(userStoreXmlBytes.length) // first time return file contents, then 0.
+ .thenReturn(0);
+ when(userStream2.available())
+ .thenReturn(userStoreXmlBytes.length) // first time return file contents, then 0.
+ .thenReturn(0);
+ Answer sharedStreamReadAnswer = new MockAnswerUtil.AnswerWithArguments() {
+ public int answer(byte[] b, int off, int len) {
+ System.arraycopy(sharedStoreXmlBytes, 0, b, 0, sharedStoreXmlBytes.length);
+ return sharedStoreXmlBytes.length;
+ }
+ };
+ Answer userStreamReadAnswer = new MockAnswerUtil.AnswerWithArguments() {
+ public int answer(byte[] b, int off, int len) {
+ System.arraycopy(userStoreXmlBytes, 0, b, 0, userStoreXmlBytes.length);
+ return userStoreXmlBytes.length;
+ }
+ };
+ when(sharedStream1.read(any(byte[].class), anyInt(), anyInt()))
+ .thenAnswer(sharedStreamReadAnswer) // first time return file contents, then 0.
+ .thenReturn(0);
+ when(sharedStream2.read(any(byte[].class), anyInt(), anyInt()))
+ .thenAnswer(sharedStreamReadAnswer) // first time return file contents, then 0.
+ .thenReturn(0);
+ when(userStream1.read(any(byte[].class), anyInt(), anyInt()))
+ .thenAnswer(userStreamReadAnswer) // first time return file contents, then 0.
+ .thenReturn(0);
+ when(userStream2.read(any(byte[].class), anyInt(), anyInt()))
+ .thenAnswer(userStreamReadAnswer) // first time return file contents, then 0.
+ .thenReturn(0);
+
+ // Trigger read.
+ mWifiConfigStore.read();
+
+ // Verify that we read the data out of all the migration streams & we didn't read
+ // from the files on disk.
+ verify(sharedStream1, times(2)).available();
+ verify(sharedStream1, times(2)).read(any(), anyInt(), anyInt());
+ verify(sharedStream2, times(2)).available();
+ verify(sharedStream2, times(2)).read(any(), anyInt(), anyInt());
+ verify(userStream1, times(2)).available();
+ verify(userStream1, times(2)).read(any(), anyInt(), anyInt());
+ verify(userStream2, times(2)).available();
+ verify(userStream2, times(2)).read(any(), anyInt(), anyInt());
+
+ // Verify that we correctly deserialized the data and sent it to the corresponding sources.
+ verify(sharedStoreData, times(1))
+ .deserializeData(any(XmlPullParser.class), anyInt(),
+ eq(WifiConfigStore.ENCRYPT_CREDENTIALS_CONFIG_STORE_DATA_VERSION), any());
+ verify(userStoreData, times(1))
+ .deserializeData(any(XmlPullParser.class), anyInt(),
+ eq(WifiConfigStore.ENCRYPT_CREDENTIALS_CONFIG_STORE_DATA_VERSION), any());
+
+ // Verify we did not read from the real store files.
+ verify(sharedStoreFile1, never()).readRawData();
+ verify(sharedStoreFile2, never()).readRawData();
+ verify(userStoreFile1, never()).readRawData();
+ verify(userStoreFile2, never()).readRawData();
+ }
+
+ /**
* Mock Store File to redirect all file writes from WifiConfigStore to local buffers.
* This can be used to examine the data output by WifiConfigStore.
*/