XmlUtilTest.java revision 7d100897cd3ab3a05c3925da42bd25af6e3c8c4a
1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.wifi.util;
18
19import static org.junit.Assert.*;
20import static org.mockito.Mockito.*;
21
22import android.net.IpConfiguration;
23import android.net.wifi.WifiConfiguration;
24import android.net.wifi.WifiConfiguration.NetworkSelectionStatus;
25import android.net.wifi.WifiEnterpriseConfig;
26import android.test.suitebuilder.annotation.SmallTest;
27import android.util.Pair;
28import android.util.Xml;
29
30import com.android.internal.util.FastXmlSerializer;
31import com.android.server.wifi.WifiConfigurationTestUtil;
32import com.android.server.wifi.util.XmlUtil.IpConfigurationXmlUtil;
33import com.android.server.wifi.util.XmlUtil.NetworkSelectionStatusXmlUtil;
34import com.android.server.wifi.util.XmlUtil.WifiConfigurationXmlUtil;
35import com.android.server.wifi.util.XmlUtil.WifiEnterpriseConfigXmlUtil;
36
37import org.junit.Test;
38import org.xmlpull.v1.XmlPullParser;
39import org.xmlpull.v1.XmlPullParserException;
40import org.xmlpull.v1.XmlSerializer;
41
42import java.io.ByteArrayInputStream;
43import java.io.ByteArrayOutputStream;
44import java.io.IOException;
45import java.nio.charset.StandardCharsets;
46import java.util.HashMap;
47
48/**
49 * Unit tests for {@link com.android.server.wifi.util.XmlUtil}.
50 */
51@SmallTest
52public class XmlUtilTest {
53    public static final String XML_STRING_EAP_METHOD_REPLACE_FORMAT =
54            "<int name=\"EapMethod\" value=\"%d\" />";
55
56    private static final String TEST_PACKAGE_NAME = "XmlUtilPackage";
57    private static final String TEST_STATIC_IP_GATEWAY_ADDRESS = "192.168.48.1";
58    private static final String TEST_DUMMY_CONFIG_KEY = "XmlUtilDummyConfigKey";
59    private static final String TEST_IDENTITY = "XmlUtilTestIdentity";
60    private static final String TEST_ANON_IDENTITY = "XmlUtilTestAnonIdentity";
61    private static final String TEST_PASSWORD = "XmlUtilTestPassword";
62    private static final String TEST_CLIENT_CERT = "XmlUtilTestClientCert";
63    private static final String TEST_CA_CERT = "XmlUtilTestCaCert";
64    private static final String TEST_SUBJECT_MATCH = "XmlUtilTestSubjectMatch";
65    private static final String TEST_ENGINE = "XmlUtilTestEngine";
66    private static final String TEST_ENGINE_ID = "XmlUtilTestEngineId";
67    private static final String TEST_PRIVATE_KEY_ID = "XmlUtilTestPrivateKeyId";
68    private static final String TEST_ALTSUBJECT_MATCH = "XmlUtilTestAltSubjectMatch";
69    private static final String TEST_DOM_SUFFIX_MATCH = "XmlUtilTestDomSuffixMatch";
70    private static final String TEST_CA_PATH = "XmlUtilTestCaPath";
71    private static final int TEST_EAP_METHOD = WifiEnterpriseConfig.Eap.PEAP;
72    private static final int TEST_PHASE2_METHOD = WifiEnterpriseConfig.Phase2.MSCHAPV2;
73    private final String mXmlDocHeader = "XmlUtilTest";
74
75    /**
76     * Verify that a open WifiConfiguration is serialized & deserialized correctly.
77     */
78    @Test
79    public void testOpenWifiConfigurationSerializeDeserialize()
80            throws IOException, XmlPullParserException {
81        serializeDeserializeWifiConfiguration(WifiConfigurationTestUtil.createOpenNetwork());
82    }
83
84    /**
85     * Verify that a open hidden WifiConfiguration is serialized & deserialized correctly.
86     */
87    @Test
88    public void testOpenHiddenWifiConfigurationSerializeDeserialize()
89            throws IOException, XmlPullParserException {
90        serializeDeserializeWifiConfiguration(WifiConfigurationTestUtil.createOpenHiddenNetwork());
91    }
92
93    /**
94     * Verify that a psk WifiConfiguration is serialized & deserialized correctly.
95     */
96    @Test
97    public void testPskWifiConfigurationSerializeDeserialize()
98            throws IOException, XmlPullParserException {
99        serializeDeserializeWifiConfiguration(WifiConfigurationTestUtil.createPskNetwork());
100    }
101
102    /**
103     * Verify that a psk hidden WifiConfiguration is serialized & deserialized correctly.
104     */
105    @Test
106    public void testPskHiddenWifiConfigurationSerializeDeserialize()
107            throws IOException, XmlPullParserException {
108        serializeDeserializeWifiConfiguration(WifiConfigurationTestUtil.createPskHiddenNetwork());
109    }
110
111    /**
112     * Verify that a WEP WifiConfiguration is serialized & deserialized correctly.
113     */
114    @Test
115    public void testWepWifiConfigurationSerializeDeserialize()
116            throws IOException, XmlPullParserException {
117        serializeDeserializeWifiConfiguration(WifiConfigurationTestUtil.createWepNetwork());
118    }
119
120    /**
121     * Verify that a EAP WifiConfiguration is serialized & deserialized correctly only for
122     * ConfigStore.
123     */
124    @Test
125    public void testEapWifiConfigurationSerializeDeserialize()
126            throws IOException, XmlPullParserException {
127        serializeDeserializeWifiConfigurationForConfigStore(
128                WifiConfigurationTestUtil.createEapNetwork());
129    }
130
131    /**
132     * Verify that a static IpConfiguration with PAC proxy is serialized & deserialized correctly.
133     */
134    @Test
135    public void testStaticIpConfigurationWithPacProxySerializeDeserialize()
136            throws IOException, XmlPullParserException {
137        serializeDeserializeIpConfiguration(
138                WifiConfigurationTestUtil.createStaticIpConfigurationWithPacProxy());
139    }
140
141    /**
142     * Verify that a static IpConfiguration with static proxy is serialized & deserialized correctly.
143     */
144    @Test
145    public void testStaticIpConfigurationWithStaticProxySerializeDeserialize()
146            throws IOException, XmlPullParserException {
147        serializeDeserializeIpConfiguration(
148                WifiConfigurationTestUtil.createStaticIpConfigurationWithStaticProxy());
149    }
150
151    /**
152     * Verify that a partial static IpConfiguration with PAC proxy is serialized & deserialized
153     * correctly.
154     */
155    @Test
156    public void testPartialStaticIpConfigurationWithPacProxySerializeDeserialize()
157            throws IOException, XmlPullParserException {
158        serializeDeserializeIpConfiguration(
159                WifiConfigurationTestUtil.createPartialStaticIpConfigurationWithPacProxy());
160    }
161
162    /**
163     * Verify that a DHCP IpConfiguration with PAC proxy is serialized & deserialized
164     * correctly.
165     */
166    @Test
167    public void testDHCPIpConfigurationWithPacProxySerializeDeserialize()
168            throws IOException, XmlPullParserException {
169        serializeDeserializeIpConfiguration(
170                WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy());
171    }
172
173    /**
174     * Verify that a DHCP IpConfiguration with Static proxy is serialized & deserialized
175     * correctly.
176     */
177    @Test
178    public void testDHCPIpConfigurationWithStaticProxySerializeDeserialize()
179            throws IOException, XmlPullParserException {
180        serializeDeserializeIpConfiguration(
181                WifiConfigurationTestUtil.createDHCPIpConfigurationWithStaticProxy());
182    }
183
184    /**
185     * Verify that a EAP WifiConfiguration is serialized & deserialized correctly for config store.
186     * This basically exercises all the elements being serialized in config store.
187     */
188    @Test
189    public void testEapWifiConfigurationSerializeDeserializeForConfigStore()
190            throws IOException, XmlPullParserException {
191        WifiConfiguration configuration = WifiConfigurationTestUtil.createEapNetwork();
192        configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
193        configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
194        configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
195        configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
196        configuration.status = WifiConfiguration.Status.DISABLED;
197        configuration.linkedConfigurations = new HashMap<>();
198        configuration.linkedConfigurations.put(TEST_DUMMY_CONFIG_KEY, Integer.valueOf(1));
199        configuration.defaultGwMacAddress = TEST_STATIC_IP_GATEWAY_ADDRESS;
200        configuration.requirePMF = true;
201        configuration.validatedInternetAccess = true;
202        configuration.noInternetAccessExpected = true;
203        configuration.userApproved = WifiConfiguration.USER_UNSPECIFIED;
204        configuration.meteredHint = true;
205        configuration.useExternalScores = true;
206        configuration.numAssociation = 5;
207        configuration.lastUpdateUid = configuration.lastConnectUid = configuration.creatorUid;
208        configuration.creatorName = configuration.lastUpdateName = TEST_PACKAGE_NAME;
209        configuration.creationTime = "04-04-2016";
210
211        serializeDeserializeWifiConfigurationForConfigStore(configuration);
212    }
213
214    /**
215     * Verify that an enabled network selection status object is serialized & deserialized
216     * correctly.
217     */
218    @Test
219    public void testEnabledNetworkSelectionStatusSerializeDeserialize()
220            throws IOException, XmlPullParserException {
221        NetworkSelectionStatus status = new NetworkSelectionStatus();
222        status.setNetworkSelectionStatus(NetworkSelectionStatus.NETWORK_SELECTION_ENABLED);
223        status.setNetworkSelectionDisableReason(NetworkSelectionStatus.NETWORK_SELECTION_ENABLE);
224        status.setConnectChoice(TEST_DUMMY_CONFIG_KEY);
225        status.setConnectChoiceTimestamp(867889);
226        status.setHasEverConnected(true);
227        serializeDeserializeNetworkSelectionStatus(status);
228    }
229
230    /**
231     * Verify that a temporarily disabled network selection status object is serialized &
232     * deserialized correctly.
233     */
234    @Test
235    public void testTemporarilyDisabledNetworkSelectionStatusSerializeDeserialize()
236            throws IOException, XmlPullParserException {
237        NetworkSelectionStatus status = new NetworkSelectionStatus();
238        status.setNetworkSelectionStatus(
239                NetworkSelectionStatus.NETWORK_SELECTION_TEMPORARY_DISABLED);
240        status.setNetworkSelectionDisableReason(
241                NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION);
242        serializeDeserializeNetworkSelectionStatus(status);
243    }
244
245    /**
246     * Verify that a network selection status deprecation is handled correctly during restore
247     * of data after upgrade.
248     * This test tries to simulate the scenario where we have a
249     * {@link NetworkSelectionStatus#getNetworkStatusString()} string stored
250     * in the XML file from a previous release which has now been deprecated. The network should
251     * be restored as enabled.
252     */
253    @Test
254    public void testDeprecatedNetworkSelectionStatusDeserialize()
255            throws IOException, XmlPullParserException {
256        // Create a dummy network selection status.
257        NetworkSelectionStatus status = new NetworkSelectionStatus();
258        status.setNetworkSelectionStatus(
259                NetworkSelectionStatus.NETWORK_SELECTION_TEMPORARY_DISABLED);
260        status.setNetworkSelectionDisableReason(
261                NetworkSelectionStatus.DISABLED_DHCP_FAILURE);
262        status.setConnectChoice(TEST_DUMMY_CONFIG_KEY);
263        status.setConnectChoiceTimestamp(867889);
264        status.setHasEverConnected(true);
265
266        // Serialize this to XML string.
267        byte[] xmlData = serializeNetworkSelectionStatus(status);
268
269        // Now modify the status string with some invalid string in XML data..
270        String xmlString = new String(xmlData);
271        String deprecatedXmlString =
272                xmlString.replaceAll(
273                        status.getNetworkStatusString(), "NETWORK_SELECTION_DEPRECATED");
274        // Ensure that the modification did take effect.
275        assertFalse(xmlString.equals(deprecatedXmlString));
276
277        // Now Deserialize the modified XML data.
278        byte[] deprecatedXmlData = xmlString.getBytes();
279        NetworkSelectionStatus retrievedStatus =
280                deserializeNetworkSelectionStatus(deprecatedXmlData);
281
282        // The status retrieved should have reset both the |Status| & |DisableReason| fields after
283        // deserialization, but should have restored all the other fields correctly.
284        NetworkSelectionStatus expectedStatus = new NetworkSelectionStatus();
285        expectedStatus.copy(status);
286        expectedStatus.setNetworkSelectionStatus(NetworkSelectionStatus.NETWORK_SELECTION_ENABLED);
287        expectedStatus.setNetworkSelectionDisableReason(
288                NetworkSelectionStatus.NETWORK_SELECTION_ENABLE);
289
290        WifiConfigurationTestUtil.assertNetworkSelectionStatusEqualForConfigStore(
291                expectedStatus, retrievedStatus);
292    }
293
294    /**
295     * Verify that a network selection disable reason deprecation is handled correctly during
296     * restore of data after upgrade.
297     * This test tries to simulate the scenario where we have a
298     * {@link NetworkSelectionStatus#getNetworkDisableReasonString()} ()} string stored
299     * in the XML file from a previous release which has now been deprecated. The network should
300     * be restored as enabled.
301     */
302    @Test
303    public void testDeprecatedNetworkSelectionDisableReasonDeserialize()
304            throws IOException, XmlPullParserException {
305        // Create a dummy network selection status.
306        NetworkSelectionStatus status = new NetworkSelectionStatus();
307        status.setNetworkSelectionStatus(
308                NetworkSelectionStatus.NETWORK_SELECTION_TEMPORARY_DISABLED);
309        status.setNetworkSelectionDisableReason(
310                NetworkSelectionStatus.DISABLED_DHCP_FAILURE);
311        status.setConnectChoice(TEST_DUMMY_CONFIG_KEY);
312        status.setConnectChoiceTimestamp(867889);
313        status.setHasEverConnected(true);
314
315        // Serialize this to XML string.
316        byte[] xmlData = serializeNetworkSelectionStatus(status);
317
318        // Now modify the disable reason string with some invalid string in XML data.
319        String xmlString = new String(xmlData);
320        String deprecatedXmlString =
321                xmlString.replaceAll(status.getNetworkDisableReasonString(), "DISABLED_DEPRECATED");
322        // Ensure that the modification did take effect.
323        assertFalse(xmlString.equals(deprecatedXmlString));
324
325        // Now Deserialize the modified XML data.
326        byte[] deprecatedXmlData = xmlString.getBytes();
327        NetworkSelectionStatus retrievedStatus =
328                deserializeNetworkSelectionStatus(deprecatedXmlData);
329
330        // The status retrieved should have reset both the |Status| & |DisableReason| fields after
331        // deserialization, but should have restored all the other fields correctly.
332        NetworkSelectionStatus expectedStatus = new NetworkSelectionStatus();
333        expectedStatus.copy(status);
334        expectedStatus.setNetworkSelectionStatus(NetworkSelectionStatus.NETWORK_SELECTION_ENABLED);
335        expectedStatus.setNetworkSelectionDisableReason(
336                NetworkSelectionStatus.NETWORK_SELECTION_ENABLE);
337
338        WifiConfigurationTestUtil.assertNetworkSelectionStatusEqualForConfigStore(
339                expectedStatus, retrievedStatus);
340    }
341
342    /**
343     * Verify that a WifiEnterpriseConfig object is serialized & deserialized correctly.
344     */
345    @Test
346    public void testWifiEnterpriseConfigSerializeDeserialize()
347            throws IOException, XmlPullParserException {
348        WifiEnterpriseConfig config = new WifiEnterpriseConfig();
349        config.setFieldValue(WifiEnterpriseConfig.IDENTITY_KEY, TEST_IDENTITY);
350        config.setFieldValue(WifiEnterpriseConfig.ANON_IDENTITY_KEY, TEST_ANON_IDENTITY);
351        config.setFieldValue(WifiEnterpriseConfig.PASSWORD_KEY, TEST_PASSWORD);
352        config.setFieldValue(WifiEnterpriseConfig.CLIENT_CERT_KEY, TEST_CLIENT_CERT);
353        config.setFieldValue(WifiEnterpriseConfig.CA_CERT_KEY, TEST_CA_CERT);
354        config.setFieldValue(WifiEnterpriseConfig.SUBJECT_MATCH_KEY, TEST_SUBJECT_MATCH);
355        config.setFieldValue(WifiEnterpriseConfig.ENGINE_KEY, TEST_ENGINE);
356        config.setFieldValue(WifiEnterpriseConfig.ENGINE_ID_KEY, TEST_ENGINE_ID);
357        config.setFieldValue(WifiEnterpriseConfig.PRIVATE_KEY_ID_KEY, TEST_PRIVATE_KEY_ID);
358        config.setFieldValue(WifiEnterpriseConfig.ALTSUBJECT_MATCH_KEY, TEST_ALTSUBJECT_MATCH);
359        config.setFieldValue(WifiEnterpriseConfig.DOM_SUFFIX_MATCH_KEY, TEST_DOM_SUFFIX_MATCH);
360        config.setFieldValue(WifiEnterpriseConfig.CA_PATH_KEY, TEST_CA_PATH);
361        config.setEapMethod(TEST_EAP_METHOD);
362        config.setPhase2Method(TEST_PHASE2_METHOD);
363        serializeDeserializeWifiEnterpriseConfig(config);
364    }
365
366    /**
367     * Verify that an illegal argument exception is thrown when trying to parse out a corrupted
368     * WifiEnterpriseConfig.
369     *
370     * @throws Exception
371     */
372    @Test(expected = IllegalArgumentException.class)
373    public void testWifiEnterpriseConfigSerializeDeserializeThrowsIllegalArgException()
374            throws Exception {
375        WifiEnterpriseConfig config = new WifiEnterpriseConfig();
376        config.setFieldValue(WifiEnterpriseConfig.IDENTITY_KEY, TEST_IDENTITY);
377        config.setFieldValue(WifiEnterpriseConfig.ANON_IDENTITY_KEY, TEST_ANON_IDENTITY);
378        config.setFieldValue(WifiEnterpriseConfig.PASSWORD_KEY, TEST_PASSWORD);
379        config.setFieldValue(WifiEnterpriseConfig.CLIENT_CERT_KEY, TEST_CLIENT_CERT);
380        config.setFieldValue(WifiEnterpriseConfig.CA_CERT_KEY, TEST_CA_CERT);
381        config.setFieldValue(WifiEnterpriseConfig.SUBJECT_MATCH_KEY, TEST_SUBJECT_MATCH);
382        config.setFieldValue(WifiEnterpriseConfig.ENGINE_KEY, TEST_ENGINE);
383        config.setFieldValue(WifiEnterpriseConfig.ENGINE_ID_KEY, TEST_ENGINE_ID);
384        config.setFieldValue(WifiEnterpriseConfig.PRIVATE_KEY_ID_KEY, TEST_PRIVATE_KEY_ID);
385        config.setFieldValue(WifiEnterpriseConfig.ALTSUBJECT_MATCH_KEY, TEST_ALTSUBJECT_MATCH);
386        config.setFieldValue(WifiEnterpriseConfig.DOM_SUFFIX_MATCH_KEY, TEST_DOM_SUFFIX_MATCH);
387        config.setFieldValue(WifiEnterpriseConfig.CA_PATH_KEY, TEST_CA_PATH);
388        config.setEapMethod(TEST_EAP_METHOD);
389        config.setPhase2Method(TEST_PHASE2_METHOD);
390        String xmlString = new String(serializeWifiEnterpriseConfig(config));
391        // Manipulate the XML data to set the EAP method to None, this should raise an Illegal
392        // argument exception in WifiEnterpriseConfig.setEapMethod().
393        xmlString = xmlString.replaceAll(
394                String.format(XML_STRING_EAP_METHOD_REPLACE_FORMAT, TEST_EAP_METHOD),
395                String.format(XML_STRING_EAP_METHOD_REPLACE_FORMAT, WifiEnterpriseConfig.Eap.NONE));
396        deserializeWifiEnterpriseConfig(xmlString.getBytes(StandardCharsets.UTF_8));
397    }
398
399    private byte[] serializeWifiConfigurationForBackup(WifiConfiguration configuration)
400            throws IOException, XmlPullParserException {
401        final XmlSerializer out = new FastXmlSerializer();
402        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
403        out.setOutput(outputStream, StandardCharsets.UTF_8.name());
404        XmlUtil.writeDocumentStart(out, mXmlDocHeader);
405        WifiConfigurationXmlUtil.writeToXmlForBackup(out, configuration);
406        XmlUtil.writeDocumentEnd(out, mXmlDocHeader);
407        return outputStream.toByteArray();
408    }
409
410    private byte[] serializeWifiConfigurationForConfigStore(
411            WifiConfiguration configuration)
412            throws IOException, XmlPullParserException {
413        final XmlSerializer out = new FastXmlSerializer();
414        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
415        out.setOutput(outputStream, StandardCharsets.UTF_8.name());
416        XmlUtil.writeDocumentStart(out, mXmlDocHeader);
417        WifiConfigurationXmlUtil.writeToXmlForConfigStore(out, configuration);
418        XmlUtil.writeDocumentEnd(out, mXmlDocHeader);
419        return outputStream.toByteArray();
420    }
421
422    private Pair<String, WifiConfiguration> deserializeWifiConfiguration(byte[] data)
423            throws IOException, XmlPullParserException {
424        // Deserialize the configuration object.
425        final XmlPullParser in = Xml.newPullParser();
426        ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
427        in.setInput(inputStream, StandardCharsets.UTF_8.name());
428        XmlUtil.gotoDocumentStart(in, mXmlDocHeader);
429        return WifiConfigurationXmlUtil.parseFromXml(in, in.getDepth());
430    }
431
432    /**
433     * This helper method tests the serialization for backup/restore.
434     */
435    private void serializeDeserializeWifiConfigurationForBackupRestore(
436            WifiConfiguration configuration)
437            throws IOException, XmlPullParserException {
438        Pair<String, WifiConfiguration> retrieved;
439        // Test serialization/deserialization for config store.
440        retrieved =
441                deserializeWifiConfiguration(
442                        serializeWifiConfigurationForBackup(configuration));
443        assertEquals(retrieved.first, retrieved.second.configKey());
444        WifiConfigurationTestUtil.assertConfigurationEqualForBackup(
445                configuration, retrieved.second);
446    }
447
448    /**
449     * This helper method tests the serialization for config store.
450     */
451    private void serializeDeserializeWifiConfigurationForConfigStore(
452            WifiConfiguration configuration)
453            throws IOException, XmlPullParserException {
454        // Reset enterprise config because this needs to be serialized/deserialized separately.
455        configuration.enterpriseConfig = new WifiEnterpriseConfig();
456        Pair<String, WifiConfiguration> retrieved;
457        // Test serialization/deserialization for config store.
458        retrieved =
459                deserializeWifiConfiguration(
460                        serializeWifiConfigurationForConfigStore(configuration));
461        assertEquals(retrieved.first, retrieved.second.configKey());
462        WifiConfigurationTestUtil.assertConfigurationEqualForConfigStore(
463                configuration, retrieved.second);
464    }
465
466    /**
467     * This helper method tests both the serialization for backup/restore and config store.
468     */
469    private void serializeDeserializeWifiConfiguration(WifiConfiguration configuration)
470            throws IOException, XmlPullParserException {
471        Pair<String, WifiConfiguration> retrieved;
472        // Test serialization/deserialization for backup first.
473        serializeDeserializeWifiConfigurationForBackupRestore(configuration);
474
475        // Test serialization/deserialization for config store.
476        serializeDeserializeWifiConfigurationForConfigStore(configuration);
477    }
478
479    private void serializeDeserializeIpConfiguration(IpConfiguration configuration)
480            throws IOException, XmlPullParserException {
481        // Serialize the configuration object.
482        final XmlSerializer out = new FastXmlSerializer();
483        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
484        out.setOutput(outputStream, StandardCharsets.UTF_8.name());
485        XmlUtil.writeDocumentStart(out, mXmlDocHeader);
486        IpConfigurationXmlUtil.writeToXml(out, configuration);
487        XmlUtil.writeDocumentEnd(out, mXmlDocHeader);
488
489        // Deserialize the configuration object.
490        final XmlPullParser in = Xml.newPullParser();
491        ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
492        in.setInput(inputStream, StandardCharsets.UTF_8.name());
493        XmlUtil.gotoDocumentStart(in, mXmlDocHeader);
494        IpConfiguration retrievedConfiguration =
495                IpConfigurationXmlUtil.parseFromXml(in, in.getDepth());
496        assertEquals(configuration, retrievedConfiguration);
497    }
498
499    private byte[] serializeNetworkSelectionStatus(NetworkSelectionStatus status)
500            throws IOException, XmlPullParserException {
501        // Serialize the configuration object.
502        final XmlSerializer out = new FastXmlSerializer();
503        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
504        out.setOutput(outputStream, StandardCharsets.UTF_8.name());
505        XmlUtil.writeDocumentStart(out, mXmlDocHeader);
506        NetworkSelectionStatusXmlUtil.writeToXml(out, status);
507        XmlUtil.writeDocumentEnd(out, mXmlDocHeader);
508        return outputStream.toByteArray();
509    }
510
511    private NetworkSelectionStatus deserializeNetworkSelectionStatus(byte[] data)
512            throws IOException, XmlPullParserException {
513        final XmlPullParser in = Xml.newPullParser();
514        ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
515        in.setInput(inputStream, StandardCharsets.UTF_8.name());
516        XmlUtil.gotoDocumentStart(in, mXmlDocHeader);
517        return NetworkSelectionStatusXmlUtil.parseFromXml(in, in.getDepth());
518    }
519
520    private void serializeDeserializeNetworkSelectionStatus(NetworkSelectionStatus status)
521            throws IOException, XmlPullParserException {
522        // Serialize the status object.
523        byte[] data = serializeNetworkSelectionStatus(status);
524        // Deserialize the status object.
525        NetworkSelectionStatus retrievedStatus = deserializeNetworkSelectionStatus(data);
526
527        WifiConfigurationTestUtil.assertNetworkSelectionStatusEqualForConfigStore(
528                status, retrievedStatus);
529    }
530
531    private byte[] serializeWifiEnterpriseConfig(WifiEnterpriseConfig config)
532            throws IOException, XmlPullParserException {
533        final XmlSerializer out = new FastXmlSerializer();
534        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
535        out.setOutput(outputStream, StandardCharsets.UTF_8.name());
536        XmlUtil.writeDocumentStart(out, mXmlDocHeader);
537        WifiEnterpriseConfigXmlUtil.writeToXml(out, config);
538        XmlUtil.writeDocumentEnd(out, mXmlDocHeader);
539        return outputStream.toByteArray();
540    }
541
542    private WifiEnterpriseConfig deserializeWifiEnterpriseConfig(byte[] data)
543            throws IOException, XmlPullParserException {
544        final XmlPullParser in = Xml.newPullParser();
545        ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
546        in.setInput(inputStream, StandardCharsets.UTF_8.name());
547        XmlUtil.gotoDocumentStart(in, mXmlDocHeader);
548        return WifiEnterpriseConfigXmlUtil.parseFromXml(in, in.getDepth());
549    }
550
551    private void serializeDeserializeWifiEnterpriseConfig(WifiEnterpriseConfig config)
552            throws IOException, XmlPullParserException {
553        WifiEnterpriseConfig retrievedConfig =
554                deserializeWifiEnterpriseConfig(serializeWifiEnterpriseConfig(config));
555        WifiConfigurationTestUtil.assertWifiEnterpriseConfigEqualForConfigStore(
556                config, retrievedConfig);
557    }
558}
559