/* * 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.WifiConfiguration; import android.net.wifi.WifiNetworkSuggestion; import android.util.Xml; import androidx.test.filters.SmallTest; import com.android.internal.util.FastXmlSerializer; import com.android.server.wifi.WifiNetworkSuggestionsManager.ExtendedWifiNetworkSuggestion; import com.android.server.wifi.WifiNetworkSuggestionsManager.PerAppInfo; 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.Map; /** * 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 = "\n" + "com.android.test.1\n" + "\n" + "\n" + "\n" + ""WifiConfigurationTestUtilSSID7"NONE\n" + ""WifiConfigurationTestUtilSSID7"\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "01\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "02:00:00:00:00:00\n" + "\n" + "\n" + "\n" + "\n" + "\n" + ""; 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 { Map networkSuggestionsMap = new HashMap<>(); PerAppInfo appInfo = new PerAppInfo(TEST_PACKAGE_NAME_1); WifiConfiguration configuration = WifiConfigurationTestUtil.createEapNetwork(); configuration.enterpriseConfig = WifiConfigurationTestUtil.createPEAPWifiEnterpriseConfigWithGTCPhase2(); WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(configuration, false, false, TEST_UID_1, TEST_PACKAGE_NAME_1); appInfo.hasUserApproved = false; appInfo.extNetworkSuggestions.add( ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion, appInfo)); networkSuggestionsMap.put(TEST_PACKAGE_NAME_1, appInfo); Map deserializedPerAppInfoMap = assertSerializeDeserialize(networkSuggestionsMap); ExtendedWifiNetworkSuggestion deserializedSuggestion = deserializedPerAppInfoMap.get(TEST_PACKAGE_NAME_1).extNetworkSuggestions.stream() .findAny() .orElse(null); WifiConfigurationTestUtil.assertConfigurationEqual( configuration, deserializedSuggestion.wns.wifiConfiguration); WifiConfigurationTestUtil.assertWifiEnterpriseConfigEqualForConfigStore( configuration.enterpriseConfig, deserializedSuggestion.wns.wifiConfiguration.enterpriseConfig); } /** * Serialize/Deserialize a single network suggestion from multiple apps. */ @Test public void serializeDeserializeSingleNetworkSuggestionFromMultipleApps() throws Exception { Map networkSuggestionsMap = new HashMap<>(); PerAppInfo appInfo1 = new PerAppInfo(TEST_PACKAGE_NAME_1); WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion( WifiConfigurationTestUtil.createOpenNetwork(), false, false, TEST_UID_1, TEST_PACKAGE_NAME_1); appInfo1.hasUserApproved = false; appInfo1.extNetworkSuggestions.add( ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion1, appInfo1)); networkSuggestionsMap.put(TEST_PACKAGE_NAME_1, appInfo1); PerAppInfo appInfo2 = new PerAppInfo(TEST_PACKAGE_NAME_2); WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion( WifiConfigurationTestUtil.createOpenNetwork(), true, false, TEST_UID_2, TEST_PACKAGE_NAME_2); appInfo2.hasUserApproved = true; appInfo2.extNetworkSuggestions.add( ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion2, appInfo2)); networkSuggestionsMap.put(TEST_PACKAGE_NAME_2, appInfo2); assertSerializeDeserialize(networkSuggestionsMap); } /** * Serialize/Deserialize multiple network suggestion from multiple apps. */ @Test public void serializeDeserializeMultipleNetworkSuggestionFromMultipleApps() throws Exception { Map networkSuggestionsMap = new HashMap<>(); PerAppInfo appInfo1 = new PerAppInfo(TEST_PACKAGE_NAME_1); WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion( WifiConfigurationTestUtil.createOpenNetwork(), false, true, TEST_UID_1, TEST_PACKAGE_NAME_1); WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion( WifiConfigurationTestUtil.createOpenNetwork(), true, false, TEST_UID_1, TEST_PACKAGE_NAME_1); appInfo1.hasUserApproved = true; appInfo1.extNetworkSuggestions.add( ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion1, appInfo1)); appInfo1.extNetworkSuggestions.add( ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion2, appInfo1)); networkSuggestionsMap.put(TEST_PACKAGE_NAME_1, appInfo1); PerAppInfo appInfo2 = new PerAppInfo(TEST_PACKAGE_NAME_2); WifiNetworkSuggestion networkSuggestion3 = new WifiNetworkSuggestion( WifiConfigurationTestUtil.createOpenNetwork(), true, false, TEST_UID_2, TEST_PACKAGE_NAME_2); WifiNetworkSuggestion networkSuggestion4 = new WifiNetworkSuggestion( WifiConfigurationTestUtil.createOpenNetwork(), false, true, TEST_UID_2, TEST_PACKAGE_NAME_2); appInfo2.hasUserApproved = true; appInfo2.extNetworkSuggestions.add( ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion3, appInfo2)); appInfo2.extNetworkSuggestions.add( ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion4, appInfo2)); networkSuggestionsMap.put(TEST_PACKAGE_NAME_2, appInfo2); 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 Map assertSerializeDeserialize( Map networkSuggestionsMap) throws Exception { // Setup the data to serialize. when(mDataSource.toSerialize()).thenReturn(networkSuggestionsMap); // Serialize/deserialize data. deserializeData(serializeData()); // Verify the deserialized data. ArgumentCaptor deserializedNetworkSuggestionsMap = ArgumentCaptor.forClass(HashMap.class); verify(mDataSource).fromDeserialized(deserializedNetworkSuggestionsMap.capture()); assertEquals(networkSuggestionsMap, deserializedNetworkSuggestionsMap.getValue()); return deserializedNetworkSuggestionsMap.getValue(); } }