| /* |
| * Copyright (C) 2018 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.net.wifi.WifiNetworkSuggestion; |
| import android.support.test.filters.SmallTest; |
| import android.util.Xml; |
| |
| import com.android.internal.util.FastXmlSerializer; |
| |
| 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.XmlPullParserException; |
| import org.xmlpull.v1.XmlSerializer; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.ByteArrayOutputStream; |
| import java.nio.charset.StandardCharsets; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.Map; |
| import java.util.Set; |
| |
| /** |
| * Unit tests for {@link com.android.server.wifi.NetworkSuggestionStoreData}. |
| */ |
| @SmallTest |
| public class NetworkSuggestionStoreDataTest { |
| private static final int TEST_UID_1 = 14556; |
| private static final int TEST_UID_2 = 14536; |
| private static final String TEST_PACKAGE_NAME_1 = "com.android.test.1"; |
| private static final String TEST_PACKAGE_NAME_2 = "com.android.test.2"; |
| private static final String TEST_CORRUPT_DATA_INVALID_SSID = |
| "<NetworkSuggestionPerApp>\n" |
| + "<string name=\"SuggestorPackageName\">com.android.test.1</string>\n" |
| + "<NetworkSuggestion>\n" |
| + "<WifiConfiguration>\n" |
| + "<string name=\"ConfigKey\">"WifiConfigurationTestUtilSSID7"NONE</string>\n" |
| + "<blah blah=\"SSID\">"WifiConfigurationTestUtilSSID7"</blah>\n" |
| + "<null name=\"BSSID\" />\n" |
| + "<null name=\"PreSharedKey\" />\n" |
| + "<null name=\"WEPKeys\" />\n" |
| + "<int name=\"WEPTxKeyIndex\" value=\"0\" />\n" |
| + "<boolean name=\"HiddenSSID\" value=\"false\" />\n" |
| + "<boolean name=\"RequirePMF\" value=\"false\" />\n" |
| + "<byte-array name=\"AllowedKeyMgmt\" num=\"1\">01</byte-array>\n" |
| + "<byte-array name=\"AllowedProtocols\" num=\"0\"></byte-array>\n" |
| + "<byte-array name=\"AllowedAuthAlgos\" num=\"0\"></byte-array>\n" |
| + "<byte-array name=\"AllowedGroupCiphers\" num=\"0\"></byte-array>\n" |
| + "<byte-array name=\"AllowedPairwiseCiphers\" num=\"0\"></byte-array>\n" |
| + "<byte-array name=\"AllowedGroupMgmtCiphers\" num=\"0\"></byte-array>\n" |
| + "<byte-array name=\"AllowedSuiteBCiphers\" num=\"0\"></byte-array>\n" |
| + "<boolean name=\"Shared\" value=\"true\" />\n" |
| + "<int name=\"Status\" value=\"2\" />\n" |
| + "<null name=\"FQDN\" />\n" |
| + "<null name=\"ProviderFriendlyName\" />\n" |
| + "<null name=\"LinkedNetworksList\" />\n" |
| + "<null name=\"DefaultGwMacAddress\" />\n" |
| + "<boolean name=\"ValidatedInternetAccess\" value=\"false\" />\n" |
| + "<boolean name=\"NoInternetAccessExpected\" value=\"false\" />\n" |
| + "<int name=\"UserApproved\" value=\"0\" />\n" |
| + "<boolean name=\"MeteredHint\" value=\"false\" />\n" |
| + "<int name=\"MeteredOverride\" value=\"0\" />\n" |
| + "<boolean name=\"UseExternalScores\" value=\"false\" />\n" |
| + "<int name=\"NumAssociation\" value=\"0\" />\n" |
| + "<int name=\"CreatorUid\" value=\"5\" />\n" |
| + "<null name=\"CreatorName\" />\n" |
| + "<null name=\"CreationTime\" />\n" |
| + "<int name=\"LastUpdateUid\" value=\"-1\" />\n" |
| + "<null name=\"LastUpdateName\" />\n" |
| + "<int name=\"LastConnectUid\" value=\"0\" />\n" |
| + "<boolean name=\"IsLegacyPasspointConfig\" value=\"false\" />\n" |
| + "<long-array name=\"RoamingConsortiumOIs\" num=\"0\" />\n" |
| + "<string name=\"RandomizedMacAddress\">02:00:00:00:00:00</string>\n" |
| + "</WifiConfiguration>\n" |
| + "<boolean name=\"IsAppInteractionRequired\" value=\"false\" />\n" |
| + "<boolean name=\"IsUserInteractionRequired\" value=\"false\" />\n" |
| + "<int name=\"SuggestorUid\" value=\"14556\" />\n" |
| + "</NetworkSuggestion>\n" |
| + "</NetworkSuggestionPerApp>"; |
| |
| private @Mock NetworkSuggestionStoreData.DataSource mDataSource; |
| private NetworkSuggestionStoreData mNetworkSuggestionStoreData; |
| |
| @Before |
| public void setUp() throws Exception { |
| MockitoAnnotations.initMocks(this); |
| mNetworkSuggestionStoreData = new NetworkSuggestionStoreData(mDataSource); |
| } |
| |
| /** |
| * Helper function for serializing configuration data to a XML block. |
| */ |
| private byte[] serializeData() throws Exception { |
| final XmlSerializer out = new FastXmlSerializer(); |
| final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); |
| out.setOutput(outputStream, StandardCharsets.UTF_8.name()); |
| mNetworkSuggestionStoreData.serializeData(out); |
| out.flush(); |
| return outputStream.toByteArray(); |
| } |
| |
| /** |
| * Helper function for parsing configuration data from a XML block. |
| */ |
| 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()); |
| mNetworkSuggestionStoreData.deserializeData(in, in.getDepth()); |
| } |
| |
| /** |
| * Verify store file Id. |
| */ |
| @Test |
| public void verifyStoreFileId() throws Exception { |
| assertEquals(WifiConfigStore.STORE_FILE_USER_NETWORK_SUGGESTIONS, |
| mNetworkSuggestionStoreData.getStoreFileId()); |
| } |
| |
| /** |
| * Serialize/Deserialize a single network suggestion from a single app. |
| */ |
| @Test |
| public void serializeDeserializeSingleNetworkSuggestionFromSingleApp() throws Exception { |
| WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion( |
| WifiConfigurationTestUtil.createOpenNetwork(), false, false, TEST_UID_1); |
| Map<String, Set<WifiNetworkSuggestion>> networkSuggestionsMap = new HashMap<>(); |
| Set<WifiNetworkSuggestion> networkSuggestionsSet = new HashSet<WifiNetworkSuggestion>() {{ |
| add(networkSuggestion); |
| }}; |
| networkSuggestionsMap.put(TEST_PACKAGE_NAME_1, networkSuggestionsSet); |
| |
| assertSerializeDeserialize(networkSuggestionsMap); |
| } |
| |
| /** |
| * Serialize/Deserialize a single network suggestion from multiple apps. |
| */ |
| @Test |
| public void serializeDeserializeSingleNetworkSuggestionFromMultipleApps() throws Exception { |
| WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion( |
| WifiConfigurationTestUtil.createOpenNetwork(), false, false, TEST_UID_1); |
| Set<WifiNetworkSuggestion> networkSuggestionsSet1 = new HashSet<WifiNetworkSuggestion>() {{ |
| add(networkSuggestion1); |
| }}; |
| WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion( |
| WifiConfigurationTestUtil.createOpenNetwork(), true, false, TEST_UID_2); |
| Set<WifiNetworkSuggestion> networkSuggestionsSet2 = new HashSet<WifiNetworkSuggestion>() {{ |
| add(networkSuggestion2); |
| }}; |
| Map<String, Set<WifiNetworkSuggestion>> networkSuggestionsMap = new HashMap<>(); |
| networkSuggestionsMap.put(TEST_PACKAGE_NAME_1, networkSuggestionsSet1); |
| networkSuggestionsMap.put(TEST_PACKAGE_NAME_2, networkSuggestionsSet2); |
| |
| assertSerializeDeserialize(networkSuggestionsMap); |
| } |
| |
| /** |
| * Serialize/Deserialize multiple network suggestion from multiple apps. |
| */ |
| @Test |
| public void serializeDeserializeMultipleNetworkSuggestionFromMultipleApps() throws Exception { |
| WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion( |
| WifiConfigurationTestUtil.createOpenNetwork(), false, true, TEST_UID_1); |
| WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion( |
| WifiConfigurationTestUtil.createOpenNetwork(), true, false, TEST_UID_1); |
| Set<WifiNetworkSuggestion> networkSuggestionsSet1 = new HashSet<WifiNetworkSuggestion>() {{ |
| add(networkSuggestion1); |
| add(networkSuggestion2); |
| }}; |
| WifiNetworkSuggestion networkSuggestion3 = new WifiNetworkSuggestion( |
| WifiConfigurationTestUtil.createOpenNetwork(), true, false, TEST_UID_2); |
| WifiNetworkSuggestion networkSuggestion4 = new WifiNetworkSuggestion( |
| WifiConfigurationTestUtil.createOpenNetwork(), false, true, TEST_UID_2); |
| Set<WifiNetworkSuggestion> networkSuggestionsSet2 = new HashSet<WifiNetworkSuggestion>() {{ |
| add(networkSuggestion3); |
| add(networkSuggestion4); |
| }}; |
| Map<String, Set<WifiNetworkSuggestion>> networkSuggestionsMap = new HashMap<>(); |
| networkSuggestionsMap.put(TEST_PACKAGE_NAME_1, networkSuggestionsSet1); |
| networkSuggestionsMap.put(TEST_PACKAGE_NAME_2, networkSuggestionsSet2); |
| |
| assertSerializeDeserialize(networkSuggestionsMap); |
| } |
| |
| /** |
| * Deserialize corrupt data and ensure that we gracefully handle any errors in the data. |
| * graceful == throw XmlPullParserException (which is handled in |
| * {@link WifiConfigManager#loadFromStore()}). |
| */ |
| @Test(expected = XmlPullParserException.class) |
| public void deserializeCorruptData() throws Exception { |
| deserializeData(TEST_CORRUPT_DATA_INVALID_SSID.getBytes()); |
| } |
| |
| private void assertSerializeDeserialize( |
| Map<String, Set<WifiNetworkSuggestion>> networkSuggestionsMap) throws Exception { |
| // Setup the data to serialize. |
| when(mDataSource.getNetworkSuggestions()).thenReturn(networkSuggestionsMap); |
| |
| // Serialize/deserialize data. |
| deserializeData(serializeData()); |
| |
| // Verify the deserialized data. |
| ArgumentCaptor<HashMap> deserializedNetworkSuggestionsMap = |
| ArgumentCaptor.forClass(HashMap.class); |
| verify(mDataSource).setNetworkSuggestions(deserializedNetworkSuggestionsMap.capture()); |
| assertEquals(networkSuggestionsMap, deserializedNetworkSuggestionsMap.getValue()); |
| } |
| } |