blob: 4dfa96b8c6062212146ac8ab36d0f092b8aec150 [file] [log] [blame]
/*
* 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 android.net.wifi;
import static org.junit.Assert.*;
import android.net.MacAddress;
import android.os.Parcel;
import android.os.Process;
import androidx.test.filters.SmallTest;
import org.junit.Test;
/**
* Unit tests for {@link android.net.wifi.WifiNetworkSuggestion}.
*/
@SmallTest
public class WifiNetworkSuggestionTest {
private static final int TEST_UID = 45677;
private static final int TEST_UID_OTHER = 45673;
private static final String TEST_PACKAGE_NAME = "com.test.packagename";
private static final String TEST_PACKAGE_NAME_OTHER = "com.test.packagenameother";
private static final String TEST_SSID = "\"Test123\"";
private static final String TEST_BSSID = "12:12:12:12:12:12";
private static final String TEST_SSID_1 = "\"Test1234\"";
private static final String TEST_PRESHARED_KEY = "Test123";
/**
* Validate correctness of WifiNetworkSuggestion object created by
* {@link WifiNetworkSuggestion.Builder#build()} for Open network which requires
* app interaction.
*/
@Test
public void testWifiNetworkSuggestionBuilderForOpenNetworkWithReqAppInteraction() {
WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
.setSsid(TEST_SSID)
.setIsAppInteractionRequired(true)
.build();
assertEquals(Process.myUid(), suggestion.suggestorUid);
assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
.get(WifiConfiguration.KeyMgmt.NONE));
assertTrue(suggestion.isAppInteractionRequired);
assertFalse(suggestion.isUserInteractionRequired);
assertEquals(WifiConfiguration.METERED_OVERRIDE_NONE,
suggestion.wifiConfiguration.meteredOverride);
assertEquals(-1, suggestion.wifiConfiguration.priority);
}
/**
* Validate correctness of WifiNetworkSuggestion object created by
* {@link WifiNetworkSuggestion.Builder#build()} for WPA_EAP network which requires
* app interaction and has a priority of zero set.
*/
@Test
public void
testWifiNetworkSuggestionBuilderForWpa2EapNetworkWithPriorityAndReqAppInteraction() {
WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
.setSsid(TEST_SSID)
.setWpa2Passphrase(TEST_PRESHARED_KEY)
.setIsAppInteractionRequired(true)
.setPriority(0)
.build();
assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
.get(WifiConfiguration.KeyMgmt.WPA_PSK));
assertEquals("\"" + TEST_PRESHARED_KEY + "\"",
suggestion.wifiConfiguration.preSharedKey);
assertTrue(suggestion.isAppInteractionRequired);
assertFalse(suggestion.isUserInteractionRequired);
assertEquals(WifiConfiguration.METERED_OVERRIDE_NONE,
suggestion.wifiConfiguration.meteredOverride);
assertEquals(0, suggestion.wifiConfiguration.priority);
}
/**
* Validate correctness of WifiNetworkSuggestion object created by
* {@link WifiNetworkSuggestion.Builder#build()} for WPA_PSK network which requires
* user interaction and is metered.
*/
@Test
public void
testWifiNetworkSuggestionBuilderForWpa2PskNetworkWithMeteredAndReqUserInteraction() {
WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
.setSsid(TEST_SSID)
.setWpa2Passphrase(TEST_PRESHARED_KEY)
.setIsUserInteractionRequired(true)
.setIsMetered(true)
.build();
assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
.get(WifiConfiguration.KeyMgmt.WPA_PSK));
assertEquals("\"" + TEST_PRESHARED_KEY + "\"",
suggestion.wifiConfiguration.preSharedKey);
assertFalse(suggestion.isAppInteractionRequired);
assertTrue(suggestion.isUserInteractionRequired);
assertEquals(WifiConfiguration.METERED_OVERRIDE_METERED,
suggestion.wifiConfiguration.meteredOverride);
assertEquals(-1, suggestion.wifiConfiguration.priority);
}
/**
* Validate correctness of WifiNetworkSuggestion object created by
* {@link WifiNetworkSuggestion.Builder#build()} for OWE network.
*/
@Test
public void testWifiNetworkSuggestionBuilderForEnhancedOpenNetworkWithBssid() {
WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
.setSsid(TEST_SSID)
.setBssid(MacAddress.fromString(TEST_BSSID))
.setIsEnhancedOpen(true)
.build();
assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
assertEquals(TEST_BSSID, suggestion.wifiConfiguration.BSSID);
assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
.get(WifiConfiguration.KeyMgmt.OWE));
assertNull(suggestion.wifiConfiguration.preSharedKey);
assertTrue(suggestion.wifiConfiguration.requirePMF);
}
/**
* Validate correctness of WifiNetworkSuggestion object created by
* {@link WifiNetworkSuggestion.Builder#build()} for SAE network.
*/
@Test
public void testWifiNetworkSuggestionBuilderForWpa3PskNetwork() {
WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
.setSsid(TEST_SSID)
.setWpa3Passphrase(TEST_PRESHARED_KEY)
.build();
assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
.get(WifiConfiguration.KeyMgmt.SAE));
assertEquals("\"" + TEST_PRESHARED_KEY + "\"",
suggestion.wifiConfiguration.preSharedKey);
assertTrue(suggestion.wifiConfiguration.requirePMF);
}
/**
* Validate correctness of WifiNetworkSuggestion object created by
* {@link WifiNetworkSuggestion.Builder#build()} for SuiteB network.
*/
@Test
public void testWifiNetworkSuggestionBuilderForWpa3EapNetwork() {
WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.GTC);
WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
.setSsid(TEST_SSID)
.setWpa3EnterpriseConfig(enterpriseConfig)
.build();
assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
.get(WifiConfiguration.KeyMgmt.SUITE_B_192));
assertTrue(suggestion.wifiConfiguration.allowedGroupCiphers
.get(WifiConfiguration.GroupCipher.GCMP_256));
assertTrue(suggestion.wifiConfiguration.allowedGroupManagementCiphers
.get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256));
assertTrue(suggestion.wifiConfiguration.requirePMF);
assertNull(suggestion.wifiConfiguration.preSharedKey);
// allowedSuiteBCiphers are set according to the loaded certificate and cannot be tested
// here.
}
/**
* Ensure {@link WifiNetworkSuggestion.Builder#setSsid(String)} throws an exception
* when the string is not Unicode.
*/
@Test(expected = IllegalArgumentException.class)
public void testWifiNetworkSuggestionBuilderSetSsidWithNonUnicodeString() {
new WifiNetworkSuggestion.Builder()
.setSsid("\ud800")
.build();
}
/**
* Ensure {@link WifiNetworkSuggestion.Builder#setWpa2Passphrase(String)} throws an exception
* when the string is not ASCII encodable.
*/
@Test(expected = IllegalArgumentException.class)
public void testWifiNetworkSuggestionBuilderSetWpa2PasphraseWithNonAsciiString() {
new WifiNetworkSuggestion.Builder()
.setSsid(TEST_SSID)
.setWpa2Passphrase("salvē")
.build();
}
/**
* Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
* when {@link WifiNetworkSuggestion.Builder#setSsid(String)} is not set.
*/
@Test(expected = IllegalStateException.class)
public void testWifiNetworkSuggestionBuilderWithNoSsid() {
new WifiNetworkSuggestion.Builder()
.build();
}
/**
* Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
* when {@link WifiNetworkSuggestion.Builder#setSsid(String)} is invoked with an invalid value.
*/
@Test(expected = IllegalStateException.class)
public void testWifiNetworkSuggestionBuilderWithInvalidSsid() {
new WifiNetworkSuggestion.Builder()
.setSsid("")
.build();
}
/**
* Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
* when {@link WifiNetworkSuggestion.Builder#setBssid(MacAddress)} is invoked with an invalid
* value.
*/
@Test(expected = IllegalStateException.class)
public void testWifiNetworkSuggestionBuilderWithInvalidBroadcastBssid() {
new WifiNetworkSuggestion.Builder()
.setSsid(TEST_SSID)
.setBssid(MacAddress.BROADCAST_ADDRESS)
.build();
}
/**
* Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
* when {@link WifiNetworkSuggestion.Builder#setBssid(MacAddress)} is invoked with an invalid
* value.
*/
@Test(expected = IllegalStateException.class)
public void testWifiNetworkSuggestionBuilderWithInvalidAllZeroBssid() {
new WifiNetworkSuggestion.Builder()
.setSsid(TEST_SSID)
.setBssid(MacAddress.ALL_ZEROS_ADDRESS)
.build();
}
/**
* Ensure {@link WifiNetworkSuggestion.Builder#setPriority(int)} throws an exception
* when the value is negative.
*/
@Test(expected = IllegalArgumentException.class)
public void testWifiNetworkSuggestionBuilderWithInvalidPriority() {
new WifiNetworkSuggestion.Builder()
.setSsid(TEST_SSID)
.setPriority(-2)
.build();
}
/**
* Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
* when both {@link WifiNetworkSuggestion.Builder#setWpa2Passphrase(String)} and
* {@link WifiNetworkSuggestion.Builder#setWpa3Passphrase(String)} are invoked.
*/
@Test(expected = IllegalStateException.class)
public void testWifiNetworkSuggestionBuilderWithBothWpa2PasphraseAndWpa3Passphrase() {
new WifiNetworkSuggestion.Builder()
.setSsid(TEST_SSID)
.setWpa2Passphrase(TEST_PRESHARED_KEY)
.setWpa3Passphrase(TEST_PRESHARED_KEY)
.build();
}
/**
* Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
* when both {@link WifiNetworkSuggestion.Builder#setWpa3Passphrase(String)} and
* {@link WifiNetworkSuggestion.Builder#setWpa3EnterpriseConfig(WifiEnterpriseConfig)} are
* invoked.
*/
@Test(expected = IllegalStateException.class)
public void testWifiNetworkSuggestionBuilderWithBothWpa3PasphraseAndEnterprise() {
new WifiNetworkSuggestion.Builder()
.setSsid(TEST_SSID)
.setWpa3Passphrase(TEST_PRESHARED_KEY)
.setWpa3EnterpriseConfig(new WifiEnterpriseConfig())
.build();
}
/**
* Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
* when both {@link WifiNetworkSuggestion.Builder#setWpa3Passphrase(String)} and
* {@link WifiNetworkSuggestion.Builder#setIsEnhancedOpen(boolean)} are invoked.
*/
@Test(expected = IllegalStateException.class)
public void testWifiNetworkSuggestionBuilderWithBothWpa3PasphraseAndEnhancedOpen() {
new WifiNetworkSuggestion.Builder()
.setSsid(TEST_SSID)
.setWpa3Passphrase(TEST_PRESHARED_KEY)
.setIsEnhancedOpen(true)
.build();
}
/**
* Check that parcel marshalling/unmarshalling works
*/
@Test
public void testWifiNetworkSuggestionParcel() {
WifiConfiguration configuration = new WifiConfiguration();
configuration.SSID = TEST_SSID;
configuration.BSSID = TEST_BSSID;
configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
WifiNetworkSuggestion suggestion =
new WifiNetworkSuggestion(configuration, false, true, TEST_UID, TEST_PACKAGE_NAME);
Parcel parcelW = Parcel.obtain();
suggestion.writeToParcel(parcelW, 0);
byte[] bytes = parcelW.marshall();
parcelW.recycle();
Parcel parcelR = Parcel.obtain();
parcelR.unmarshall(bytes, 0, bytes.length);
parcelR.setDataPosition(0);
WifiNetworkSuggestion parcelSuggestion =
WifiNetworkSuggestion.CREATOR.createFromParcel(parcelR);
// Two suggestion objects are considered equal if they point to the same network (i.e same
// SSID + keyMgmt + same UID). |isAppInteractionRequired| & |isUserInteractionRequired| are
// not considered for equality and hence needs to be checked for explicitly below.
assertEquals(suggestion, parcelSuggestion);
assertEquals(suggestion.isAppInteractionRequired,
parcelSuggestion.isAppInteractionRequired);
assertEquals(suggestion.isUserInteractionRequired,
parcelSuggestion.isUserInteractionRequired);
}
/**
* Check NetworkSuggestion equals returns {@code true} for 2 network suggestions with the same
* SSID, BSSID, key mgmt and UID.
*/
@Test
public void testWifiNetworkSuggestionEqualsSame() {
WifiConfiguration configuration = new WifiConfiguration();
configuration.SSID = TEST_SSID;
configuration.BSSID = TEST_BSSID;
configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
WifiNetworkSuggestion suggestion =
new WifiNetworkSuggestion(configuration, true, false, TEST_UID,
TEST_PACKAGE_NAME);
WifiConfiguration configuration1 = new WifiConfiguration();
configuration1.SSID = TEST_SSID;
configuration1.BSSID = TEST_BSSID;
configuration1.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
WifiNetworkSuggestion suggestion1 =
new WifiNetworkSuggestion(configuration1, false, true, TEST_UID,
TEST_PACKAGE_NAME);
assertEquals(suggestion, suggestion1);
}
/**
* Check NetworkSuggestion equals returns {@code false} for 2 network suggestions with the same
* BSSID, key mgmt and UID, but different SSID.
*/
@Test
public void testWifiNetworkSuggestionEqualsFailsWhenSsidIsDifferent() {
WifiConfiguration configuration = new WifiConfiguration();
configuration.SSID = TEST_SSID;
configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
WifiNetworkSuggestion suggestion =
new WifiNetworkSuggestion(configuration, false, false, TEST_UID,
TEST_PACKAGE_NAME);
WifiConfiguration configuration1 = new WifiConfiguration();
configuration1.SSID = TEST_SSID_1;
configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
WifiNetworkSuggestion suggestion1 =
new WifiNetworkSuggestion(configuration1, false, false, TEST_UID,
TEST_PACKAGE_NAME);
assertNotEquals(suggestion, suggestion1);
}
/**
* Check NetworkSuggestion equals returns {@code false} for 2 network suggestions with the same
* SSID, key mgmt and UID, but different BSSID.
*/
@Test
public void testWifiNetworkSuggestionEqualsFailsWhenBssidIsDifferent() {
WifiConfiguration configuration = new WifiConfiguration();
configuration.SSID = TEST_SSID;
configuration.BSSID = TEST_BSSID;
configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
WifiNetworkSuggestion suggestion =
new WifiNetworkSuggestion(configuration, false, false, TEST_UID,
TEST_PACKAGE_NAME);
WifiConfiguration configuration1 = new WifiConfiguration();
configuration1.SSID = TEST_SSID;
configuration1.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
WifiNetworkSuggestion suggestion1 =
new WifiNetworkSuggestion(configuration1, false, false, TEST_UID,
TEST_PACKAGE_NAME);
assertNotEquals(suggestion, suggestion1);
}
/**
* Check NetworkSuggestion equals returns {@code false} for 2 network suggestions with the same
* SSID, BSSID and UID, but different key mgmt.
*/
@Test
public void testWifiNetworkSuggestionEqualsFailsWhenKeyMgmtIsDifferent() {
WifiConfiguration configuration = new WifiConfiguration();
configuration.SSID = TEST_SSID;
configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
WifiNetworkSuggestion suggestion =
new WifiNetworkSuggestion(configuration, false, false, TEST_UID,
TEST_PACKAGE_NAME);
WifiConfiguration configuration1 = new WifiConfiguration();
configuration1.SSID = TEST_SSID;
configuration1.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
WifiNetworkSuggestion suggestion1 =
new WifiNetworkSuggestion(configuration1, false, false, TEST_UID,
TEST_PACKAGE_NAME);
assertNotEquals(suggestion, suggestion1);
}
/**
* Check NetworkSuggestion equals returns {@code false} for 2 network suggestions with the same
* SSID, BSSID and key mgmt, but different UID.
*/
@Test
public void testWifiNetworkSuggestionEqualsFailsWhenUidIsDifferent() {
WifiConfiguration configuration = new WifiConfiguration();
configuration.SSID = TEST_SSID;
configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
WifiNetworkSuggestion suggestion =
new WifiNetworkSuggestion(configuration, false, false, TEST_UID,
TEST_PACKAGE_NAME);
WifiNetworkSuggestion suggestion1 =
new WifiNetworkSuggestion(configuration, false, false, TEST_UID_OTHER,
TEST_PACKAGE_NAME);
assertNotEquals(suggestion, suggestion1);
}
/**
* Check NetworkSuggestion equals returns {@code false} for 2 network suggestions with the same
* SSID, BSSID and key mgmt, but different package name.
*/
@Test
public void testWifiNetworkSuggestionEqualsFailsWhenPackageNameIsDifferent() {
WifiConfiguration configuration = new WifiConfiguration();
configuration.SSID = TEST_SSID;
configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
WifiNetworkSuggestion suggestion =
new WifiNetworkSuggestion(configuration, false, false, TEST_UID, TEST_PACKAGE_NAME);
WifiNetworkSuggestion suggestion1 =
new WifiNetworkSuggestion(configuration, false, false, TEST_UID,
TEST_PACKAGE_NAME_OTHER);
assertNotEquals(suggestion, suggestion1);
}
}