XmlUtilTest.java revision 6296902ef69724b106973b57b268c30ea4f1ab51
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
54    private static final String TEST_PACKAGE_NAME = "XmlUtilPackage";
55    private static final String TEST_STATIC_IP_GATEWAY_ADDRESS = "192.168.48.1";
56    private static final String TEST_DUMMY_CONFIG_KEY = "XmlUtilDummyConfigKey";
57    private static final String TEST_IDENTITY = "XmlUtilTestIdentity";
58    private static final String TEST_ANON_IDENTITY = "XmlUtilTestAnonIdentity";
59    private static final String TEST_PASSWORD = "XmlUtilTestPassword";
60    private static final String TEST_CLIENT_CERT = "XmlUtilTestClientCert";
61    private static final String TEST_CA_CERT = "XmlUtilTestCaCert";
62    private static final String TEST_SUBJECT_MATCH = "XmlUtilTestSubjectMatch";
63    private static final String TEST_ENGINE = "XmlUtilTestEngine";
64    private static final String TEST_ENGINE_ID = "XmlUtilTestEngineId";
65    private static final String TEST_PRIVATE_KEY_ID = "XmlUtilTestPrivateKeyId";
66    private static final String TEST_ALTSUBJECT_MATCH = "XmlUtilTestAltSubjectMatch";
67    private static final String TEST_DOM_SUFFIX_MATCH = "XmlUtilTestDomSuffixMatch";
68    private static final String TEST_CA_PATH = "XmlUtilTestCaPath";
69    private static final int TEST_EAP_METHOD = WifiEnterpriseConfig.Eap.PEAP;
70    private static final int TEST_PHASE2_METHOD = WifiEnterpriseConfig.Phase2.MSCHAPV2;
71    private final String mXmlDocHeader = "XmlUtilTest";
72
73    /**
74     * Verify that a open WifiConfiguration is serialized & deserialized correctly.
75     */
76    @Test
77    public void testOpenWifiConfigurationSerializeDeserialize()
78            throws IOException, XmlPullParserException {
79        serializeDeserializeWifiConfiguration(WifiConfigurationTestUtil.createOpenNetwork());
80    }
81
82    /**
83     * Verify that a open hidden WifiConfiguration is serialized & deserialized correctly.
84     */
85    @Test
86    public void testOpenHiddenWifiConfigurationSerializeDeserialize()
87            throws IOException, XmlPullParserException {
88        serializeDeserializeWifiConfiguration(WifiConfigurationTestUtil.createOpenHiddenNetwork());
89    }
90
91    /**
92     * Verify that a psk WifiConfiguration is serialized & deserialized correctly.
93     */
94    @Test
95    public void testPskWifiConfigurationSerializeDeserialize()
96            throws IOException, XmlPullParserException {
97        serializeDeserializeWifiConfiguration(WifiConfigurationTestUtil.createPskNetwork());
98    }
99
100    /**
101     * Verify that a psk hidden WifiConfiguration is serialized & deserialized correctly.
102     */
103    @Test
104    public void testPskHiddenWifiConfigurationSerializeDeserialize()
105            throws IOException, XmlPullParserException {
106        serializeDeserializeWifiConfiguration(WifiConfigurationTestUtil.createPskHiddenNetwork());
107    }
108
109    /**
110     * Verify that a WEP WifiConfiguration is serialized & deserialized correctly.
111     */
112    @Test
113    public void testWepWifiConfigurationSerializeDeserialize()
114            throws IOException, XmlPullParserException {
115        serializeDeserializeWifiConfiguration(WifiConfigurationTestUtil.createWepNetwork());
116    }
117
118    /**
119     * Verify that a EAP WifiConfiguration is serialized & deserialized correctly only for
120     * ConfigStore.
121     */
122    @Test
123    public void testEapWifiConfigurationSerializeDeserialize()
124            throws IOException, XmlPullParserException {
125        serializeDeserializeWifiConfigurationForConfigStore(
126                WifiConfigurationTestUtil.createEapNetwork());
127    }
128
129    /**
130     * Verify that a static IpConfiguration with PAC proxy is serialized & deserialized correctly.
131     */
132    @Test
133    public void testStaticIpConfigurationWithPacProxySerializeDeserialize()
134            throws IOException, XmlPullParserException {
135        serializeDeserializeIpConfiguration(
136                WifiConfigurationTestUtil.createStaticIpConfigurationWithPacProxy());
137    }
138
139    /**
140     * Verify that a static IpConfiguration with static proxy is serialized & deserialized correctly.
141     */
142    @Test
143    public void testStaticIpConfigurationWithStaticProxySerializeDeserialize()
144            throws IOException, XmlPullParserException {
145        serializeDeserializeIpConfiguration(
146                WifiConfigurationTestUtil.createStaticIpConfigurationWithStaticProxy());
147    }
148
149    /**
150     * Verify that a partial static IpConfiguration with PAC proxy is serialized & deserialized
151     * correctly.
152     */
153    @Test
154    public void testPartialStaticIpConfigurationWithPacProxySerializeDeserialize()
155            throws IOException, XmlPullParserException {
156        serializeDeserializeIpConfiguration(
157                WifiConfigurationTestUtil.createPartialStaticIpConfigurationWithPacProxy());
158    }
159
160    /**
161     * Verify that a DHCP IpConfiguration with PAC proxy is serialized & deserialized
162     * correctly.
163     */
164    @Test
165    public void testDHCPIpConfigurationWithPacProxySerializeDeserialize()
166            throws IOException, XmlPullParserException {
167        serializeDeserializeIpConfiguration(
168                WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy());
169    }
170
171    /**
172     * Verify that a DHCP IpConfiguration with Static proxy is serialized & deserialized
173     * correctly.
174     */
175    @Test
176    public void testDHCPIpConfigurationWithStaticProxySerializeDeserialize()
177            throws IOException, XmlPullParserException {
178        serializeDeserializeIpConfiguration(
179                WifiConfigurationTestUtil.createDHCPIpConfigurationWithStaticProxy());
180    }
181
182    /**
183     * Verify that a EAP WifiConfiguration is serialized & deserialized correctly for config store.
184     * This basically exercises all the elements being serialized in config store.
185     */
186    @Test
187    public void testEapWifiConfigurationSerializeDeserializeForConfigStore()
188            throws IOException, XmlPullParserException {
189        WifiConfiguration configuration = WifiConfigurationTestUtil.createEapNetwork();
190        configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
191        configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
192        configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
193        configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
194        configuration.status = WifiConfiguration.Status.DISABLED;
195        configuration.linkedConfigurations = new HashMap<>();
196        configuration.linkedConfigurations.put(TEST_DUMMY_CONFIG_KEY, Integer.valueOf(1));
197        configuration.defaultGwMacAddress = TEST_STATIC_IP_GATEWAY_ADDRESS;
198        configuration.requirePMF = true;
199        configuration.validatedInternetAccess = true;
200        configuration.noInternetAccessExpected = true;
201        configuration.userApproved = WifiConfiguration.USER_UNSPECIFIED;
202        configuration.meteredHint = true;
203        configuration.useExternalScores = true;
204        configuration.numAssociation = 5;
205        configuration.lastUpdateUid = configuration.lastConnectUid = configuration.creatorUid;
206        configuration.creatorName = configuration.lastUpdateName = TEST_PACKAGE_NAME;
207        configuration.creationTime = "04-04-2016";
208
209        serializeDeserializeWifiConfigurationForConfigStore(configuration);
210    }
211
212    /**
213     * Verify that an enabled network selection status object is serialized & deserialized
214     * correctly.
215     */
216    @Test
217    public void testEnabledNetworkSelectionStatusSerializeDeserialize()
218            throws IOException, XmlPullParserException {
219        NetworkSelectionStatus status = new NetworkSelectionStatus();
220        status.setNetworkSelectionStatus(NetworkSelectionStatus.NETWORK_SELECTION_ENABLED);
221        status.setNetworkSelectionDisableReason(NetworkSelectionStatus.NETWORK_SELECTION_ENABLE);
222        status.setConnectChoice(TEST_DUMMY_CONFIG_KEY);
223        status.setConnectChoiceTimestamp(867889);
224        status.setHasEverConnected(true);
225        serializeDeserializeNetworkSelectionStatus(status);
226    }
227
228    /**
229     * Verify that a temporarily disabled network selection status object is serialized &
230     * deserialized correctly.
231     */
232    @Test
233    public void testTemporarilyDisabledNetworkSelectionStatusSerializeDeserialize()
234            throws IOException, XmlPullParserException {
235        NetworkSelectionStatus status = new NetworkSelectionStatus();
236        status.setNetworkSelectionStatus(
237                NetworkSelectionStatus.NETWORK_SELECTION_TEMPORARY_DISABLED);
238        status.setNetworkSelectionDisableReason(
239                NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION);
240        serializeDeserializeNetworkSelectionStatus(status);
241    }
242
243    /**
244     * Verify that a network selection status deprecation is handled correctly during restore
245     * of data after upgrade.
246     * This test tries to simulate the scenario where we have a
247     * {@link NetworkSelectionStatus#getNetworkStatusString()} string stored
248     * in the XML file from a previous release which has now been deprecated. The network should
249     * be restored as enabled.
250     */
251    @Test
252    public void testDeprecatedNetworkSelectionStatusDeserialize()
253            throws IOException, XmlPullParserException {
254        // Create a dummy network selection status.
255        NetworkSelectionStatus status = new NetworkSelectionStatus();
256        status.setNetworkSelectionStatus(
257                NetworkSelectionStatus.NETWORK_SELECTION_TEMPORARY_DISABLED);
258        status.setNetworkSelectionDisableReason(
259                NetworkSelectionStatus.DISABLED_DHCP_FAILURE);
260        status.setConnectChoice(TEST_DUMMY_CONFIG_KEY);
261        status.setConnectChoiceTimestamp(867889);
262        status.setHasEverConnected(true);
263
264        // Serialize this to XML string.
265        byte[] xmlData = serializeNetworkSelectionStatus(status);
266
267        // Now modify the status string with some invalid string in XML data..
268        String xmlString = new String(xmlData);
269        String deprecatedXmlString =
270                xmlString.replaceAll(
271                        status.getNetworkStatusString(), "NETWORK_SELECTION_DEPRECATED");
272        // Ensure that the modification did take effect.
273        assertFalse(xmlString.equals(deprecatedXmlString));
274
275        // Now Deserialize the modified XML data.
276        byte[] deprecatedXmlData = xmlString.getBytes();
277        NetworkSelectionStatus retrievedStatus =
278                deserializeNetworkSelectionStatus(deprecatedXmlData);
279
280        // The status retrieved should have reset both the |Status| & |DisableReason| fields after
281        // deserialization, but should have restored all the other fields correctly.
282        NetworkSelectionStatus expectedStatus = new NetworkSelectionStatus();
283        expectedStatus.copy(status);
284        expectedStatus.setNetworkSelectionStatus(NetworkSelectionStatus.NETWORK_SELECTION_ENABLED);
285        expectedStatus.setNetworkSelectionDisableReason(
286                NetworkSelectionStatus.NETWORK_SELECTION_ENABLE);
287
288        WifiConfigurationTestUtil.assertNetworkSelectionStatusEqualForConfigStore(
289                expectedStatus, retrievedStatus);
290    }
291
292    /**
293     * Verify that a network selection disable reason deprecation is handled correctly during
294     * restore of data after upgrade.
295     * This test tries to simulate the scenario where we have a
296     * {@link NetworkSelectionStatus#getNetworkDisableReasonString()} ()} string stored
297     * in the XML file from a previous release which has now been deprecated. The network should
298     * be restored as enabled.
299     */
300    @Test
301    public void testDeprecatedNetworkSelectionDisableReasonDeserialize()
302            throws IOException, XmlPullParserException {
303        // Create a dummy network selection status.
304        NetworkSelectionStatus status = new NetworkSelectionStatus();
305        status.setNetworkSelectionStatus(
306                NetworkSelectionStatus.NETWORK_SELECTION_TEMPORARY_DISABLED);
307        status.setNetworkSelectionDisableReason(
308                NetworkSelectionStatus.DISABLED_DHCP_FAILURE);
309        status.setConnectChoice(TEST_DUMMY_CONFIG_KEY);
310        status.setConnectChoiceTimestamp(867889);
311        status.setHasEverConnected(true);
312
313        // Serialize this to XML string.
314        byte[] xmlData = serializeNetworkSelectionStatus(status);
315
316        // Now modify the disable reason string with some invalid string in XML data.
317        String xmlString = new String(xmlData);
318        String deprecatedXmlString =
319                xmlString.replaceAll(status.getNetworkDisableReasonString(), "DISABLED_DEPRECATED");
320        // Ensure that the modification did take effect.
321        assertFalse(xmlString.equals(deprecatedXmlString));
322
323        // Now Deserialize the modified XML data.
324        byte[] deprecatedXmlData = xmlString.getBytes();
325        NetworkSelectionStatus retrievedStatus =
326                deserializeNetworkSelectionStatus(deprecatedXmlData);
327
328        // The status retrieved should have reset both the |Status| & |DisableReason| fields after
329        // deserialization, but should have restored all the other fields correctly.
330        NetworkSelectionStatus expectedStatus = new NetworkSelectionStatus();
331        expectedStatus.copy(status);
332        expectedStatus.setNetworkSelectionStatus(NetworkSelectionStatus.NETWORK_SELECTION_ENABLED);
333        expectedStatus.setNetworkSelectionDisableReason(
334                NetworkSelectionStatus.NETWORK_SELECTION_ENABLE);
335
336        WifiConfigurationTestUtil.assertNetworkSelectionStatusEqualForConfigStore(
337                expectedStatus, retrievedStatus);
338    }
339
340    /**
341     * Verify that a WifiEnterpriseConfig object is serialized & deserialized correctly.
342     */
343    @Test
344    public void testWifiEnterpriseConfigSerializeDeserialize()
345            throws IOException, XmlPullParserException {
346        WifiEnterpriseConfig config = new WifiEnterpriseConfig();
347        config.setFieldValue(WifiEnterpriseConfig.IDENTITY_KEY, TEST_IDENTITY);
348        config.setFieldValue(WifiEnterpriseConfig.ANON_IDENTITY_KEY, TEST_ANON_IDENTITY);
349        config.setFieldValue(WifiEnterpriseConfig.PASSWORD_KEY, TEST_PASSWORD);
350        config.setFieldValue(WifiEnterpriseConfig.CLIENT_CERT_KEY, TEST_CLIENT_CERT);
351        config.setFieldValue(WifiEnterpriseConfig.CA_CERT_KEY, TEST_CA_CERT);
352        config.setFieldValue(WifiEnterpriseConfig.SUBJECT_MATCH_KEY, TEST_SUBJECT_MATCH);
353        config.setFieldValue(WifiEnterpriseConfig.ENGINE_KEY, TEST_ENGINE);
354        config.setFieldValue(WifiEnterpriseConfig.ENGINE_ID_KEY, TEST_ENGINE_ID);
355        config.setFieldValue(WifiEnterpriseConfig.PRIVATE_KEY_ID_KEY, TEST_PRIVATE_KEY_ID);
356        config.setFieldValue(WifiEnterpriseConfig.ALTSUBJECT_MATCH_KEY, TEST_ALTSUBJECT_MATCH);
357        config.setFieldValue(WifiEnterpriseConfig.DOM_SUFFIX_MATCH_KEY, TEST_DOM_SUFFIX_MATCH);
358        config.setFieldValue(WifiEnterpriseConfig.CA_PATH_KEY, TEST_CA_PATH);
359        config.setEapMethod(TEST_EAP_METHOD);
360        config.setPhase2Method(TEST_PHASE2_METHOD);
361        serializeDeserializeWifiEnterpriseConfig(config);
362    }
363
364    private byte[] serializeWifiConfigurationForBackup(WifiConfiguration configuration)
365            throws IOException, XmlPullParserException {
366        final XmlSerializer out = new FastXmlSerializer();
367        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
368        out.setOutput(outputStream, StandardCharsets.UTF_8.name());
369        XmlUtil.writeDocumentStart(out, mXmlDocHeader);
370        WifiConfigurationXmlUtil.writeToXmlForBackup(out, configuration);
371        XmlUtil.writeDocumentEnd(out, mXmlDocHeader);
372        return outputStream.toByteArray();
373    }
374
375    private byte[] serializeWifiConfigurationForConfigStore(
376            WifiConfiguration configuration)
377            throws IOException, XmlPullParserException {
378        final XmlSerializer out = new FastXmlSerializer();
379        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
380        out.setOutput(outputStream, StandardCharsets.UTF_8.name());
381        XmlUtil.writeDocumentStart(out, mXmlDocHeader);
382        WifiConfigurationXmlUtil.writeToXmlForConfigStore(out, configuration);
383        XmlUtil.writeDocumentEnd(out, mXmlDocHeader);
384        return outputStream.toByteArray();
385    }
386
387    private Pair<String, WifiConfiguration> deserializeWifiConfiguration(byte[] data)
388            throws IOException, XmlPullParserException {
389        // Deserialize the configuration object.
390        final XmlPullParser in = Xml.newPullParser();
391        ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
392        in.setInput(inputStream, StandardCharsets.UTF_8.name());
393        XmlUtil.gotoDocumentStart(in, mXmlDocHeader);
394        return WifiConfigurationXmlUtil.parseFromXml(in, in.getDepth());
395    }
396
397    /**
398     * This helper method tests the serialization for backup/restore.
399     */
400    private void serializeDeserializeWifiConfigurationForBackupRestore(
401            WifiConfiguration configuration)
402            throws IOException, XmlPullParserException {
403        Pair<String, WifiConfiguration> retrieved;
404        // Test serialization/deserialization for config store.
405        retrieved =
406                deserializeWifiConfiguration(
407                        serializeWifiConfigurationForBackup(configuration));
408        assertEquals(retrieved.first, retrieved.second.configKey());
409        WifiConfigurationTestUtil.assertConfigurationEqualForBackup(
410                configuration, retrieved.second);
411    }
412
413    /**
414     * This helper method tests the serialization for config store.
415     */
416    private void serializeDeserializeWifiConfigurationForConfigStore(
417            WifiConfiguration configuration)
418            throws IOException, XmlPullParserException {
419        // Reset enterprise config because this needs to be serialized/deserialized separately.
420        configuration.enterpriseConfig = new WifiEnterpriseConfig();
421        Pair<String, WifiConfiguration> retrieved;
422        // Test serialization/deserialization for config store.
423        retrieved =
424                deserializeWifiConfiguration(
425                        serializeWifiConfigurationForConfigStore(configuration));
426        assertEquals(retrieved.first, retrieved.second.configKey());
427        WifiConfigurationTestUtil.assertConfigurationEqualForConfigStore(
428                configuration, retrieved.second);
429    }
430
431    /**
432     * This helper method tests both the serialization for backup/restore and config store.
433     */
434    private void serializeDeserializeWifiConfiguration(WifiConfiguration configuration)
435            throws IOException, XmlPullParserException {
436        Pair<String, WifiConfiguration> retrieved;
437        // Test serialization/deserialization for backup first.
438        serializeDeserializeWifiConfigurationForBackupRestore(configuration);
439
440        // Test serialization/deserialization for config store.
441        serializeDeserializeWifiConfigurationForConfigStore(configuration);
442    }
443
444    private void serializeDeserializeIpConfiguration(IpConfiguration configuration)
445            throws IOException, XmlPullParserException {
446        // Serialize the configuration object.
447        final XmlSerializer out = new FastXmlSerializer();
448        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
449        out.setOutput(outputStream, StandardCharsets.UTF_8.name());
450        XmlUtil.writeDocumentStart(out, mXmlDocHeader);
451        IpConfigurationXmlUtil.writeToXml(out, configuration);
452        XmlUtil.writeDocumentEnd(out, mXmlDocHeader);
453
454        // Deserialize the configuration object.
455        final XmlPullParser in = Xml.newPullParser();
456        ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
457        in.setInput(inputStream, StandardCharsets.UTF_8.name());
458        XmlUtil.gotoDocumentStart(in, mXmlDocHeader);
459        IpConfiguration retrievedConfiguration =
460                IpConfigurationXmlUtil.parseFromXml(in, in.getDepth());
461        assertEquals(configuration, retrievedConfiguration);
462    }
463
464    private byte[] serializeNetworkSelectionStatus(NetworkSelectionStatus status)
465            throws IOException, XmlPullParserException {
466        // Serialize the configuration object.
467        final XmlSerializer out = new FastXmlSerializer();
468        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
469        out.setOutput(outputStream, StandardCharsets.UTF_8.name());
470        XmlUtil.writeDocumentStart(out, mXmlDocHeader);
471        NetworkSelectionStatusXmlUtil.writeToXml(out, status);
472        XmlUtil.writeDocumentEnd(out, mXmlDocHeader);
473        return outputStream.toByteArray();
474    }
475
476    private NetworkSelectionStatus deserializeNetworkSelectionStatus(byte[] data)
477            throws IOException, XmlPullParserException {
478        final XmlPullParser in = Xml.newPullParser();
479        ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
480        in.setInput(inputStream, StandardCharsets.UTF_8.name());
481        XmlUtil.gotoDocumentStart(in, mXmlDocHeader);
482        return NetworkSelectionStatusXmlUtil.parseFromXml(in, in.getDepth());
483    }
484
485    private void serializeDeserializeNetworkSelectionStatus(NetworkSelectionStatus status)
486            throws IOException, XmlPullParserException {
487        // Serialize the status object.
488        byte[] data = serializeNetworkSelectionStatus(status);
489        // Deserialize the status object.
490        NetworkSelectionStatus retrievedStatus = deserializeNetworkSelectionStatus(data);
491
492        WifiConfigurationTestUtil.assertNetworkSelectionStatusEqualForConfigStore(
493                status, retrievedStatus);
494    }
495
496    private void serializeDeserializeWifiEnterpriseConfig(WifiEnterpriseConfig config)
497            throws IOException, XmlPullParserException {
498        // Serialize the configuration object.
499        final XmlSerializer out = new FastXmlSerializer();
500        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
501        out.setOutput(outputStream, StandardCharsets.UTF_8.name());
502        XmlUtil.writeDocumentStart(out, mXmlDocHeader);
503        WifiEnterpriseConfigXmlUtil.writeToXml(out, config);
504        XmlUtil.writeDocumentEnd(out, mXmlDocHeader);
505
506        // Deserialize the configuration object.
507        final XmlPullParser in = Xml.newPullParser();
508        ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
509        in.setInput(inputStream, StandardCharsets.UTF_8.name());
510        XmlUtil.gotoDocumentStart(in, mXmlDocHeader);
511        WifiEnterpriseConfig retrievedConfig =
512                WifiEnterpriseConfigXmlUtil.parseFromXml(in, in.getDepth());
513        WifiConfigurationTestUtil.assertWifiEnterpriseConfigEqualForConfigStore(
514                config, retrievedConfig);
515    }
516}
517