1d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu/*
2d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu * Copyright (C) 2017 The Android Open Source Project
3d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu *
4d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu * Licensed under the Apache License, Version 2.0 (the "License");
5d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu * you may not use this file except in compliance with the License.
6d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu * You may obtain a copy of the License at
7d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu *
8d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu *      http://www.apache.org/licenses/LICENSE-2.0
9d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu *
10d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu * Unless required by applicable law or agreed to in writing, software
11d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu * distributed under the License is distributed on an "AS IS" BASIS,
12d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu * See the License for the specific language governing permissions and
14d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu * limitations under the License.
15d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu */
16d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
17d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiupackage com.android.server.wifi.hotspot2;
18d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
19d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport static org.junit.Assert.*;
20d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport static org.mockito.Mockito.*;
21d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
22d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport android.net.wifi.hotspot2.PasspointConfiguration;
23d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport android.net.wifi.hotspot2.pps.Credential;
24d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport android.net.wifi.hotspot2.pps.HomeSp;
25d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport android.net.wifi.hotspot2.pps.Policy;
26d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport android.net.wifi.hotspot2.pps.UpdateParameter;
27d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport android.test.suitebuilder.annotation.SmallTest;
28d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport android.util.Xml;
29d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
30d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport com.android.internal.util.FastXmlSerializer;
31d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
32d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport org.junit.Test;
33d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport org.xmlpull.v1.XmlPullParser;
34d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport org.xmlpull.v1.XmlPullParserException;
35d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport org.xmlpull.v1.XmlSerializer;
36d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
37d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport java.io.ByteArrayInputStream;
38d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport java.io.ByteArrayOutputStream;
39d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport java.nio.charset.StandardCharsets;
40d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport java.text.DateFormat;
41d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport java.text.SimpleDateFormat;
42d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport java.util.ArrayList;
43d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport java.util.Arrays;
44d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport java.util.HashMap;
45d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport java.util.List;
46d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiuimport java.util.Map;
47d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
48d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu/**
49d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu * Unit tests for {@link com.android.server.wifi.hotspot2.PasspointXmlUtilsTest}.
50d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu */
51d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu@SmallTest
52d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiupublic class PasspointXmlUtilsTest {
53d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
54d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu    /**
55d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     * Helper function for generating a {@link PasspointConfiguration} for testing the XML
56d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     * serialization/deserialization logic.
57d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     *
58d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     * @return {@link PasspointConfiguration}
59d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     * @throws Exception
60d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     */
61d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu    private PasspointConfiguration createFullPasspointConfiguration() throws Exception {
62d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
63d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        byte[] certFingerprint = new byte[32];
64d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        Arrays.fill(certFingerprint, (byte) 0x1f);
65d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
66d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        PasspointConfiguration config = new PasspointConfiguration();
67d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        config.setUpdateIdentifier(12);
68d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        config.setCredentialPriority(99);
69d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
70d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        // AAA Server trust root.
71d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        Map<String, byte[]> trustRootCertList = new HashMap<>();
72d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        trustRootCertList.put("server1.trust.root.com", certFingerprint);
73d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        config.setTrustRootCertList(trustRootCertList);
74d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
75d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        // Subscription update.
76d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        UpdateParameter subscriptionUpdate = new UpdateParameter();
77d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        subscriptionUpdate.setUpdateIntervalInMinutes(120);
78d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        subscriptionUpdate.setUpdateMethod(UpdateParameter.UPDATE_METHOD_SSP);
79d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        subscriptionUpdate.setRestriction(UpdateParameter.UPDATE_RESTRICTION_ROAMING_PARTNER);
80d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        subscriptionUpdate.setServerUri("subscription.update.com");
81d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        subscriptionUpdate.setUsername("subscriptionUser");
82d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        subscriptionUpdate.setBase64EncodedPassword("subscriptionPass");
83d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        subscriptionUpdate.setTrustRootCertUrl("subscription.update.cert.com");
84d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        subscriptionUpdate.setTrustRootCertSha256Fingerprint(certFingerprint);
85d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        config.setSubscriptionUpdate(subscriptionUpdate);
86d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
87d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        // Subscription parameters.
888f4f48b96b690aa099f85aad7a361cf39e431f42Peter Qiu        config.setSubscriptionCreationTimeInMillis(format.parse("2016-02-01T10:00:00Z").getTime());
898f4f48b96b690aa099f85aad7a361cf39e431f42Peter Qiu        config.setSubscriptionExpirationTimeInMillis(
908f4f48b96b690aa099f85aad7a361cf39e431f42Peter Qiu                format.parse("2016-03-01T10:00:00Z").getTime());
91d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        config.setSubscriptionType("Gold");
92d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        config.setUsageLimitDataLimit(921890);
938f4f48b96b690aa099f85aad7a361cf39e431f42Peter Qiu        config.setUsageLimitStartTimeInMillis(format.parse("2016-12-01T10:00:00Z").getTime());
94d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        config.setUsageLimitTimeLimitInMinutes(120);
95d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        config.setUsageLimitUsageTimePeriodInMinutes(99910);
96d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
97d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        // HomeSP configuration.
98d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        HomeSp homeSp = new HomeSp();
99d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        homeSp.setFriendlyName("Century House");
100d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        homeSp.setFqdn("mi6.co.uk");
101d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        homeSp.setRoamingConsortiumOis(new long[] {0x112233L, 0x445566L});
102d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        homeSp.setIconUrl("icon.test.com");
103d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        Map<String, Long> homeNetworkIds = new HashMap<>();
104d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        homeNetworkIds.put("TestSSID", 0x12345678L);
105d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        homeNetworkIds.put("NullHESSID", null);
106d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        homeSp.setHomeNetworkIds(homeNetworkIds);
107d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        homeSp.setMatchAllOis(new long[] {0x11223344});
108d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        homeSp.setMatchAnyOis(new long[] {0x55667788});
109d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        homeSp.setOtherHomePartners(new String[] {"other.fqdn.com"});
110d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        config.setHomeSp(homeSp);
111d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
112d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        // Credential configuration.
113d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        Credential credential = new Credential();
1148f4f48b96b690aa099f85aad7a361cf39e431f42Peter Qiu        credential.setCreationTimeInMillis(format.parse("2016-01-01T10:00:00Z").getTime());
1158f4f48b96b690aa099f85aad7a361cf39e431f42Peter Qiu        credential.setExpirationTimeInMillis(format.parse("2016-02-01T10:00:00Z").getTime());
116d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        credential.setRealm("shaken.stirred.com");
117d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        credential.setCheckAaaServerCertStatus(true);
118d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        Credential.UserCredential userCredential = new Credential.UserCredential();
119d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        userCredential.setUsername("james");
120d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        userCredential.setPassword("Ym9uZDAwNw==");
121d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        userCredential.setMachineManaged(true);
122d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        userCredential.setSoftTokenApp("TestApp");
123d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        userCredential.setAbleToShare(true);
124d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        userCredential.setEapType(21);
125d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        userCredential.setNonEapInnerMethod("MS-CHAP-V2");
126d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        credential.setUserCredential(userCredential);
127d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        Credential.CertificateCredential certCredential = new Credential.CertificateCredential();
128d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        certCredential.setCertType("x509v3");
129d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        certCredential.setCertSha256Fingerprint(certFingerprint);
130d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        credential.setCertCredential(certCredential);
131d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        Credential.SimCredential simCredential = new Credential.SimCredential();
132d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        simCredential.setImsi("imsi");
133d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        simCredential.setEapType(24);
134d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        credential.setSimCredential(simCredential);
135d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        config.setCredential(credential);
136d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
137d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        // Policy configuration.
138d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        Policy policy = new Policy();
139d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        List<Policy.RoamingPartner> preferredRoamingPartnerList = new ArrayList<>();
140d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        Policy.RoamingPartner partner1 = new Policy.RoamingPartner();
141d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        partner1.setFqdn("test1.fqdn.com");
142d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        partner1.setFqdnExactMatch(true);
143d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        partner1.setPriority(127);
144d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        partner1.setCountries("us,fr");
145d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        Policy.RoamingPartner partner2 = new Policy.RoamingPartner();
146d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        partner2.setFqdn("test2.fqdn.com");
147d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        partner2.setFqdnExactMatch(false);
148d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        partner2.setPriority(200);
149d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        partner2.setCountries("*");
150d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        preferredRoamingPartnerList.add(partner1);
151d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        preferredRoamingPartnerList.add(partner2);
152d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        policy.setPreferredRoamingPartnerList(preferredRoamingPartnerList);
153d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        policy.setMinHomeDownlinkBandwidth(23412);
154d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        policy.setMinHomeUplinkBandwidth(9823);
155d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        policy.setMinRoamingDownlinkBandwidth(9271);
156d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        policy.setMinRoamingUplinkBandwidth(2315);
157d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        policy.setExcludedSsidList(new String[] {"excludeSSID"});
158d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        Map<Integer, String> requiredProtoPortMap = new HashMap<>();
159d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        requiredProtoPortMap.put(12, "34,92,234");
160d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        policy.setRequiredProtoPortMap(requiredProtoPortMap);
161d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        policy.setMaximumBssLoadValue(23);
162d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        UpdateParameter policyUpdate = new UpdateParameter();
163d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        policyUpdate.setUpdateIntervalInMinutes(120);
164d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        policyUpdate.setUpdateMethod(UpdateParameter.UPDATE_METHOD_OMADM);
165d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        policyUpdate.setRestriction(UpdateParameter.UPDATE_RESTRICTION_HOMESP);
166d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        policyUpdate.setServerUri("policy.update.com");
167d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        policyUpdate.setUsername("updateUser");
168d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        policyUpdate.setBase64EncodedPassword("updatePass");
169d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        policyUpdate.setTrustRootCertUrl("update.cert.com");
170d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        policyUpdate.setTrustRootCertSha256Fingerprint(certFingerprint);
171d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        policy.setPolicyUpdate(policyUpdate);
172d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        config.setPolicy(policy);
173d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        return config;
174d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu    }
175d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
176d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu    /**
177d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     * Verify the serialization and deserialization logic of a {@link PasspointConfiguration}.
178d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     *
179d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     * 1. Serialize the test config to a XML block
180d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     * 2. Deserialize the XML block to a {@link PasspointConfiguration}
181d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     * 3. Verify that the deserialized config is the same as the test config
182d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     *
183d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     * @param testConfig The configuration to used for testing
184d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     * @throws Exception
185d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     */
186d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu    private void serializeAndDeserializePasspointConfiguration(PasspointConfiguration testConfig)
187d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu            throws Exception {
188d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        final XmlSerializer out = new FastXmlSerializer();
189d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
190d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        out.setOutput(outputStream, StandardCharsets.UTF_8.name());
191d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        PasspointXmlUtils.serializePasspointConfiguration(out, testConfig);
192d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        out.flush();
193d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
194d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        final XmlPullParser in = Xml.newPullParser();
195d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        final ByteArrayInputStream inputStream =
196d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu                new ByteArrayInputStream(outputStream.toByteArray());
197d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        in.setInput(inputStream, StandardCharsets.UTF_8.name());
198d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
199d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        PasspointConfiguration deserializedConfig =
200d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu                PasspointXmlUtils.deserializePasspointConfiguration(in, in.getDepth());
201d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        assertEquals(testConfig, deserializedConfig);
202d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu    }
203d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
204d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu    /**
205d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     * Verify that the serialization and deserialization logic for a full
206d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     * {@link PasspointConfiguration} (all fields are set) works as expected.
207d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     *
208d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     * @throws Exception
209d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     */
210d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu    @Test
211d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu    public void serializeAndDeserializeFullPasspointConfiguration() throws Exception {
212d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        serializeAndDeserializePasspointConfiguration(createFullPasspointConfiguration());
213d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu    }
214d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
215d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu    /**
216d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     * Verify that the serialization and deserialization logic for an empty
217d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     * {@link PasspointConfiguration} works as expected.
218d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     *
219d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     * @throws Exception
220d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     */
221d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu    @Test
222d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu    public void serializeAndDeserializeEmptyPasspointConfiguration() throws Exception {
223d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        serializeAndDeserializePasspointConfiguration(new PasspointConfiguration());
224d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu    }
225d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu
226d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu    /**
227d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     * Verify that a XmlPullParserException will be thrown when deserialize a XML block
228d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     * for a PasspointConfiguraiton containing an unknown tag.
229d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     *
230d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     * @throws Exception
231d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu     */
232d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu    @Test(expected = XmlPullParserException.class)
233d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu    public void deserializePasspointConfigurationWithUnknownTag() throws Exception {
234d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        String xmlStr = "<UnknownTag>\n"
235d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu                + "</UnknownTag>\n";
236d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        final XmlPullParser in = Xml.newPullParser();
237d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        final ByteArrayInputStream inputStream =
238d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu                new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8));
239d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        in.setInput(inputStream, StandardCharsets.UTF_8.name());
240d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu        PasspointXmlUtils.deserializePasspointConfiguration(in, in.getDepth());
241d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu    }
242d501fd07f0e2ab6a320a1570e426926838a1b316Peter Qiu}
243