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 17 package com.android.server.wifi.util; 18 19 import static org.junit.Assert.*; 20 import static org.mockito.Mockito.*; 21 22 import android.net.IpConfiguration; 23 import android.net.wifi.WifiConfiguration; 24 import android.net.wifi.WifiConfiguration.NetworkSelectionStatus; 25 import android.net.wifi.WifiEnterpriseConfig; 26 import android.test.suitebuilder.annotation.SmallTest; 27 import android.util.Pair; 28 import android.util.Xml; 29 30 import com.android.internal.util.FastXmlSerializer; 31 import com.android.server.wifi.WifiConfigurationTestUtil; 32 import com.android.server.wifi.util.XmlUtil.IpConfigurationXmlUtil; 33 import com.android.server.wifi.util.XmlUtil.NetworkSelectionStatusXmlUtil; 34 import com.android.server.wifi.util.XmlUtil.WifiConfigurationXmlUtil; 35 import com.android.server.wifi.util.XmlUtil.WifiEnterpriseConfigXmlUtil; 36 37 import org.junit.Test; 38 import org.xmlpull.v1.XmlPullParser; 39 import org.xmlpull.v1.XmlPullParserException; 40 import org.xmlpull.v1.XmlSerializer; 41 42 import java.io.ByteArrayInputStream; 43 import java.io.ByteArrayOutputStream; 44 import java.io.IOException; 45 import java.nio.charset.StandardCharsets; 46 import java.util.HashMap; 47 48 /** 49 * Unit tests for {@link com.android.server.wifi.util.XmlUtil}. 50 */ 51 @SmallTest 52 public 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 a WifiConfiguration with status as CURRENT when serializing 216 * is deserialized as ENABLED. 217 */ 218 @Test 219 public void testCurrentStatusConfigurationSerializeDeserializeForConfigStore() 220 throws IOException, XmlPullParserException { 221 WifiConfiguration configuration = WifiConfigurationTestUtil.createEapNetwork(); 222 configuration.status = WifiConfiguration.Status.CURRENT; 223 byte[] xmlData = serializeWifiConfigurationForConfigStore(configuration); 224 Pair<String, WifiConfiguration> deserializedConfiguration = 225 deserializeWifiConfiguration(xmlData); 226 assertEquals(WifiConfiguration.Status.ENABLED, deserializedConfiguration.second.status); 227 } 228 229 /** 230 * Verify that an enabled network selection status object is serialized & deserialized 231 * correctly. 232 */ 233 @Test 234 public void testEnabledNetworkSelectionStatusSerializeDeserialize() 235 throws IOException, XmlPullParserException { 236 NetworkSelectionStatus status = new NetworkSelectionStatus(); 237 status.setNetworkSelectionStatus(NetworkSelectionStatus.NETWORK_SELECTION_ENABLED); 238 status.setNetworkSelectionDisableReason(NetworkSelectionStatus.NETWORK_SELECTION_ENABLE); 239 status.setConnectChoice(TEST_DUMMY_CONFIG_KEY); 240 status.setConnectChoiceTimestamp(867889); 241 status.setHasEverConnected(true); 242 serializeDeserializeNetworkSelectionStatus(status); 243 } 244 245 /** 246 * Verify that a temporarily disabled network selection status object is serialized & 247 * deserialized correctly. 248 */ 249 @Test 250 public void testTemporarilyDisabledNetworkSelectionStatusSerializeDeserialize() 251 throws IOException, XmlPullParserException { 252 NetworkSelectionStatus status = new NetworkSelectionStatus(); 253 status.setNetworkSelectionStatus( 254 NetworkSelectionStatus.NETWORK_SELECTION_TEMPORARY_DISABLED); 255 status.setNetworkSelectionDisableReason( 256 NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION); 257 serializeDeserializeNetworkSelectionStatus(status); 258 } 259 260 /** 261 * Verify that a network selection status deprecation is handled correctly during restore 262 * of data after upgrade. 263 * This test tries to simulate the scenario where we have a 264 * {@link NetworkSelectionStatus#getNetworkStatusString()} string stored 265 * in the XML file from a previous release which has now been deprecated. The network should 266 * be restored as enabled. 267 */ 268 @Test 269 public void testDeprecatedNetworkSelectionStatusDeserialize() 270 throws IOException, XmlPullParserException { 271 // Create a dummy network selection status. 272 NetworkSelectionStatus status = new NetworkSelectionStatus(); 273 status.setNetworkSelectionStatus( 274 NetworkSelectionStatus.NETWORK_SELECTION_TEMPORARY_DISABLED); 275 status.setNetworkSelectionDisableReason( 276 NetworkSelectionStatus.DISABLED_DHCP_FAILURE); 277 status.setConnectChoice(TEST_DUMMY_CONFIG_KEY); 278 status.setConnectChoiceTimestamp(867889); 279 status.setHasEverConnected(true); 280 281 // Serialize this to XML string. 282 byte[] xmlData = serializeNetworkSelectionStatus(status); 283 284 // Now modify the status string with some invalid string in XML data.. 285 String xmlString = new String(xmlData); 286 String deprecatedXmlString = 287 xmlString.replaceAll( 288 status.getNetworkStatusString(), "NETWORK_SELECTION_DEPRECATED"); 289 // Ensure that the modification did take effect. 290 assertFalse(xmlString.equals(deprecatedXmlString)); 291 292 // Now Deserialize the modified XML data. 293 byte[] deprecatedXmlData = xmlString.getBytes(); 294 NetworkSelectionStatus retrievedStatus = 295 deserializeNetworkSelectionStatus(deprecatedXmlData); 296 297 // The status retrieved should have reset both the |Status| & |DisableReason| fields after 298 // deserialization, but should have restored all the other fields correctly. 299 NetworkSelectionStatus expectedStatus = new NetworkSelectionStatus(); 300 expectedStatus.copy(status); 301 expectedStatus.setNetworkSelectionStatus(NetworkSelectionStatus.NETWORK_SELECTION_ENABLED); 302 expectedStatus.setNetworkSelectionDisableReason( 303 NetworkSelectionStatus.NETWORK_SELECTION_ENABLE); 304 305 WifiConfigurationTestUtil.assertNetworkSelectionStatusEqualForConfigStore( 306 expectedStatus, retrievedStatus); 307 } 308 309 /** 310 * Verify that a network selection disable reason deprecation is handled correctly during 311 * restore of data after upgrade. 312 * This test tries to simulate the scenario where we have a 313 * {@link NetworkSelectionStatus#getNetworkDisableReasonString()} ()} string stored 314 * in the XML file from a previous release which has now been deprecated. The network should 315 * be restored as enabled. 316 */ 317 @Test 318 public void testDeprecatedNetworkSelectionDisableReasonDeserialize() 319 throws IOException, XmlPullParserException { 320 // Create a dummy network selection status. 321 NetworkSelectionStatus status = new NetworkSelectionStatus(); 322 status.setNetworkSelectionStatus( 323 NetworkSelectionStatus.NETWORK_SELECTION_TEMPORARY_DISABLED); 324 status.setNetworkSelectionDisableReason( 325 NetworkSelectionStatus.DISABLED_DHCP_FAILURE); 326 status.setConnectChoice(TEST_DUMMY_CONFIG_KEY); 327 status.setConnectChoiceTimestamp(867889); 328 status.setHasEverConnected(true); 329 330 // Serialize this to XML string. 331 byte[] xmlData = serializeNetworkSelectionStatus(status); 332 333 // Now modify the disable reason string with some invalid string in XML data. 334 String xmlString = new String(xmlData); 335 String deprecatedXmlString = 336 xmlString.replaceAll(status.getNetworkDisableReasonString(), "DISABLED_DEPRECATED"); 337 // Ensure that the modification did take effect. 338 assertFalse(xmlString.equals(deprecatedXmlString)); 339 340 // Now Deserialize the modified XML data. 341 byte[] deprecatedXmlData = xmlString.getBytes(); 342 NetworkSelectionStatus retrievedStatus = 343 deserializeNetworkSelectionStatus(deprecatedXmlData); 344 345 // The status retrieved should have reset both the |Status| & |DisableReason| fields after 346 // deserialization, but should have restored all the other fields correctly. 347 NetworkSelectionStatus expectedStatus = new NetworkSelectionStatus(); 348 expectedStatus.copy(status); 349 expectedStatus.setNetworkSelectionStatus(NetworkSelectionStatus.NETWORK_SELECTION_ENABLED); 350 expectedStatus.setNetworkSelectionDisableReason( 351 NetworkSelectionStatus.NETWORK_SELECTION_ENABLE); 352 353 WifiConfigurationTestUtil.assertNetworkSelectionStatusEqualForConfigStore( 354 expectedStatus, retrievedStatus); 355 } 356 357 /** 358 * Verify that a WifiEnterpriseConfig object is serialized & deserialized correctly. 359 */ 360 @Test 361 public void testWifiEnterpriseConfigSerializeDeserialize() 362 throws IOException, XmlPullParserException { 363 WifiEnterpriseConfig config = new WifiEnterpriseConfig(); 364 config.setFieldValue(WifiEnterpriseConfig.IDENTITY_KEY, TEST_IDENTITY); 365 config.setFieldValue(WifiEnterpriseConfig.ANON_IDENTITY_KEY, TEST_ANON_IDENTITY); 366 config.setFieldValue(WifiEnterpriseConfig.PASSWORD_KEY, TEST_PASSWORD); 367 config.setFieldValue(WifiEnterpriseConfig.CLIENT_CERT_KEY, TEST_CLIENT_CERT); 368 config.setFieldValue(WifiEnterpriseConfig.CA_CERT_KEY, TEST_CA_CERT); 369 config.setFieldValue(WifiEnterpriseConfig.SUBJECT_MATCH_KEY, TEST_SUBJECT_MATCH); 370 config.setFieldValue(WifiEnterpriseConfig.ENGINE_KEY, TEST_ENGINE); 371 config.setFieldValue(WifiEnterpriseConfig.ENGINE_ID_KEY, TEST_ENGINE_ID); 372 config.setFieldValue(WifiEnterpriseConfig.PRIVATE_KEY_ID_KEY, TEST_PRIVATE_KEY_ID); 373 config.setFieldValue(WifiEnterpriseConfig.ALTSUBJECT_MATCH_KEY, TEST_ALTSUBJECT_MATCH); 374 config.setFieldValue(WifiEnterpriseConfig.DOM_SUFFIX_MATCH_KEY, TEST_DOM_SUFFIX_MATCH); 375 config.setFieldValue(WifiEnterpriseConfig.CA_PATH_KEY, TEST_CA_PATH); 376 config.setEapMethod(TEST_EAP_METHOD); 377 config.setPhase2Method(TEST_PHASE2_METHOD); 378 serializeDeserializeWifiEnterpriseConfig(config); 379 } 380 381 /** 382 * Verify that an illegal argument exception is thrown when trying to parse out a corrupted 383 * WifiEnterpriseConfig. 384 * 385 * @throws Exception 386 */ 387 @Test(expected = IllegalArgumentException.class) 388 public void testWifiEnterpriseConfigSerializeDeserializeThrowsIllegalArgException() 389 throws Exception { 390 WifiEnterpriseConfig config = new WifiEnterpriseConfig(); 391 config.setFieldValue(WifiEnterpriseConfig.IDENTITY_KEY, TEST_IDENTITY); 392 config.setFieldValue(WifiEnterpriseConfig.ANON_IDENTITY_KEY, TEST_ANON_IDENTITY); 393 config.setFieldValue(WifiEnterpriseConfig.PASSWORD_KEY, TEST_PASSWORD); 394 config.setFieldValue(WifiEnterpriseConfig.CLIENT_CERT_KEY, TEST_CLIENT_CERT); 395 config.setFieldValue(WifiEnterpriseConfig.CA_CERT_KEY, TEST_CA_CERT); 396 config.setFieldValue(WifiEnterpriseConfig.SUBJECT_MATCH_KEY, TEST_SUBJECT_MATCH); 397 config.setFieldValue(WifiEnterpriseConfig.ENGINE_KEY, TEST_ENGINE); 398 config.setFieldValue(WifiEnterpriseConfig.ENGINE_ID_KEY, TEST_ENGINE_ID); 399 config.setFieldValue(WifiEnterpriseConfig.PRIVATE_KEY_ID_KEY, TEST_PRIVATE_KEY_ID); 400 config.setFieldValue(WifiEnterpriseConfig.ALTSUBJECT_MATCH_KEY, TEST_ALTSUBJECT_MATCH); 401 config.setFieldValue(WifiEnterpriseConfig.DOM_SUFFIX_MATCH_KEY, TEST_DOM_SUFFIX_MATCH); 402 config.setFieldValue(WifiEnterpriseConfig.CA_PATH_KEY, TEST_CA_PATH); 403 config.setEapMethod(TEST_EAP_METHOD); 404 config.setPhase2Method(TEST_PHASE2_METHOD); 405 String xmlString = new String(serializeWifiEnterpriseConfig(config)); 406 // Manipulate the XML data to set the EAP method to None, this should raise an Illegal 407 // argument exception in WifiEnterpriseConfig.setEapMethod(). 408 xmlString = xmlString.replaceAll( 409 String.format(XML_STRING_EAP_METHOD_REPLACE_FORMAT, TEST_EAP_METHOD), 410 String.format(XML_STRING_EAP_METHOD_REPLACE_FORMAT, WifiEnterpriseConfig.Eap.NONE)); 411 deserializeWifiEnterpriseConfig(xmlString.getBytes(StandardCharsets.UTF_8)); 412 } 413 414 /** 415 * Verify that WifiConfiguration representation of a legacy Passpoint configuration is 416 * serialized & deserialized correctly. 417 * 418 *@throws Exception 419 */ 420 @Test 421 public void testLegacyPasspointConfigSerializeDeserialize() throws Exception { 422 WifiConfiguration config = WifiConfigurationTestUtil.createPasspointNetwork(); 423 config.isLegacyPasspointConfig = true; 424 config.roamingConsortiumIds = new long[] {0x12345678}; 425 config.enterpriseConfig.setPlmn("1234"); 426 config.enterpriseConfig.setRealm("test.com"); 427 serializeDeserializeWifiConfigurationForConfigStore(config); 428 } 429 430 private byte[] serializeWifiConfigurationForBackup(WifiConfiguration configuration) 431 throws IOException, XmlPullParserException { 432 final XmlSerializer out = new FastXmlSerializer(); 433 final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 434 out.setOutput(outputStream, StandardCharsets.UTF_8.name()); 435 XmlUtil.writeDocumentStart(out, mXmlDocHeader); 436 WifiConfigurationXmlUtil.writeToXmlForBackup(out, configuration); 437 XmlUtil.writeDocumentEnd(out, mXmlDocHeader); 438 return outputStream.toByteArray(); 439 } 440 441 private byte[] serializeWifiConfigurationForConfigStore( 442 WifiConfiguration configuration) 443 throws IOException, XmlPullParserException { 444 final XmlSerializer out = new FastXmlSerializer(); 445 final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 446 out.setOutput(outputStream, StandardCharsets.UTF_8.name()); 447 XmlUtil.writeDocumentStart(out, mXmlDocHeader); 448 WifiConfigurationXmlUtil.writeToXmlForConfigStore(out, configuration); 449 XmlUtil.writeDocumentEnd(out, mXmlDocHeader); 450 return outputStream.toByteArray(); 451 } 452 453 private Pair<String, WifiConfiguration> deserializeWifiConfiguration(byte[] data) 454 throws IOException, XmlPullParserException { 455 // Deserialize the configuration object. 456 final XmlPullParser in = Xml.newPullParser(); 457 ByteArrayInputStream inputStream = new ByteArrayInputStream(data); 458 in.setInput(inputStream, StandardCharsets.UTF_8.name()); 459 XmlUtil.gotoDocumentStart(in, mXmlDocHeader); 460 return WifiConfigurationXmlUtil.parseFromXml(in, in.getDepth()); 461 } 462 463 /** 464 * This helper method tests the serialization for backup/restore. 465 */ 466 private void serializeDeserializeWifiConfigurationForBackupRestore( 467 WifiConfiguration configuration) 468 throws IOException, XmlPullParserException { 469 Pair<String, WifiConfiguration> retrieved; 470 // Test serialization/deserialization for config store. 471 retrieved = 472 deserializeWifiConfiguration( 473 serializeWifiConfigurationForBackup(configuration)); 474 assertEquals(retrieved.first, retrieved.second.configKey()); 475 WifiConfigurationTestUtil.assertConfigurationEqualForBackup( 476 configuration, retrieved.second); 477 } 478 479 /** 480 * This helper method tests the serialization for config store. 481 */ 482 private void serializeDeserializeWifiConfigurationForConfigStore( 483 WifiConfiguration configuration) 484 throws IOException, XmlPullParserException { 485 // Reset enterprise config because this needs to be serialized/deserialized separately. 486 configuration.enterpriseConfig = new WifiEnterpriseConfig(); 487 Pair<String, WifiConfiguration> retrieved; 488 // Test serialization/deserialization for config store. 489 retrieved = 490 deserializeWifiConfiguration( 491 serializeWifiConfigurationForConfigStore(configuration)); 492 assertEquals(retrieved.first, retrieved.second.configKey()); 493 WifiConfigurationTestUtil.assertConfigurationEqualForConfigStore( 494 configuration, retrieved.second); 495 } 496 497 /** 498 * This helper method tests both the serialization for backup/restore and config store. 499 */ 500 private void serializeDeserializeWifiConfiguration(WifiConfiguration configuration) 501 throws IOException, XmlPullParserException { 502 Pair<String, WifiConfiguration> retrieved; 503 // Test serialization/deserialization for backup first. 504 serializeDeserializeWifiConfigurationForBackupRestore(configuration); 505 506 // Test serialization/deserialization for config store. 507 serializeDeserializeWifiConfigurationForConfigStore(configuration); 508 } 509 510 private void serializeDeserializeIpConfiguration(IpConfiguration configuration) 511 throws IOException, XmlPullParserException { 512 // Serialize the configuration object. 513 final XmlSerializer out = new FastXmlSerializer(); 514 final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 515 out.setOutput(outputStream, StandardCharsets.UTF_8.name()); 516 XmlUtil.writeDocumentStart(out, mXmlDocHeader); 517 IpConfigurationXmlUtil.writeToXml(out, configuration); 518 XmlUtil.writeDocumentEnd(out, mXmlDocHeader); 519 520 // Deserialize the configuration object. 521 final XmlPullParser in = Xml.newPullParser(); 522 ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); 523 in.setInput(inputStream, StandardCharsets.UTF_8.name()); 524 XmlUtil.gotoDocumentStart(in, mXmlDocHeader); 525 IpConfiguration retrievedConfiguration = 526 IpConfigurationXmlUtil.parseFromXml(in, in.getDepth()); 527 assertEquals(configuration, retrievedConfiguration); 528 } 529 530 private byte[] serializeNetworkSelectionStatus(NetworkSelectionStatus status) 531 throws IOException, XmlPullParserException { 532 // Serialize the configuration object. 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 NetworkSelectionStatusXmlUtil.writeToXml(out, status); 538 XmlUtil.writeDocumentEnd(out, mXmlDocHeader); 539 return outputStream.toByteArray(); 540 } 541 542 private NetworkSelectionStatus deserializeNetworkSelectionStatus(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 NetworkSelectionStatusXmlUtil.parseFromXml(in, in.getDepth()); 549 } 550 551 private void serializeDeserializeNetworkSelectionStatus(NetworkSelectionStatus status) 552 throws IOException, XmlPullParserException { 553 // Serialize the status object. 554 byte[] data = serializeNetworkSelectionStatus(status); 555 // Deserialize the status object. 556 NetworkSelectionStatus retrievedStatus = deserializeNetworkSelectionStatus(data); 557 558 WifiConfigurationTestUtil.assertNetworkSelectionStatusEqualForConfigStore( 559 status, retrievedStatus); 560 } 561 562 private byte[] serializeWifiEnterpriseConfig(WifiEnterpriseConfig config) 563 throws IOException, XmlPullParserException { 564 final XmlSerializer out = new FastXmlSerializer(); 565 final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 566 out.setOutput(outputStream, StandardCharsets.UTF_8.name()); 567 XmlUtil.writeDocumentStart(out, mXmlDocHeader); 568 WifiEnterpriseConfigXmlUtil.writeToXml(out, config); 569 XmlUtil.writeDocumentEnd(out, mXmlDocHeader); 570 return outputStream.toByteArray(); 571 } 572 573 private WifiEnterpriseConfig deserializeWifiEnterpriseConfig(byte[] data) 574 throws IOException, XmlPullParserException { 575 final XmlPullParser in = Xml.newPullParser(); 576 ByteArrayInputStream inputStream = new ByteArrayInputStream(data); 577 in.setInput(inputStream, StandardCharsets.UTF_8.name()); 578 XmlUtil.gotoDocumentStart(in, mXmlDocHeader); 579 return WifiEnterpriseConfigXmlUtil.parseFromXml(in, in.getDepth()); 580 } 581 582 private void serializeDeserializeWifiEnterpriseConfig(WifiEnterpriseConfig config) 583 throws IOException, XmlPullParserException { 584 WifiEnterpriseConfig retrievedConfig = 585 deserializeWifiEnterpriseConfig(serializeWifiEnterpriseConfig(config)); 586 WifiConfigurationTestUtil.assertWifiEnterpriseConfigEqualForConfigStore( 587 config, retrievedConfig); 588 } 589 } 590