/* * 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.test.suitebuilder.annotation.SmallTest; import android.util.Base64; import org.junit.Test; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; 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()); } }