blob: 75cdfb5d4316d57930e5a237890f390078e5000a [file] [log] [blame]
/*
* Copyright (C) 2016 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 android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID;
import static android.net.wifi.WifiEnterpriseConfig.OCSP_NONE;
import static android.net.wifi.WifiEnterpriseConfig.OCSP_REQUIRE_CERT_STATUS;
import static com.android.server.wifi.WifiConfigurationUtil.addSecurityTypeToNetworkId;
import static com.android.server.wifi.WifiConfigurationUtil.convertWifiInfoSecurityTypeToWifiConfiguration;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.content.pm.UserInfo;
import android.net.IpConfiguration;
import android.net.MacAddress;
import android.net.wifi.ScanResult;
import android.net.wifi.SecurityParams;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiEnterpriseConfig;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiNetworkSpecifier;
import android.net.wifi.WifiScanner;
import android.os.PatternMatcher;
import android.util.Pair;
import androidx.test.filters.SmallTest;
import com.android.modules.utils.build.SdkLevel;
import org.junit.Test;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* Unit tests for {@link com.android.server.wifi.WifiConfigurationUtil}.
*/
@SmallTest
public class WifiConfigurationUtilTest extends WifiBaseTest {
static final int CURRENT_USER_ID = 0;
static final int CURRENT_USER_MANAGED_PROFILE_USER_ID = 10;
static final int OTHER_USER_ID = 11;
static final int TEST_UID = 10000;
static final String TEST_PACKAGE = "com.test";
static final String TEST_SSID = "\"test_ssid\"";
static final String TEST_SSID_1 = "\"test_ssid_1\"";
static final String TEST_BSSID = "aa:aa:11:22:cc:dd";
static final String TEST_BSSID_1 = "11:22:11:22:cc:dd";
static final List<UserInfo> PROFILES = Arrays.asList(
new UserInfo(CURRENT_USER_ID, "owner", 0),
new UserInfo(CURRENT_USER_MANAGED_PROFILE_USER_ID, "managed profile", 0));
/**
* Verify that new WifiEnterpriseConfig is detected.
*/
@Test
public void testEnterpriseConfigAdded() {
EnterpriseConfig eapConfig = new EnterpriseConfig(WifiEnterpriseConfig.Eap.TTLS)
.setPhase2(WifiEnterpriseConfig.Phase2.MSCHAPV2)
.setIdentity("username", "password")
.setCaCerts(new X509Certificate[]{FakeKeys.CA_CERT0});
assertTrue(WifiConfigurationUtil.hasEnterpriseConfigChanged(
null, eapConfig.enterpriseConfig));
}
/**
* Verify WifiEnterpriseConfig eap change is detected.
*/
@Test
public void testEnterpriseConfigEapChangeDetected() {
EnterpriseConfig eapConfig = new EnterpriseConfig(WifiEnterpriseConfig.Eap.TTLS);
EnterpriseConfig peapConfig = new EnterpriseConfig(WifiEnterpriseConfig.Eap.PEAP);
assertTrue(WifiConfigurationUtil.hasEnterpriseConfigChanged(eapConfig.enterpriseConfig,
peapConfig.enterpriseConfig));
}
/**
* Verify WifiEnterpriseConfig phase2 method change is detected.
*/
@Test
public void testEnterpriseConfigPhase2ChangeDetected() {
EnterpriseConfig eapConfig =
new EnterpriseConfig(WifiEnterpriseConfig.Eap.TTLS)
.setPhase2(WifiEnterpriseConfig.Phase2.MSCHAPV2);
EnterpriseConfig papConfig =
new EnterpriseConfig(WifiEnterpriseConfig.Eap.TTLS)
.setPhase2(WifiEnterpriseConfig.Phase2.PAP);
assertTrue(WifiConfigurationUtil.hasEnterpriseConfigChanged(eapConfig.enterpriseConfig,
papConfig.enterpriseConfig));
}
/**
* Verify WifiEnterpriseConfig added Certificate is detected.
*/
@Test
public void testCaCertificateAddedDetected() {
EnterpriseConfig eapConfigNoCerts = new EnterpriseConfig(WifiEnterpriseConfig.Eap.TTLS)
.setPhase2(WifiEnterpriseConfig.Phase2.MSCHAPV2)
.setIdentity("username", "password");
EnterpriseConfig eapConfig1Cert = new EnterpriseConfig(WifiEnterpriseConfig.Eap.TTLS)
.setPhase2(WifiEnterpriseConfig.Phase2.MSCHAPV2)
.setIdentity("username", "password")
.setCaCerts(new X509Certificate[]{FakeKeys.CA_CERT0});
assertTrue(WifiConfigurationUtil.hasEnterpriseConfigChanged(
eapConfigNoCerts.enterpriseConfig, eapConfig1Cert.enterpriseConfig));
}
/**
* Verify WifiEnterpriseConfig Certificate change is detected.
*/
@Test
public void testDifferentCaCertificateDetected() {
EnterpriseConfig eapConfig = new EnterpriseConfig(WifiEnterpriseConfig.Eap.TTLS)
.setPhase2(WifiEnterpriseConfig.Phase2.MSCHAPV2)
.setIdentity("username", "password")
.setCaCerts(new X509Certificate[]{FakeKeys.CA_CERT0});
EnterpriseConfig eapConfigNewCert = new EnterpriseConfig(WifiEnterpriseConfig.Eap.TTLS)
.setPhase2(WifiEnterpriseConfig.Phase2.MSCHAPV2)
.setIdentity("username", "password")
.setCaCerts(new X509Certificate[]{FakeKeys.CA_CERT1});
assertTrue(WifiConfigurationUtil.hasEnterpriseConfigChanged(eapConfig.enterpriseConfig,
eapConfigNewCert.enterpriseConfig));
}
/**
* Verify WifiEnterpriseConfig added Certificate changes are detected.
*/
@Test
public void testCaCertificateChangesDetected() {
EnterpriseConfig eapConfig = new EnterpriseConfig(WifiEnterpriseConfig.Eap.TTLS)
.setPhase2(WifiEnterpriseConfig.Phase2.MSCHAPV2)
.setIdentity("username", "password")
.setCaCerts(new X509Certificate[]{FakeKeys.CA_CERT0});
EnterpriseConfig eapConfigAddedCert = new EnterpriseConfig(WifiEnterpriseConfig.Eap.TTLS)
.setPhase2(WifiEnterpriseConfig.Phase2.MSCHAPV2)
.setIdentity("username", "password")
.setCaCerts(new X509Certificate[]{FakeKeys.CA_CERT0, FakeKeys.CA_CERT1});
assertTrue(WifiConfigurationUtil.hasEnterpriseConfigChanged(eapConfig.enterpriseConfig,
eapConfigAddedCert.enterpriseConfig));
}
/**
* Verify that WifiEnterpriseConfig does not detect changes for identical configs.
*/
@Test
public void testWifiEnterpriseConfigNoChanges() {
EnterpriseConfig eapConfig = new EnterpriseConfig(WifiEnterpriseConfig.Eap.TTLS)
.setPhase2(WifiEnterpriseConfig.Phase2.MSCHAPV2)
.setIdentity("username", "password")
.setCaCerts(new X509Certificate[]{FakeKeys.CA_CERT0, FakeKeys.CA_CERT1});
// Just to be clear that check is not against the same object
EnterpriseConfig eapConfigSame = new EnterpriseConfig(WifiEnterpriseConfig.Eap.TTLS)
.setPhase2(WifiEnterpriseConfig.Phase2.MSCHAPV2)
.setIdentity("username", "password")
.setCaCerts(new X509Certificate[]{FakeKeys.CA_CERT0, FakeKeys.CA_CERT1});
assertFalse(WifiConfigurationUtil.hasEnterpriseConfigChanged(eapConfig.enterpriseConfig,
eapConfigSame.enterpriseConfig));
}
/**
* Verify that the validate method successfully validates good WifiConfigurations with ASCII
* values.
*/
@Test
public void testValidatePositiveCases_AsciiSsidString() {
assertTrue(WifiConfigurationUtil.validate(
WifiConfigurationTestUtil.createOpenNetwork(),
WifiConfigurationUtil.VALIDATE_FOR_ADD));
assertTrue(WifiConfigurationUtil.validate(
WifiConfigurationTestUtil.createPskNetwork(),
WifiConfigurationUtil.VALIDATE_FOR_ADD));
assertTrue(WifiConfigurationUtil.validate(
WifiConfigurationTestUtil.createWepNetwork(),
WifiConfigurationUtil.VALIDATE_FOR_ADD));
assertTrue(WifiConfigurationUtil.validate(
WifiConfigurationTestUtil.createEapNetwork(),
WifiConfigurationUtil.VALIDATE_FOR_ADD));
assertTrue(WifiConfigurationUtil.validate(
WifiConfigurationTestUtil.createOweNetwork(),
WifiConfigurationUtil.VALIDATE_FOR_ADD));
assertTrue(WifiConfigurationUtil.validate(
WifiConfigurationTestUtil.createSaeNetwork(),
WifiConfigurationUtil.VALIDATE_FOR_ADD));
assertTrue(WifiConfigurationUtil.validate(
WifiConfigurationTestUtil.createEapSuiteBNetwork(),
WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method successfully validates good WifiConfigurations with hex
* values.
*/
@Test
public void testValidatePositiveCases_HexSsidString() {
WifiConfiguration config = WifiConfigurationTestUtil.createPskNetwork();
config.SSID = "abcd1234555a";
config.preSharedKey = "abcd123455151234556788990034556667332345667322344556676743233445";
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method validates WifiConfiguration with "any" in the BSSID field.
*/
@Test
public void testValidatePositiveCases_AnyBssidString() {
WifiConfiguration config = WifiConfigurationTestUtil.createPskNetwork();
config.BSSID = "any";
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
assertTrue(WifiConfigurationUtil.validate(
config, WifiConfigurationUtil.VALIDATE_FOR_UPDATE));
}
/**
* Verify that the validate method validates WifiConfiguration with masked psk string only for
* an update.
*/
@Test
public void testValidatePositiveCases_MaskedPskString() {
WifiConfiguration config = WifiConfigurationTestUtil.createPskNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.preSharedKey = WifiConfigurationUtil.PASSWORD_MASK;
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
assertTrue(WifiConfigurationUtil.validate(
config, WifiConfigurationUtil.VALIDATE_FOR_UPDATE));
}
/**
* Verify that the validate method validates WifiConfiguration with null ssid only for an
* update.
*/
@Test
public void testValidatePositiveCases_OnlyUpdateIgnoresNullSsid() {
WifiConfiguration config = new WifiConfiguration();
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
assertTrue(WifiConfigurationUtil.validate(
config, WifiConfigurationUtil.VALIDATE_FOR_UPDATE));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with bad ssid length.
*/
@Test
public void testValidateNegativeCases_BadAsciiSsidLength() {
WifiConfiguration config = WifiConfigurationTestUtil.createOpenNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.SSID = "\"abcdfefeeretretyetretetetetetrertertrsreqwrwe\"";
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.SSID = "\"\"";
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with bad ssid length.
*/
@Test
public void testValidateNegativeCases_BadUtf8SsidLength() {
WifiConfiguration config = WifiConfigurationTestUtil.createOpenNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.SSID = "\"가하아너너ㅓ저저ㅓ어아아다자저ㅓ더타아어어러두어\"";
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.SSID = "\"\"";
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with malformed ssid
* string.
*/
@Test
public void testValidateNegativeCases_MalformedAsciiSsidString() {
WifiConfiguration config = WifiConfigurationTestUtil.createOpenNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.SSID = "\"ab";
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with bad ssid length.
*/
@Test
public void testValidateNegativeCases_BadHexSsidLength() {
WifiConfiguration config = WifiConfigurationTestUtil.createOpenNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.SSID = "abcdfe012345632423343543453456464545656464545646454ace34534545634535";
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.SSID = "";
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with malformed ssid
* string.
*/
@Test
public void testValidateNegativeCases_MalformedHexSsidString() {
WifiConfiguration config = WifiConfigurationTestUtil.createOpenNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.SSID = "hello";
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with bad psk length.
*/
@Test
public void testValidateNegativeCases_BadAsciiPskLength() {
WifiConfiguration config = WifiConfigurationTestUtil.createPskNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.preSharedKey = "\"abcdffeeretretyetreteteteabe34tetrertertrsraaaaaaaaaaa345eqwrweewq"
+ "weqe\"";
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.preSharedKey = "\"454\"";
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with bad sae length.
*/
@Test
public void testValidateNegativeCases_BadAsciiSaeLength() {
WifiConfiguration config = WifiConfigurationTestUtil.createSaeNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.preSharedKey = "\"abcdffeeretretyetreteteteabe34tetrertertrsraaaaaaaaaaa345eqwrweewq"
+ "weqe\"";
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.preSharedKey = "\"\"";
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with malformed psk
* string.
*/
@Test
public void testValidateNegativeCases_MalformedAsciiPskString() {
WifiConfiguration config = WifiConfigurationTestUtil.createPskNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.preSharedKey = "\"abcdfefeeretrety";
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with malformed sae
* string.
*/
@Test
public void testValidateNegativeCases_MalformedAsciiSaeString() {
WifiConfiguration config = WifiConfigurationTestUtil.createSaeNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.preSharedKey = "\"abcdfefeeretrety";
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with bad psk length.
*/
@Test
public void testValidateNegativeCases_BadHexPskLength() {
WifiConfiguration config = WifiConfigurationTestUtil.createPskNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.preSharedKey = "abcd123456788990013453445345465465476546";
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.preSharedKey = "";
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with malformed psk
* string.
*/
@Test
public void testValidateNegativeCases_MalformedHexPskString() {
WifiConfiguration config = WifiConfigurationTestUtil.createPskNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.preSharedKey = "adbdfgretrtyrtyrty";
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with malformed sae
* string.
*/
@Test
public void testValidateNegativeCases_MalformedHexSaeString() {
WifiConfiguration config = WifiConfigurationTestUtil.createSaeNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.preSharedKey = "adbdfgretrtyrtyrty";
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method validates WifiConfiguration with masked wep key only for
* an update.
*/
@Test
public void testValidatePositiveCases_MaskedWepKeysString() {
WifiConfiguration config = WifiConfigurationTestUtil.createWepNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.wepKeys = new String[]{ WifiConfigurationUtil.PASSWORD_MASK,
WifiConfigurationUtil.PASSWORD_MASK,
WifiConfigurationUtil.PASSWORD_MASK,
WifiConfigurationUtil.PASSWORD_MASK};
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
assertTrue(WifiConfigurationUtil.validate(
config, WifiConfigurationUtil.VALIDATE_FOR_UPDATE));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with bad wep length.
*/
@Test
public void testValidateNegativeCases_BadWepKeysLength() {
WifiConfiguration config = WifiConfigurationTestUtil.createWepNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.wepKeys = new String[] {"\"abcd\""};
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.wepKeys = new String[] {"456"};
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
// Error scenario in b/169638868.
config.wepKeys = new String[] {""};
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with bad wep tx key idx.
*/
@Test
public void testValidateNegativeCases_BadWepTxKeysIndex() {
WifiConfiguration config = WifiConfigurationTestUtil.createWepNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
// Should be < wepKeys.length
config.wepTxKeyIndex = config.wepKeys.length;
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with bad key mgmt values.
*/
@Test
public void testValidateNegativeCases_BadKeyMgmtPskEap() {
WifiConfiguration config = WifiConfigurationTestUtil.createPskNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with bad key mgmt values.
*/
@Test
public void testValidateNegativeCases_BadKeyMgmtOpenPsk() {
WifiConfiguration config = WifiConfigurationTestUtil.createOpenNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with bad key mgmt values.
*/
@Test
public void testValidateNegativeCases_BadKeyMgmt() {
WifiConfiguration config = WifiConfigurationTestUtil.createPskNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with bad key mgmt values.
*/
@Test
public void testValidateNegativeCases_BadSuiteBKeyMgmt() {
WifiConfiguration config = WifiConfigurationTestUtil.createEapSuiteBNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.allowedKeyManagement.clear(WifiConfiguration.KeyMgmt.IEEE8021X);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with bad ipconfiguration
* values.
*/
@Test
public void testValidateNegativeCases_BadIpconfiguration() {
WifiConfiguration config = WifiConfigurationTestUtil.createPskNetwork();
IpConfiguration ipConfig =
WifiConfigurationTestUtil.createStaticIpConfigurationWithPacProxy();
config.setIpConfiguration(ipConfig);
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
ipConfig.setStaticIpConfiguration(null);
config.setIpConfiguration(ipConfig);
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with bad KeyMgmt value.
*/
@Test
public void testValidateNegativeCases_InvalidKeyMgmt() {
WifiConfiguration config = WifiConfigurationTestUtil.createOpenNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.FT_EAP + 1);
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with bad KeyMgmt value.
*/
@Test
public void testValidateNegativeCases_InvalidKeyMgmtWithPreSharedKey() {
WifiConfiguration config = WifiConfigurationTestUtil.createPskNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OSEN);
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
// Verify we reset the KeyMgmt
assertTrue(config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_PSK));
assertFalse(config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.OSEN));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with bad Protocol value.
*/
@Test
public void testValidateNegativeCases_InvalidProtocol() {
WifiConfiguration config = WifiConfigurationTestUtil.createOpenNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.allowedProtocols.set(4);
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with bad AuthAlgorithm
* value.
*/
@Test
public void testValidateNegativeCases_InvalidAuthAlgorithm() {
WifiConfiguration config = WifiConfigurationTestUtil.createOpenNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.LEAP + 3);
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with bad GroupCipher
* value.
*/
@Test
public void testValidateNegativeCases_InvalidGroupCipher() {
WifiConfiguration config = WifiConfigurationTestUtil.createOpenNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.GTK_NOT_USED + 4);
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with bad PairwiseCipher
* value.
*/
@Test
public void testValidateNegativeCases_InvalidPairwiseCipher() {
WifiConfiguration config = WifiConfigurationTestUtil.createOpenNetwork();
assertTrue(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP + 4);
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method successfully validates good WifiNetworkSpecifier with
* only ssid pattern set.
*/
@Test
public void testValidateNetworkSpecifierPositiveCases_SsidPattern() {
WifiNetworkSpecifier specifier = new WifiNetworkSpecifier(
new PatternMatcher(TEST_SSID, PatternMatcher.PATTERN_LITERAL),
Pair.create(WifiManager.ALL_ZEROS_MAC_ADDRESS, WifiManager.ALL_ZEROS_MAC_ADDRESS),
ScanResult.UNSPECIFIED,
WifiConfigurationTestUtil.createOpenNetwork());
assertTrue(WifiConfigurationUtil.validateNetworkSpecifier(specifier));
}
/**
* Verify that the validate method successfully validates good WifiNetworkSpecifier with
* only bssid pattern set.
*/
@Test
public void testValidateNetworkSpecifierPositiveCases_BssidPattern() {
WifiNetworkSpecifier specifier = new WifiNetworkSpecifier(
new PatternMatcher(".*", PatternMatcher.PATTERN_SIMPLE_GLOB),
Pair.create(MacAddress.fromString(TEST_BSSID), MacAddress.BROADCAST_ADDRESS),
ScanResult.UNSPECIFIED,
WifiConfigurationTestUtil.createOpenNetwork());
assertTrue(WifiConfigurationUtil.validateNetworkSpecifier(specifier));
}
/**
* Verify that the validate method successfully validates good WifiNetworkSpecifier with
* both ssid & bssid patterns set.
*/
@Test
public void testValidateNetworkSpecifierPositiveCases_BothSsidPatternAndBssidPattern() {
WifiNetworkSpecifier specifier = new WifiNetworkSpecifier(
new PatternMatcher(TEST_SSID, PatternMatcher.PATTERN_LITERAL),
Pair.create(MacAddress.fromString(TEST_BSSID), MacAddress.BROADCAST_ADDRESS),
ScanResult.UNSPECIFIED,
WifiConfigurationTestUtil.createOpenNetwork());
assertTrue(WifiConfigurationUtil.validateNetworkSpecifier(specifier));
}
/**
* Verify that the validate method validates a WifiNetworkSpecifier that specifies ssid, bssid,
* and band. Note that such requests will currently still be rejected by WifiNetworkFactory, but
* requesting specific bands may be supported in future releases.
*/
@Test
public void testValidateNetworkSpecifierPositiveCases_SsidPatternAndBssidPatternAndBand() {
WifiNetworkSpecifier specifier = new WifiNetworkSpecifier(
new PatternMatcher(TEST_SSID, PatternMatcher.PATTERN_LITERAL),
Pair.create(MacAddress.fromString(TEST_BSSID), MacAddress.BROADCAST_ADDRESS),
ScanResult.WIFI_BAND_5_GHZ,
WifiConfigurationTestUtil.createOpenNetwork());
assertTrue(WifiConfigurationUtil.validateNetworkSpecifier(specifier));
}
/**
* Verify that the validate method fails to validate WifiNetworkSpecifier with no
* ssid/bssid info.
*/
@Test
public void testValidateNetworkSpecifierNegativeCases_NoSsidBssid() {
WifiNetworkSpecifier specifier = new WifiNetworkSpecifier(
new PatternMatcher(".*", PatternMatcher.PATTERN_SIMPLE_GLOB),
Pair.create(WifiManager.ALL_ZEROS_MAC_ADDRESS, WifiManager.ALL_ZEROS_MAC_ADDRESS),
ScanResult.UNSPECIFIED,
WifiConfigurationTestUtil.createOpenNetwork());
assertFalse(WifiConfigurationUtil.validateNetworkSpecifier(specifier));
}
/**
* Verify that the validate method fails to validate WifiNetworkSpecifier with invalid SSID
* match pattern.
*/
@Test
public void testValidateNetworkSpecifierNegativeCases_MatchNoneSsidPattern() {
WifiNetworkSpecifier specifier = new WifiNetworkSpecifier(
new PatternMatcher("", PatternMatcher.PATTERN_LITERAL),
Pair.create(WifiManager.ALL_ZEROS_MAC_ADDRESS, WifiManager.ALL_ZEROS_MAC_ADDRESS),
ScanResult.UNSPECIFIED,
WifiConfigurationTestUtil.createOpenNetwork());
assertFalse(WifiConfigurationUtil.validateNetworkSpecifier(specifier));
}
/**
* Verify that the validate method fails to validate WifiNetworkSpecifier with illegal
* pattern.
*/
@Test
public void testValidateNetworkSpecifierNegativeCases_MatchNoneBssidPattern() {
WifiNetworkSpecifier specifier = new WifiNetworkSpecifier(
new PatternMatcher(TEST_SSID, PatternMatcher.PATTERN_LITERAL),
Pair.create(MacAddress.BROADCAST_ADDRESS, MacAddress.BROADCAST_ADDRESS),
ScanResult.UNSPECIFIED,
WifiConfigurationTestUtil.createOpenNetwork());
assertFalse(WifiConfigurationUtil.validateNetworkSpecifier(specifier));
}
/**
* Verify that the validate method fails to validate WifiNetworkSpecifier with illegal
* pattern.
*/
@Test
public void testValidateNetworkSpecifierNegativeCases_InvalidBssidPattern() {
WifiNetworkSpecifier specifier = new WifiNetworkSpecifier(
new PatternMatcher(TEST_SSID, PatternMatcher.PATTERN_LITERAL),
Pair.create(MacAddress.fromString(TEST_BSSID), WifiManager.ALL_ZEROS_MAC_ADDRESS),
ScanResult.UNSPECIFIED,
WifiConfigurationTestUtil.createOpenNetwork());
assertFalse(WifiConfigurationUtil.validateNetworkSpecifier(specifier));
}
/**
* Verify that the validate method fails to validate WifiNetworkSpecifier with SSID pattern
* for hidden network.
*/
@Test
public void testValidateNetworkSpecifierNegativeCases_NoSsidPatternForHiddenNetwork() {
WifiNetworkSpecifier specifier = new WifiNetworkSpecifier(
new PatternMatcher(TEST_SSID, PatternMatcher.PATTERN_PREFIX),
Pair.create(WifiManager.ALL_ZEROS_MAC_ADDRESS, WifiManager.ALL_ZEROS_MAC_ADDRESS),
ScanResult.UNSPECIFIED,
WifiConfigurationTestUtil.createOpenHiddenNetwork());
assertFalse(WifiConfigurationUtil.validateNetworkSpecifier(specifier));
}
/**
* Verify that the validate method fails to validate WifiNetworkSpecifier with an invalid band.
*/
@Test
public void testValidateNetworkSpecifierNegativeCases_InvalidBand() {
WifiNetworkSpecifier specifier = new WifiNetworkSpecifier(
new PatternMatcher(TEST_SSID, PatternMatcher.PATTERN_LITERAL),
Pair.create(MacAddress.fromString(TEST_BSSID), MacAddress.BROADCAST_ADDRESS),
42, // invalid
WifiConfigurationTestUtil.createOpenNetwork());
assertFalse(WifiConfigurationUtil.validateNetworkSpecifier(specifier));
}
/**
* Verify the instance of {@link android.net.wifi.WifiScanner.PnoSettings.PnoNetwork} created
* for an open network using {@link WifiConfigurationUtil#createPnoNetwork(
* WifiConfiguration)}.
*/
@Test
public void testCreatePnoNetworkWithOpenNetwork() {
WifiConfiguration network = WifiConfigurationTestUtil.createOpenNetwork();
WifiScanner.PnoSettings.PnoNetwork pnoNetwork =
WifiConfigurationUtil.createPnoNetwork(network);
assertEquals(network.SSID, pnoNetwork.ssid);
assertEquals(
WifiScanner.PnoSettings.PnoNetwork.FLAG_A_BAND
| WifiScanner.PnoSettings.PnoNetwork.FLAG_G_BAND, pnoNetwork.flags);
assertEquals(WifiScanner.PnoSettings.PnoNetwork.AUTH_CODE_OPEN, pnoNetwork.authBitField);
}
/**
* Verify the instance of {@link android.net.wifi.WifiScanner.PnoSettings.PnoNetwork} created
* for an open hidden network using {@link WifiConfigurationUtil#createPnoNetwork(
* WifiConfiguration)}.
*/
@Test
public void testCreatePnoNetworkWithOpenHiddenNetwork() {
WifiConfiguration network = WifiConfigurationTestUtil.createOpenHiddenNetwork();
WifiScanner.PnoSettings.PnoNetwork pnoNetwork =
WifiConfigurationUtil.createPnoNetwork(network);
assertEquals(network.SSID, pnoNetwork.ssid);
assertEquals(
WifiScanner.PnoSettings.PnoNetwork.FLAG_A_BAND
| WifiScanner.PnoSettings.PnoNetwork.FLAG_G_BAND
| WifiScanner.PnoSettings.PnoNetwork.FLAG_DIRECTED_SCAN, pnoNetwork.flags);
assertEquals(WifiScanner.PnoSettings.PnoNetwork.AUTH_CODE_OPEN, pnoNetwork.authBitField);
}
/**
* Verify the instance of {@link android.net.wifi.WifiScanner.PnoSettings.PnoNetwork} created
* for a PSK network using {@link WifiConfigurationUtil#createPnoNetwork(WifiConfiguration)
* }.
*/
@Test
public void testCreatePnoNetworkWithPskNetwork() {
WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork();
WifiScanner.PnoSettings.PnoNetwork pnoNetwork =
WifiConfigurationUtil.createPnoNetwork(network);
assertEquals(network.SSID, pnoNetwork.ssid);
assertEquals(
WifiScanner.PnoSettings.PnoNetwork.FLAG_A_BAND
| WifiScanner.PnoSettings.PnoNetwork.FLAG_G_BAND, pnoNetwork.flags);
assertEquals(WifiScanner.PnoSettings.PnoNetwork.AUTH_CODE_PSK, pnoNetwork.authBitField);
}
/**
* Verify that WifiConfigurationUtil.isSameNetwork returns true when two WifiConfiguration
* objects have the same parameters.
*/
@Test
public void testIsSameNetworkReturnsTrueOnSameNetwork() {
WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork(TEST_SSID);
WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork(TEST_SSID);
assertTrue(WifiConfigurationUtil.isSameNetwork(network, network1));
}
/**
* Verify that WifiConfigurationUtil.isSameNetwork returns true when two WifiConfiguration
* objects have the same parameters but different network selection BSSID's.
*/
@Test
public void testIsSameNetworkReturnsTrueOnSameNetworkWithDifferentBSSID() {
WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork(TEST_SSID);
network.getNetworkSelectionStatus().setNetworkSelectionBSSID(TEST_BSSID);
WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork(TEST_SSID);
network1.getNetworkSelectionStatus().setNetworkSelectionBSSID(TEST_BSSID_1);
assertTrue(WifiConfigurationUtil.isSameNetwork(network, network1));
}
/**
* Verify that WifiConfigurationUtil.isSameNetwork returns false when two WifiConfiguration
* objects have the different SSIDs.
*/
@Test
public void testIsSameNetworkReturnsFalseOnDifferentSSID() {
WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork(TEST_SSID);
WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork(TEST_SSID_1);
assertFalse(WifiConfigurationUtil.isSameNetwork(network, network1));
}
/**
* Verify that WifiConfigurationUtil.isSameNetwork returns false when two WifiConfiguration
* objects have the different security type.
*/
@Test
public void testIsSameNetworkReturnsFalseOnDifferentSecurityType() {
WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork(TEST_SSID);
WifiConfiguration network1 = WifiConfigurationTestUtil.createEapNetwork(TEST_SSID);
assertFalse(WifiConfigurationUtil.isSameNetwork(network, network1));
}
/**
* Verify that WifiConfigurationUtil.isSameNetwork returns false when two WifiConfiguration
* objects have the different EAP identity.
*/
@Test
public void testIsSameNetworkReturnsFalseOnDifferentEapIdentity() {
WifiConfiguration network1 = WifiConfigurationTestUtil.createEapNetwork(TEST_SSID);
WifiConfiguration network2 = WifiConfigurationTestUtil.createEapNetwork(TEST_SSID);
network1.enterpriseConfig.setIdentity("Identity1");
network2.enterpriseConfig.setIdentity("Identity2");
assertFalse(WifiConfigurationUtil.isSameNetwork(network1, network2));
}
/**
* Verify that WifiConfigurationUtil.isSameNetwork returns false when two WifiConfiguration
* objects have the different EAP anonymous identity.
*/
@Test
public void testIsSameNetworkReturnsFalseOnDifferentEapAnonymousIdentity() {
WifiConfiguration network1 = WifiConfigurationTestUtil.createEapNetwork(TEST_SSID);
WifiConfiguration network2 = WifiConfigurationTestUtil.createEapNetwork(TEST_SSID);
network1.enterpriseConfig.setAnonymousIdentity("Identity1");
network2.enterpriseConfig.setAnonymousIdentity("Identity2");
assertFalse(WifiConfigurationUtil.isSameNetwork(network1, network2));
}
/**
* Verify that WifiConfigurationUtil.isSameNetwork returns true when two WifiConfiguration
* objects have the different EAP anonymous(pseudonym) identity in EAP-SIM.
*/
@Test
public void testIsSameNetworkReturnsTrueOnDifferentEapAnonymousIdentityInEapSim() {
WifiConfiguration network1 = WifiConfigurationTestUtil.createEapNetwork(TEST_SSID);
WifiConfiguration network2 = WifiConfigurationTestUtil.createEapNetwork(TEST_SSID);
network1.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM);
network2.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM);
network1.enterpriseConfig.setAnonymousIdentity("Identity1");
network2.enterpriseConfig.setAnonymousIdentity("Identity2");
assertTrue(WifiConfigurationUtil.isSameNetwork(network1, network2));
}
/**
* Verify that WifiConfigurationUtil.isSameNetwork returns true when two WifiConfiguration
* objects have the same candidate security params.
*/
@Test
public void testIsSameNetworkReturnsTrueOnSameNetworkWithSameCandidateSecurityParams() {
WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork(TEST_SSID);
network.getNetworkSelectionStatus().setCandidateSecurityParams(
SecurityParams.createSecurityParamsBySecurityType(
WifiConfiguration.SECURITY_TYPE_PSK));
WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork(TEST_SSID);
network1.getNetworkSelectionStatus().setCandidateSecurityParams(
SecurityParams.createSecurityParamsBySecurityType(
WifiConfiguration.SECURITY_TYPE_PSK));
assertTrue(WifiConfigurationUtil.isSameNetwork(network, network1));
}
/**
* Verify that WifiConfigurationUtil.isSameNetwork returns false when two WifiConfiguration
* objects have the different candidate security params.
*/
@Test
public void testIsSameNetworkReturnsTrueOnSameNetworkWithDifferentCandidateSecurityParams() {
WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork(TEST_SSID);
network.getNetworkSelectionStatus().setCandidateSecurityParams(
SecurityParams.createSecurityParamsBySecurityType(
WifiConfiguration.SECURITY_TYPE_PSK));
WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork(TEST_SSID);
network1.getNetworkSelectionStatus().setCandidateSecurityParams(
SecurityParams.createSecurityParamsBySecurityType(
WifiConfiguration.SECURITY_TYPE_SAE));
assertFalse(WifiConfigurationUtil.isSameNetwork(network, network1));
}
/**
* Verify the instance of {@link android.net.wifi.WifiScanner.PnoSettings.PnoNetwork} created
* for a EAP network using {@link WifiConfigurationUtil#createPnoNetwork(WifiConfiguration)
* }.
*/
@Test
public void testCreatePnoNetworkWithEapNetwork() {
WifiConfiguration network = WifiConfigurationTestUtil.createEapNetwork();
WifiScanner.PnoSettings.PnoNetwork pnoNetwork =
WifiConfigurationUtil.createPnoNetwork(network);
assertEquals(network.SSID, pnoNetwork.ssid);
assertEquals(
WifiScanner.PnoSettings.PnoNetwork.FLAG_A_BAND
| WifiScanner.PnoSettings.PnoNetwork.FLAG_G_BAND, pnoNetwork.flags);
assertEquals(WifiScanner.PnoSettings.PnoNetwork.AUTH_CODE_EAPOL, pnoNetwork.authBitField);
}
/**
* Verify that the generalized
* {@link com.android.server.wifi.WifiConfigurationUtil.WifiConfigurationComparator}
* can be used to sort a List given a 'compareNetworkWithSameStatus' method.
*/
@Test
public void testPnoListComparator() {
List<WifiConfiguration> networks = new ArrayList<>();
final WifiConfiguration enabledNetwork1 = WifiConfigurationTestUtil.createEapNetwork();
enabledNetwork1.getNetworkSelectionStatus().setNetworkSelectionStatus(
WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLED);
final WifiConfiguration enabledNetwork2 = WifiConfigurationTestUtil.createEapNetwork();
enabledNetwork2.getNetworkSelectionStatus().setNetworkSelectionStatus(
WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLED);
final WifiConfiguration tempDisabledNetwork1 = WifiConfigurationTestUtil.createEapNetwork();
tempDisabledNetwork1.getNetworkSelectionStatus().setNetworkSelectionStatus(
WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_TEMPORARY_DISABLED);
final WifiConfiguration tempDisabledNetwork2 = WifiConfigurationTestUtil.createEapNetwork();
tempDisabledNetwork2.getNetworkSelectionStatus().setNetworkSelectionStatus(
WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_TEMPORARY_DISABLED);
WifiConfiguration permDisabledNetwork = WifiConfigurationTestUtil.createEapNetwork();
permDisabledNetwork.getNetworkSelectionStatus().setNetworkSelectionStatus(
WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_PERMANENTLY_DISABLED);
// Add all the networks to the list.
networks.add(tempDisabledNetwork1);
networks.add(enabledNetwork1);
networks.add(permDisabledNetwork);
networks.add(tempDisabledNetwork2);
networks.add(enabledNetwork2);
// Prefer |enabledNetwork1| over |enabledNetwork2| and |tempDisabledNetwork1| over
// |tempDisabledNetwork2|.
WifiConfigurationUtil.WifiConfigurationComparator comparator =
new WifiConfigurationUtil.WifiConfigurationComparator() {
@Override
public int compareNetworksWithSameStatus(
WifiConfiguration a, WifiConfiguration b) {
if (a == enabledNetwork1 && b == enabledNetwork2) {
return -1;
} else if (b == enabledNetwork1 && a == enabledNetwork2) {
return 1;
} else if (a == tempDisabledNetwork1 && b == tempDisabledNetwork2) {
return -1;
} else if (b == tempDisabledNetwork1 && a == tempDisabledNetwork2) {
return 1;
}
return 0;
}
};
Collections.sort(networks, comparator);
// Now ensure that the networks were sorted correctly.
assertEquals(enabledNetwork1, networks.get(0));
assertEquals(enabledNetwork2, networks.get(1));
assertEquals(tempDisabledNetwork1, networks.get(2));
assertEquals(tempDisabledNetwork2, networks.get(3));
assertEquals(permDisabledNetwork, networks.get(4));
}
/**
* Verifies that when the existing configuration is null and macRandomizationSetting in the
* newConfig is the default value, then hasMacRandomizationSettingsChanged returns false.
*/
@Test
public void testHasMacRandomizationSettingsChangedNullExistingConfigDefaultNewConfig() {
WifiConfiguration newConfig = new WifiConfiguration();
assertFalse(WifiConfigurationUtil.hasMacRandomizationSettingsChanged(null, newConfig));
}
/**
* Verifies that when the existing configuration is null and macRandomizationSetting in the
* newConfig is not the default value, then hasMacRandomizationSettingsChanged returns true.
*/
@Test
public void testHasMacRandomizationSettingsChangedNullExistingConfigModifiedNewConfig() {
WifiConfiguration newConfig = new WifiConfiguration();
newConfig.macRandomizationSetting = WifiConfiguration.RANDOMIZATION_NONE;
assertTrue(WifiConfigurationUtil.hasMacRandomizationSettingsChanged(null, newConfig));
}
/**
* Verifies that when macRandomizationSetting in the newConfig is different from existingConfig
* hasMacRandomizationSettingsChanged returns true.
*/
@Test
public void testHasMacRandomizationSettingsChangedFieldsDifferent() {
WifiConfiguration existingConfig = new WifiConfiguration();
WifiConfiguration newConfig = new WifiConfiguration();
newConfig.macRandomizationSetting = WifiConfiguration.RANDOMIZATION_NONE;
assertTrue(WifiConfigurationUtil.hasMacRandomizationSettingsChanged(
existingConfig, newConfig));
}
/**
* Verifies that when macRandomizationSetting in the newConfig is the same as existingConfig
* hasMacRandomizationSettingsChanged returns false.
*/
@Test
public void testHasMacRandomizationSettingsChangedFieldsSame() {
WifiConfiguration existingConfig = new WifiConfiguration();
existingConfig.macRandomizationSetting = WifiConfiguration.RANDOMIZATION_NONE;
WifiConfiguration newConfig = new WifiConfiguration();
newConfig.macRandomizationSetting = WifiConfiguration.RANDOMIZATION_NONE;
assertFalse(WifiConfigurationUtil.hasMacRandomizationSettingsChanged(
existingConfig, newConfig));
}
private static class EnterpriseConfig {
public String eap;
public String phase2;
public String identity;
public String password;
public X509Certificate[] caCerts;
public WifiEnterpriseConfig enterpriseConfig;
public String wapiCertSuite;
EnterpriseConfig(int eapMethod) {
enterpriseConfig = new WifiEnterpriseConfig();
enterpriseConfig.setEapMethod(eapMethod);
eap = WifiEnterpriseConfig.Eap.strings[eapMethod];
}
public EnterpriseConfig setPhase2(int phase2Method) {
enterpriseConfig.setPhase2Method(phase2Method);
phase2 = "auth=" + WifiEnterpriseConfig.Phase2.strings[phase2Method];
return this;
}
public EnterpriseConfig setIdentity(String identity, String password) {
enterpriseConfig.setIdentity(identity);
enterpriseConfig.setPassword(password);
this.identity = identity;
this.password = password;
return this;
}
public EnterpriseConfig setCaCerts(X509Certificate[] certs) {
enterpriseConfig.setCaCertificates(certs);
caCerts = certs;
return this;
}
public EnterpriseConfig setWapiCertSuite(String certSuite) {
enterpriseConfig.setWapiCertSuite(certSuite);
wapiCertSuite = certSuite;
return this;
}
}
/**
* Verify WifiEnterpriseConfig CA Certificate alias changes are detected.
*/
@Test
public void testCaCertificateAliasChangesDetected() {
EnterpriseConfig eapConfig1 = new EnterpriseConfig(WifiEnterpriseConfig.Eap.TTLS)
.setPhase2(WifiEnterpriseConfig.Phase2.MSCHAPV2)
.setIdentity("username", "password");
eapConfig1.enterpriseConfig.setCaCertificateAlias("ALIAS_1");
EnterpriseConfig eapConfig2 = new EnterpriseConfig(WifiEnterpriseConfig.Eap.TTLS)
.setPhase2(WifiEnterpriseConfig.Phase2.MSCHAPV2)
.setIdentity("username", "password");
eapConfig2.enterpriseConfig.setCaCertificateAlias("ALIAS_2");
assertTrue(WifiConfigurationUtil.hasEnterpriseConfigChanged(eapConfig1.enterpriseConfig,
eapConfig2.enterpriseConfig));
}
/**
* Verify WifiEnterpriseConfig Client Certificate alias changes are detected.
*/
@Test
public void testClientCertificateAliasChangesDetected() {
EnterpriseConfig eapConfig1 = new EnterpriseConfig(WifiEnterpriseConfig.Eap.TLS);
eapConfig1.enterpriseConfig.setCaCertificateAlias("ALIAS_1");
eapConfig1.enterpriseConfig.setClientCertificateAlias("CLIENT_ALIAS_1");
EnterpriseConfig eapConfig2 = new EnterpriseConfig(WifiEnterpriseConfig.Eap.TTLS);
eapConfig2.enterpriseConfig.setCaCertificateAlias("ALIAS_1");
eapConfig2.enterpriseConfig.setClientCertificateAlias("CLIENT_ALIAS_2");
assertTrue(WifiConfigurationUtil.hasEnterpriseConfigChanged(eapConfig1.enterpriseConfig,
eapConfig2.enterpriseConfig));
}
/**
* Verify WifiEnterpriseConfig OCSP changes are detected.
*/
@Test
public void testOcspChangesDetected() {
EnterpriseConfig eapConfig1 = new EnterpriseConfig(WifiEnterpriseConfig.Eap.TTLS)
.setPhase2(WifiEnterpriseConfig.Phase2.MSCHAPV2)
.setIdentity("username", "password")
.setCaCerts(new X509Certificate[]{FakeKeys.CA_CERT0});
eapConfig1.enterpriseConfig.setOcsp(OCSP_NONE);
EnterpriseConfig eapConfig2 = new EnterpriseConfig(WifiEnterpriseConfig.Eap.TTLS)
.setPhase2(WifiEnterpriseConfig.Phase2.MSCHAPV2)
.setIdentity("username", "password")
.setCaCerts(new X509Certificate[]{FakeKeys.CA_CERT0});
eapConfig2.enterpriseConfig.setOcsp(OCSP_REQUIRE_CERT_STATUS);
assertTrue(WifiConfigurationUtil.hasEnterpriseConfigChanged(eapConfig1.enterpriseConfig,
eapConfig2.enterpriseConfig));
}
/**
* Verify WifiEnterpriseConfig subject match changes are detected.
*/
@Test
public void testSubjectMatchChangesDetected() {
EnterpriseConfig eapConfig1 = new EnterpriseConfig(WifiEnterpriseConfig.Eap.TTLS)
.setPhase2(WifiEnterpriseConfig.Phase2.MSCHAPV2)
.setIdentity("username", "password")
.setCaCerts(new X509Certificate[]{FakeKeys.CA_CERT0});
eapConfig1.enterpriseConfig.setAltSubjectMatch("domain1.com");
EnterpriseConfig eapConfig2 = new EnterpriseConfig(WifiEnterpriseConfig.Eap.TTLS)
.setPhase2(WifiEnterpriseConfig.Phase2.MSCHAPV2)
.setIdentity("username", "password")
.setCaCerts(new X509Certificate[]{FakeKeys.CA_CERT0});
eapConfig1.enterpriseConfig.setAltSubjectMatch("domain2.com");
assertTrue(WifiConfigurationUtil.hasEnterpriseConfigChanged(eapConfig1.enterpriseConfig,
eapConfig2.enterpriseConfig));
}
/**
* Verify that new WifiEnterpriseConfig is detected.
*/
@Test
public void testEnterpriseConfigWapiCertChanged() {
EnterpriseConfig eapConfig1 = new EnterpriseConfig(WifiEnterpriseConfig.Eap.WAPI_CERT)
.setWapiCertSuite("WapiCertSuite1");
EnterpriseConfig eapConfig2 = new EnterpriseConfig(WifiEnterpriseConfig.Eap.WAPI_CERT)
.setWapiCertSuite("WapiCertSuite2");
assertTrue(WifiConfigurationUtil.hasEnterpriseConfigChanged(
eapConfig1.enterpriseConfig, eapConfig2.enterpriseConfig));
}
/**
* Verify that a WAPI config is not considered an OPEN config.
*/
@Test
public void testWapiConfigNotOpenConfig() {
WifiConfiguration wapiPskConfig = new WifiConfiguration();
wapiPskConfig.setSecurityParams(WifiConfiguration.SECURITY_TYPE_WAPI_CERT);
assertFalse(WifiConfigurationUtil.isConfigForOpenNetwork(wapiPskConfig));
WifiConfiguration wapiCertConfig = new WifiConfiguration();
wapiCertConfig.setSecurityParams(WifiConfiguration.SECURITY_TYPE_WAPI_CERT);
assertFalse(WifiConfigurationUtil.isConfigForOpenNetwork(wapiCertConfig));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with malformed
* enterprise configuration
*/
@Test
public void testValidateNegativeCases_MalformedEnterpriseConfig() {
WifiConfiguration config = new WifiConfiguration();
config.SSID = "\"someNetwork\"";
config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP);
// EAP method is kept as Eap.NONE - should not crash, but return invalid ID
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE);
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE_192_BIT);
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
}
/**
* Verify that the validate method fails to validate WifiConfiguration with enterprise
* configuration that is missing the identity and/or password.
*/
@Test
public void testValidateNegativeCases_NoIdentityOrPasswordEnterpriseConfig() {
WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork();
config.enterpriseConfig.setIdentity(null);
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
assertFalse(WifiConfigurationUtil.validate(config,
WifiConfigurationUtil.VALIDATE_FOR_UPDATE));
config = WifiConfigurationTestUtil.createEapNetwork();
config.enterpriseConfig.setPassword(null);
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
assertTrue(WifiConfigurationUtil.validate(config,
WifiConfigurationUtil.VALIDATE_FOR_UPDATE));
config = WifiConfigurationTestUtil.createWpa3EnterpriseNetwork(TEST_SSID);
config.enterpriseConfig.setIdentity(null);
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
assertFalse(WifiConfigurationUtil.validate(config,
WifiConfigurationUtil.VALIDATE_FOR_UPDATE));
config = WifiConfigurationTestUtil.createWpa3EnterpriseNetwork(TEST_SSID);
config.enterpriseConfig.setPassword(null);
assertFalse(WifiConfigurationUtil.validate(config, WifiConfigurationUtil.VALIDATE_FOR_ADD));
assertTrue(WifiConfigurationUtil.validate(config,
WifiConfigurationUtil.VALIDATE_FOR_UPDATE));
}
/**
* Verify the behavior of convertWifiInfoSecurityTypeToWifiConfiguration
*/
@Test
public void testConvertWifiInfoSecurityTypeToWifiConfiguration() {
assertEquals(WifiConfiguration.SECURITY_TYPE_OPEN,
convertWifiInfoSecurityTypeToWifiConfiguration(WifiInfo.SECURITY_TYPE_OPEN));
assertEquals(WifiConfiguration.SECURITY_TYPE_WEP,
convertWifiInfoSecurityTypeToWifiConfiguration(WifiInfo.SECURITY_TYPE_WEP));
assertEquals(WifiConfiguration.SECURITY_TYPE_PSK,
convertWifiInfoSecurityTypeToWifiConfiguration(WifiInfo.SECURITY_TYPE_PSK));
assertEquals(WifiConfiguration.SECURITY_TYPE_EAP,
convertWifiInfoSecurityTypeToWifiConfiguration(WifiInfo.SECURITY_TYPE_EAP));
assertEquals(WifiConfiguration.SECURITY_TYPE_SAE,
convertWifiInfoSecurityTypeToWifiConfiguration(WifiInfo.SECURITY_TYPE_SAE));
assertEquals(WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE_192_BIT,
convertWifiInfoSecurityTypeToWifiConfiguration(
WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE_192_BIT));
assertEquals(WifiConfiguration.SECURITY_TYPE_OWE,
convertWifiInfoSecurityTypeToWifiConfiguration(WifiInfo.SECURITY_TYPE_OWE));
assertEquals(WifiConfiguration.SECURITY_TYPE_WAPI_PSK,
convertWifiInfoSecurityTypeToWifiConfiguration(WifiInfo.SECURITY_TYPE_WAPI_PSK));
assertEquals(WifiConfiguration.SECURITY_TYPE_WAPI_CERT,
convertWifiInfoSecurityTypeToWifiConfiguration(WifiInfo.SECURITY_TYPE_WAPI_CERT));
assertEquals(WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE,
convertWifiInfoSecurityTypeToWifiConfiguration(
WifiInfo.SECURITY_TYPE_EAP_WPA3_ENTERPRISE));
assertEquals(WifiConfiguration.SECURITY_TYPE_OSEN,
convertWifiInfoSecurityTypeToWifiConfiguration(WifiInfo.SECURITY_TYPE_OSEN));
assertEquals(WifiConfiguration.SECURITY_TYPE_PASSPOINT_R1_R2,
convertWifiInfoSecurityTypeToWifiConfiguration(
WifiInfo.SECURITY_TYPE_PASSPOINT_R1_R2));
assertEquals(WifiConfiguration.SECURITY_TYPE_PASSPOINT_R3,
convertWifiInfoSecurityTypeToWifiConfiguration(
WifiInfo.SECURITY_TYPE_PASSPOINT_R3));
assertEquals(-1, convertWifiInfoSecurityTypeToWifiConfiguration(13));
assertEquals(-1,
convertWifiInfoSecurityTypeToWifiConfiguration(WifiInfo.SECURITY_TYPE_UNKNOWN));
}
/**
* Verify that adding and removing the security type for network ID behaves correctly
*/
@Test
public void testAddAndRemoveSecurityTypeForNetworkId() {
List<Integer> securityList = Arrays.asList(
WifiConfiguration.SECURITY_TYPE_OPEN,
WifiConfiguration.SECURITY_TYPE_WEP,
WifiConfiguration.SECURITY_TYPE_PSK,
WifiConfiguration.SECURITY_TYPE_EAP,
WifiConfiguration.SECURITY_TYPE_SAE,
WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE_192_BIT,
WifiConfiguration.SECURITY_TYPE_OWE,
WifiConfiguration.SECURITY_TYPE_WAPI_PSK,
WifiConfiguration.SECURITY_TYPE_WAPI_CERT,
WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE,
WifiConfiguration.SECURITY_TYPE_OSEN,
WifiConfiguration.SECURITY_TYPE_PASSPOINT_R1_R2,
WifiConfiguration.SECURITY_TYPE_PASSPOINT_R3
);
final int netId = 1;
if (!SdkLevel.isAtLeastS()) {
// INVALID_NET_ID should remain the same from either adding or removing
assertEquals(INVALID_NETWORK_ID, WifiConfigurationUtil.addSecurityTypeToNetworkId(
INVALID_NETWORK_ID, WifiConfiguration.SECURITY_TYPE_OPEN));
assertEquals(INVALID_NETWORK_ID, WifiConfigurationUtil.removeSecurityTypeFromNetworkId(
INVALID_NETWORK_ID));
// Add and then remove should result in the original netId
for (@WifiConfiguration.SecurityType int securityType : securityList) {
assertEquals(netId, WifiConfigurationUtil.removeSecurityTypeFromNetworkId(
WifiConfigurationUtil.addSecurityTypeToNetworkId(
netId, securityType)));
}
// Multiple removes should result in the same netId as a single remove
for (@WifiConfiguration.SecurityType int securityType : securityList) {
assertEquals(WifiConfigurationUtil.removeSecurityTypeFromNetworkId(netId),
WifiConfigurationUtil.removeSecurityTypeFromNetworkId(
WifiConfigurationUtil.removeSecurityTypeFromNetworkId(
WifiConfigurationUtil.addSecurityTypeToNetworkId(
netId, securityType))));
}
// A unique net id should be created for each security type added
assertEquals(securityList.size(), securityList.stream()
.map(security -> addSecurityTypeToNetworkId(netId, security))
.distinct()
.count());
} else {
// Add should do nothing for SDK level S and above.
for (@WifiConfiguration.SecurityType int securityType : securityList) {
assertEquals(netId, addSecurityTypeToNetworkId(netId, securityType));
}
}
}
}