blob: 980b199c04b8a4b8b9549cae90796f91480171a1 [file] [log] [blame]
/*
* Copyright (C) 2017 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.hotspot2.pps;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.os.Parcel;
import android.util.Base64;
import androidx.test.filters.SmallTest;
import org.junit.Test;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Unit tests for {@link android.net.wifi.hotspot2.pps.Policy}.
*/
@SmallTest
public class PolicyTest {
private static final int MAX_NUMBER_OF_EXCLUDED_SSIDS = 128;
private static final int MAX_SSID_BYTES = 32;
private static final int MAX_PORT_STRING_BYTES = 64;
/**
* Helper function for creating a {@link Policy} for testing.
*
* @return {@link Policy}
*/
private static Policy createPolicy() {
Policy policy = new Policy();
policy.setMinHomeDownlinkBandwidth(123);
policy.setMinHomeUplinkBandwidth(345);
policy.setMinRoamingDownlinkBandwidth(567);
policy.setMinRoamingUplinkBandwidth(789);
policy.setExcludedSsidList(new String[] {"ssid1", "ssid2"});
Map<Integer, String> requiredProtoPortMap = new HashMap<>();
requiredProtoPortMap.put(12, "23,342,123");
requiredProtoPortMap.put(23, "789,372,1235");
policy.setRequiredProtoPortMap(requiredProtoPortMap);
policy.setMaximumBssLoadValue(12);
List<Policy.RoamingPartner> preferredRoamingPartnerList = new ArrayList<>();
Policy.RoamingPartner partner1 = new Policy.RoamingPartner();
partner1.setFqdn("partner1.com");
partner1.setFqdnExactMatch(true);
partner1.setPriority(12);
partner1.setCountries("us,jp");
Policy.RoamingPartner partner2 = new Policy.RoamingPartner();
partner2.setFqdn("partner2.com");
partner2.setFqdnExactMatch(false);
partner2.setPriority(42);
partner2.setCountries("ca,fr");
preferredRoamingPartnerList.add(partner1);
preferredRoamingPartnerList.add(partner2);
policy.setPreferredRoamingPartnerList(preferredRoamingPartnerList);
UpdateParameter policyUpdate = new UpdateParameter();
policyUpdate.setUpdateIntervalInMinutes(1712);
policyUpdate.setUpdateMethod(UpdateParameter.UPDATE_METHOD_OMADM);
policyUpdate.setRestriction(UpdateParameter.UPDATE_RESTRICTION_HOMESP);
policyUpdate.setServerUri("policy.update.com");
policyUpdate.setUsername("username");
policyUpdate.setBase64EncodedPassword(
Base64.encodeToString("password".getBytes(), Base64.DEFAULT));
policyUpdate.setTrustRootCertUrl("trust.cert.com");
policyUpdate.setTrustRootCertSha256Fingerprint(new byte[32]);
policy.setPolicyUpdate(policyUpdate);
return policy;
}
/**
* Helper function for verifying Policy after parcel write then read.
* @param policyToWrite
* @throws Exception
*/
private static void verifyParcel(Policy policyToWrite) throws Exception {
Parcel parcel = Parcel.obtain();
policyToWrite.writeToParcel(parcel, 0);
parcel.setDataPosition(0); // Rewind data position back to the beginning for read.
Policy policyFromRead = Policy.CREATOR.createFromParcel(parcel);
assertTrue(policyFromRead.equals(policyToWrite));
}
/**
* Verify parcel read/write for an empty Policy.
*
* @throws Exception
*/
@Test
public void verifyParcelWithEmptyPolicy() throws Exception {
verifyParcel(new Policy());
}
/**
* Verify parcel read/write for a Policy with all fields set.
*
* @throws Exception
*/
@Test
public void verifyParcelWithFullPolicy() throws Exception {
verifyParcel(createPolicy());
}
/**
* Verify parcel read/write for a Policy without protocol port map.
*
* @throws Exception
*/
@Test
public void verifyParcelWithoutProtoPortMap() throws Exception {
Policy policy = createPolicy();
policy.setRequiredProtoPortMap(null);
verifyParcel(policy);
}
/**
* Verify parcel read/write for a Policy without preferred roaming partner list.
*
* @throws Exception
*/
@Test
public void verifyParcelWithoutPreferredRoamingPartnerList() throws Exception {
Policy policy = createPolicy();
policy.setPreferredRoamingPartnerList(null);
verifyParcel(policy);
}
/**
* Verify parcel read/write for a Policy without policy update parameters.
*
* @throws Exception
*/
@Test
public void verifyParcelWithoutPolicyUpdate() throws Exception {
Policy policy = createPolicy();
policy.setPolicyUpdate(null);
verifyParcel(policy);
}
/**
* Verify that policy created using copy constructor with null source should be the same
* as the policy created using default constructor.
*
* @throws Exception
*/
@Test
public void verifyCopyConstructionWithNullSource() throws Exception {
Policy copyPolicy = new Policy(null);
Policy defaultPolicy = new Policy();
assertTrue(defaultPolicy.equals(copyPolicy));
}
/**
* Verify that policy created using copy constructor with a valid source should be the
* same as the source.
*
* @throws Exception
*/
@Test
public void verifyCopyConstructionWithFullPolicy() throws Exception {
Policy policy = createPolicy();
Policy copyPolicy = new Policy(policy);
assertTrue(policy.equals(copyPolicy));
}
/**
* Verify that a default policy (with no informatio) is invalid.
*
* @throws Exception
*/
@Test
public void validatePolicyWithDefault() throws Exception {
Policy policy = new Policy();
assertFalse(policy.validate());
}
/**
* Verify that a policy created using {@link #createPolicy} is valid, since all fields are
* filled in with valid values.
*
* @throws Exception
*/
@Test
public void validatePolicyWithFullPolicy() throws Exception {
assertTrue(createPolicy().validate());
}
/**
* Verify that a policy without policy update parameters is invalid.
*
* @throws Exception
*/
@Test
public void validatePolicyWithoutPolicyUpdate() throws Exception {
Policy policy = createPolicy();
policy.setPolicyUpdate(null);
assertFalse(policy.validate());
}
/**
* Verify that a policy with invalid policy update parameters is invalid.
*
* @throws Exception
*/
@Test
public void validatePolicyWithInvalidPolicyUpdate() throws Exception {
Policy policy = createPolicy();
policy.setPolicyUpdate(new UpdateParameter());
assertFalse(policy.validate());
}
/**
* Verify that a policy with a preferred roaming partner with FQDN not specified is invalid.
*
* @throws Exception
*/
@Test
public void validatePolicyWithRoamingPartnerWithoutFQDN() throws Exception {
Policy policy = createPolicy();
Policy.RoamingPartner partner = new Policy.RoamingPartner();
partner.setFqdnExactMatch(true);
partner.setPriority(12);
partner.setCountries("us,jp");
policy.getPreferredRoamingPartnerList().add(partner);
assertFalse(policy.validate());
}
/**
* Verify that a policy with a preferred roaming partner with countries not specified is
* invalid.
*
* @throws Exception
*/
@Test
public void validatePolicyWithRoamingPartnerWithoutCountries() throws Exception {
Policy policy = createPolicy();
Policy.RoamingPartner partner = new Policy.RoamingPartner();
partner.setFqdn("test.com");
partner.setFqdnExactMatch(true);
partner.setPriority(12);
policy.getPreferredRoamingPartnerList().add(partner);
assertFalse(policy.validate());
}
/**
* Verify that a policy with a proto-port tuple that contains an invalid port string is
* invalid.
*
* @throws Exception
*/
@Test
public void validatePolicyWithInvalidPortStringInProtoPortMap() throws Exception {
Policy policy = createPolicy();
byte[] rawPortBytes = new byte[MAX_PORT_STRING_BYTES + 1];
policy.getRequiredProtoPortMap().put(
324, new String(rawPortBytes, StandardCharsets.UTF_8));
assertFalse(policy.validate());
}
/**
* Verify that a policy with number of excluded SSIDs exceeded the max is invalid.
*
* @throws Exception
*/
@Test
public void validatePolicyWithSsidExclusionListSizeExceededMax() throws Exception {
Policy policy = createPolicy();
String[] excludedSsidList = new String[MAX_NUMBER_OF_EXCLUDED_SSIDS + 1];
Arrays.fill(excludedSsidList, "ssid");
policy.setExcludedSsidList(excludedSsidList);
assertFalse(policy.validate());
}
/**
* Verify that a policy with an invalid SSID in the excluded SSID list is invalid.
*
* @throws Exception
*/
@Test
public void validatePolicyWithInvalidSsid() throws Exception {
Policy policy = createPolicy();
byte[] rawSsidBytes = new byte[MAX_SSID_BYTES + 1];
Arrays.fill(rawSsidBytes, (byte) 'a');
String[] excludedSsidList = new String[] {
new String(rawSsidBytes, StandardCharsets.UTF_8)};
policy.setExcludedSsidList(excludedSsidList);
assertFalse(policy.validate());
}
}