1 /* 2 * Copyright (C) 2021 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.imsserviceentitlement.utils; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import androidx.test.runner.AndroidJUnit4; 22 23 import org.junit.Test; 24 import org.junit.runner.RunWith; 25 26 @RunWith(AndroidJUnit4.class) 27 public class XmlDocTest { 28 // XML sample from vendor A 29 private static final String AUTH_RESPONSE_XML = 30 "<wap-provisioningdoc version=\"1.1\">\n" 31 + " <characteristic type=\"VERS\">\n" 32 + " <parm name=\"version\" value=\"1\"/>\n" 33 + " <parm name=\"validity\" value=\"1728000\"/>\n" 34 + " </characteristic>\n" 35 + " <characteristic type=\"TOKEN\">\n" 36 + " <parm name=\"token\" value=\"kZYfCEpSsMr88KZVmab5UsZVzl+nWSsX\"/>\n" 37 + " <parm name=\"validity\" value=\"3600\"/>\n" 38 + " </characteristic>\n" 39 + " <characteristic type=\"APPLICATION\">\n" 40 + " <parm name=\"AppID\" value=\"ap2004\"/>\n" 41 + " <parm name=\"Name\" value=\"VoWiFi Entitlement settings\"/>\n" 42 + " <parm name=\"EntitlementStatus\" value=\"0\"/>\n" 43 + " <parm name=\"AddrStatus\" value=\"0\"/>\n" 44 + " <parm name=\"TC_Status\" value=\"0\"/>\n" 45 + " <parm name=\"ProvStatus\" value=\"2\"/>\n" 46 + " <parm name=\"ServiceFlow_URL\"" 47 + " value=\"http://vm-host:8180/self-prov-websheet/rcs\"/>\n" 48 + " <parm name=\"ServiceFlow_UserData\"" 49 + " value=\"token=Y5vcmc%3D&entitlementStatus=0&protocol=TS43&" 50 + "provStatus=2&deviceId=358316079424742&subscriberId=0311580718847611" 51 + "%40nai.epc.mnc130.mcc310.3gppnetwork.org&ShowAddress=true\"/>\n" 52 + " </characteristic>\n" 53 + "</wap-provisioningdoc>\n"; 54 55 // XML sample from vendor B, note unescaped "&" in ServiceFlow_UserData 56 private static final String AUTH_RESPONSE_XML_2 = 57 "<?xml version=\"1.0\"?>" 58 + "<wap-provisioningdoc version=\"1.1\">" 59 + "<characteristic type=\"VERS\">" 60 + "<parm name=\"version\" value=\"4\"/>" 61 + "<parm name=\"validity\" value=\"172800\"/>" 62 + "</characteristic>" 63 + "<characteristic type=\"TOKEN\">" 64 + "<parm name=\"token\" value=\"kZYfCEpSsMr88KZVmab5UsZVzl+nWSsX\"/>" 65 + "</characteristic>" 66 + "<characteristic type=\"APPLICATION\">" 67 + "<parm name=\"AppID\" value=\"ap2004\"/>" 68 + "<parm name=\"Name\" value=\"VoWiFi Entitlement settings\"/>" 69 + "<parm name=\"MessageForIncompatible\" value=\"99\"/>" 70 + "<parm name=\"EntitlementStatus\" value=\"0\"/>" 71 + "<parm name=\"ServiceFlow_URL\" value=\"" 72 + "https://deg.cspire.com/VoWiFi/CheckPostData\"/>" 73 + "<parm name=\"ServiceFlow_UserData\" value=\"" 74 + "PostData=U6%2FbQ%2BEP&req_locale=en_US\"/>" 75 + "<parm name=\"AddrStatus\" value=\"0\"/>" 76 + "<parm name=\"TC_Status\" value=\"0\"/>" 77 + "<parm name=\"ProvStatus\" value=\"0\"/>" 78 + "</characteristic>" 79 + "</wap-provisioningdoc>"; 80 81 // A XML sample with "&amp;" - unlikely to happen in practice but good to test 82 private static final String AUTH_RESPONSE_XML_3 = 83 "<wap-provisioningdoc version=\"1.1\">" 84 + "<characteristic type=\"APPLICATION\">" 85 + "<parm name=\"AppID\" value=\"ap2004\"/>" 86 + "<parm name=\"ServiceFlow_UserData\" value=\"" 87 + "PostData=U6%2FbQ%2BEP&amp;l=en_US\"/>" 88 + "</characteristic>" 89 + "</wap-provisioningdoc>"; 90 91 // A XML sample with server URL and user data unset. 92 private static final String AUTH_RESPONSE_XML_4 = 93 "<wap-provisioningdoc version=\"1.1\">" 94 + "<characteristic type=\"APPLICATION\">" 95 + "<parm name=\"AppID\" value=\"ap2004\"/>" 96 + "<parm name=\"ServiceFlow_URL\" value=\"\"" 97 + "<parm name=\"ServiceFlow_UserData\" value=\"\"/>" 98 + "</characteristic>" 99 + "</wap-provisioningdoc>"; 100 101 // A XML sample with multiple appIDs 102 private static final String AUTH_RESPONSE_XML_5 = 103 "<wap-provisioningdoc version=\"1.1\">" 104 + "<characteristic type=\"APPLICATION\">" 105 + "<parm name=\"AppID\" value=\"ap2004\"/>" 106 + "<parm name=\"EntitlementStatus\" value=\"0\"/>" 107 + "</characteristic>" 108 + "<characteristic type=\"APPLICATION\">" 109 + "<parm name=\"AppID\" value=\"ap2005\"/>" 110 + "<parm name=\"EntitlementStatus\" value=\"1\"/>" 111 + "</characteristic>" 112 + "</wap-provisioningdoc>"; 113 114 private static final String TOKEN = "kZYfCEpSsMr88KZVmab5UsZVzl+nWSsX"; 115 116 @Test parseAuthenticateResponse()117 public void parseAuthenticateResponse() { 118 XmlDoc xmlDoc = new XmlDoc(AUTH_RESPONSE_XML); 119 120 assertThat(xmlDoc.get("TOKEN", "token", "ap2004").get()).isEqualTo(TOKEN); 121 // Note "&" in input XML are un-escaped to "&". 122 assertThat(xmlDoc.get("APPLICATION", "ServiceFlow_UserData", "ap2004").get()) 123 .isEqualTo("token=Y5vcmc%3D" 124 + "&entitlementStatus=0" 125 + "&protocol=TS43" 126 + "&provStatus=2" 127 + "&deviceId=358316079424742" 128 + "&subscriberId=0311580718847611%40nai.epc.mnc130.mcc310.3gppnetwork.org" 129 + "&ShowAddress=true"); 130 } 131 132 @Test parseAuthenticateResponse2()133 public void parseAuthenticateResponse2() { 134 XmlDoc xmlDoc = new XmlDoc(AUTH_RESPONSE_XML_2); 135 136 assertThat(xmlDoc.get("TOKEN", "token", "ap2004").get()).isEqualTo(TOKEN); 137 // Note the "&" in input XML is kept as is 138 assertThat(xmlDoc.get("APPLICATION", "ServiceFlow_UserData", "ap2004").get()) 139 .isEqualTo("PostData=U6%2FbQ%2BEP&req_locale=en_US"); 140 } 141 142 @Test parseAuthenticateResponse3()143 public void parseAuthenticateResponse3() { 144 XmlDoc xmlDoc = new XmlDoc(AUTH_RESPONSE_XML_3); 145 146 // Note the "&amp;" in input XML is un-escaped to "&" 147 assertThat(xmlDoc.get("APPLICATION", "ServiceFlow_UserData", "ap2004").get()) 148 .isEqualTo("PostData=U6%2FbQ%2BEP&l=en_US"); 149 } 150 151 @Test parseAuthenticateResponse4()152 public void parseAuthenticateResponse4() { 153 XmlDoc xmlDoc = new XmlDoc(AUTH_RESPONSE_XML_4); 154 155 assertThat(xmlDoc.get("APPLICATION", "ServiceFlow_URL", "ap2004").isPresent()).isFalse(); 156 assertThat( 157 xmlDoc.get("APPLICATION", "ServiceFlow_UserData", "ap2004").isPresent()).isFalse(); 158 } 159 160 @Test parseAuthenticateResponse5()161 public void parseAuthenticateResponse5() { 162 XmlDoc xmlDoc = new XmlDoc(AUTH_RESPONSE_XML_5); 163 164 assertThat(xmlDoc.get("APPLICATION", "EntitlementStatus", "ap2004").get()).isEqualTo("0"); 165 assertThat(xmlDoc.get("APPLICATION", "EntitlementStatus", "ap2005").get()).isEqualTo("1"); 166 } 167 } 168