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 server URL unset and user data set. 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=\"ServiceFlow_URL\" value=\"\"/>" 107 + "<parm name=\"ServiceFlow_UserData\" value=\"TEST_DATA\"/>" 108 + "</characteristic>" 109 + "</wap-provisioningdoc>"; 110 111 // A XML sample with multiple appIDs 112 private static final String AUTH_RESPONSE_XML_6 = 113 "<wap-provisioningdoc version=\"1.1\">" 114 + "<characteristic type=\"APPLICATION\">" 115 + "<parm name=\"AppID\" value=\"ap2004\"/>" 116 + "<parm name=\"EntitlementStatus\" value=\"0\"/>" 117 + "</characteristic>" 118 + "<characteristic type=\"APPLICATION\">" 119 + "<parm name=\"AppID\" value=\"ap2005\"/>" 120 + "<parm name=\"EntitlementStatus\" value=\"1\"/>" 121 + "</characteristic>" 122 + "</wap-provisioningdoc>"; 123 124 // A TS43 v8 XML sample with separate 5G config for home and roaming networks 125 private static final String AUTH_RESPONSE_XML_7 = 126 "<wap-provisioningdoc version=\"1.1\">" 127 + "<characteristic type=\"APPLICATION\">" 128 + "<parm name=\"AppID\" value=\"ap2003\"/>" 129 + "<parm name=\"Name\" value=\"Voice over Cellular Entitlement settings\"/>" 130 + "<characteristic type=\"VoiceOverCellularEntitleInfo\">" 131 + "<characteristic type=\"RATVoiceEntitleInfoDetails\">" 132 + "<parm name=\"AccessType\" value=\"2\"/>" // 5G 133 + "<parm name=\"HomeRoamingNWType\" value=\"2\"/>" // Home network 134 + "<parm name=\"EntitlementStatus\" value=\"1\"/>" // Enabled 135 + "<parm name=\"NetworkVoiceIRATCapablity\" value=\"EPS-Fallback\"/>" 136 + "</characteristic>" 137 + "<characteristic type=\"RATVoiceEntitleInfoDetails\">" 138 + "<parm name=\"AccessType\" value=\"2\"/>" // 5G 139 + "<parm name=\"HomeRoamingNWType\" value=\"3\"/>" // Roaming network 140 + "<parm name=\"EntitlementStatus\" value=\"2\"/>" // Incompatible 141 + "<parm name=\"MessageForIncompatible\" value=\"z\"/>" 142 + "</characteristic>" 143 + "</characteristic>" 144 + "</characteristic>" 145 + "</wap-provisioningdoc>"; 146 147 // A TS43 v8 XML sample with single 4G and 5G config for both home and roaming networks 148 private static final String AUTH_RESPONSE_XML_8 = 149 "<wap-provisioningdoc version=\"1.1\">" 150 + "<characteristic type=\"APPLICATION\">" 151 + "<parm name=\"AppID\" value=\"ap2003\"/>" 152 + "<parm name=\"Name\" value=\"Voice over Cellular Entitlement settings\"/>" 153 + "<characteristic type=\"VoiceOverCellularEntitleInfo\">" 154 + "<characteristic type=\"RATVoiceEntitleInfoDetails\">" 155 + "<parm name=\"AccessType\" value=\"1\"/>" // 4G 156 + "<parm name=\"HomeRoamingNWType\" value=\"1\"/>" // Home&Roaming 157 + "<parm name=\"EntitlementStatus\" value=\"1\"/>" // Enabled 158 + "</characteristic>" 159 + "<characteristic type=\"RATVoiceEntitleInfoDetails\">" 160 + "<parm name=\"AccessType\" value=\"2\"/>" // 5G 161 + "<parm name=\"HomeRoamingNWType\" value=\"1\"/>" // Both Home and Roaming 162 + "<parm name=\"EntitlementStatus\" value=\"1\"/>" // Enabled 163 + "<parm name=\"NetworkVoiceIRATCapablity\" value=\"EPS-Fallback\"/>" 164 + "</characteristic>" 165 + "</characteristic>" 166 + "</characteristic>" 167 + "</wap-provisioningdoc>"; 168 169 // A TS43 v8 XML sample with single 4G for home network only - unlikely to happen 170 private static final String AUTH_RESPONSE_XML_9 = 171 "<wap-provisioningdoc version=\"1.1\">" 172 + "<characteristic type=\"APPLICATION\">" 173 + "<parm name=\"AppID\" value=\"ap2003\"/>" 174 + "<parm name=\"Name\" value=\"Voice over Cellular Entitlement settings\"/>" 175 + "<characteristic type=\"VoiceOverCellularEntitleInfo\">" 176 + "<characteristic type=\"RATVoiceEntitleInfoDetails\">" 177 + "<parm name=\"AccessType\" value=\"1\"/>" // 4G 178 + "<parm name=\"HomeRoamingNWType\" value=\"2\"/>" // Home 179 + "<parm name=\"EntitlementStatus\" value=\"1\"/>" // Enabled 180 + "</characteristic>" 181 + "</characteristic>" 182 + "</characteristic>" 183 + "</wap-provisioningdoc>"; 184 185 // A TS43 v8 XML sample with single 5G for home network only - unlikely to happen 186 private static final String AUTH_RESPONSE_XML_10 = 187 "<wap-provisioningdoc version=\"1.1\">" 188 + "<characteristic type=\"APPLICATION\">" 189 + "<parm name=\"AppID\" value=\"ap2003\"/>" 190 + "<parm name=\"Name\" value=\"Voice over Cellular Entitlement settings\"/>" 191 + "<characteristic type=\"VoiceOverCellularEntitleInfo\">" 192 + "<characteristic type=\"RATVoiceEntitleInfoDetails\">" 193 + "<parm name=\"AccessType\" value=\"2\"/>" // 5G 194 + "<parm name=\"HomeRoamingNWType\" value=\"2\"/>" // Home 195 + "<parm name=\"EntitlementStatus\" value=\"1\"/>" // Enabled 196 + "</characteristic>" 197 + "</characteristic>" 198 + "</characteristic>" 199 + "</wap-provisioningdoc>"; 200 201 private static final String TOKEN = "kZYfCEpSsMr88KZVmab5UsZVzl+nWSsX"; 202 203 @Test parseAuthenticateResponse()204 public void parseAuthenticateResponse() { 205 XmlDoc xmlDoc = new XmlDoc(AUTH_RESPONSE_XML); 206 207 assertThat(xmlDoc.getFromToken("token").get()).isEqualTo(TOKEN); 208 assertThat(xmlDoc.getFromVersion("version").get()).isEqualTo("1"); 209 // Note "&" in input XML are un-escaped to "&". 210 assertThat(xmlDoc.getFromVowifi("ServiceFlow_UserData").get()) 211 .isEqualTo("token=Y5vcmc%3D" 212 + "&entitlementStatus=0" 213 + "&protocol=TS43" 214 + "&provStatus=2" 215 + "&deviceId=358316079424742" 216 + "&subscriberId=0311580718847611%40nai.epc.mnc130.mcc310.3gppnetwork.org" 217 + "&ShowAddress=true"); 218 } 219 220 @Test parseAuthenticateResponse2()221 public void parseAuthenticateResponse2() { 222 XmlDoc xmlDoc = new XmlDoc(AUTH_RESPONSE_XML_2); 223 224 assertThat(xmlDoc.getFromToken("token").get()).isEqualTo(TOKEN); 225 // Note the "&" in input XML is kept as is 226 assertThat(xmlDoc.getFromVowifi("ServiceFlow_UserData").get()) 227 .isEqualTo("PostData=U6%2FbQ%2BEP&req_locale=en_US"); 228 } 229 230 @Test parseAuthenticateResponse3()231 public void parseAuthenticateResponse3() { 232 XmlDoc xmlDoc = new XmlDoc(AUTH_RESPONSE_XML_3); 233 234 // Note the "&amp;" in input XML is un-escaped to "&" 235 assertThat(xmlDoc.getFromVowifi("ServiceFlow_UserData").get()) 236 .isEqualTo("PostData=U6%2FbQ%2BEP&l=en_US"); 237 } 238 239 @Test parseAuthenticateResponse4()240 public void parseAuthenticateResponse4() { 241 XmlDoc xmlDoc = new XmlDoc(AUTH_RESPONSE_XML_4); 242 243 assertThat(xmlDoc.getFromVowifi("ServiceFlow_URL").isPresent()).isFalse(); 244 assertThat(xmlDoc.getFromVowifi("ServiceFlow_UserData").isPresent()).isFalse(); 245 } 246 247 @Test parseAuthenticateResponse5()248 public void parseAuthenticateResponse5() { 249 XmlDoc xmlDoc = new XmlDoc(AUTH_RESPONSE_XML_5); 250 251 assertThat(xmlDoc.getFromVowifi("ServiceFlow_URL").isPresent()).isFalse(); 252 assertThat(xmlDoc.getFromVowifi("ServiceFlow_UserData").isPresent()).isTrue(); 253 } 254 255 @Test parseAuthenticateResponse6()256 public void parseAuthenticateResponse6() { 257 XmlDoc xmlDoc = new XmlDoc(AUTH_RESPONSE_XML_6); 258 259 assertThat(xmlDoc.getFromVowifi("EntitlementStatus").get()).isEqualTo("0"); 260 assertThat(xmlDoc.getFromSmsoverip("EntitlementStatus").get()).isEqualTo("1"); 261 } 262 263 @Test parseAuthenticateResponse7()264 public void parseAuthenticateResponse7() { 265 XmlDoc xmlDoc = new XmlDoc(AUTH_RESPONSE_XML_7); 266 267 assertThat(xmlDoc.getFromVonrHome("EntitlementStatus").get()).isEqualTo("1"); 268 assertThat(xmlDoc.getFromVonrHome("NetworkVoiceIRATCapablity").get()) 269 .isEqualTo("EPS-Fallback"); 270 assertThat(xmlDoc.getFromVonrRoaming("EntitlementStatus").get()).isEqualTo("2"); 271 assertThat(xmlDoc.getFromVonrRoaming("NetworkVoiceIRATCapablity").isPresent()).isFalse(); 272 } 273 274 @Test parseAuthenticateResponse8()275 public void parseAuthenticateResponse8() { 276 XmlDoc xmlDoc = new XmlDoc(AUTH_RESPONSE_XML_8); 277 278 assertThat(xmlDoc.getFromVolte("EntitlementStatus").get()).isEqualTo("1"); 279 assertThat(xmlDoc.getFromVonrHome("EntitlementStatus").get()).isEqualTo("1"); 280 assertThat(xmlDoc.getFromVonrHome("NetworkVoiceIRATCapablity").get()) 281 .isEqualTo("EPS-Fallback"); 282 assertThat(xmlDoc.getFromVonrRoaming("EntitlementStatus").get()).isEqualTo("1"); 283 assertThat(xmlDoc.getFromVonrRoaming("NetworkVoiceIRATCapablity").get()) 284 .isEqualTo("EPS-Fallback"); 285 } 286 287 @Test parseAuthenticateResponse9()288 public void parseAuthenticateResponse9() { 289 XmlDoc xmlDoc = new XmlDoc(AUTH_RESPONSE_XML_9); 290 291 assertThat(xmlDoc.getFromVolte("EntitlementStatus").get()).isEqualTo("1"); 292 } 293 294 @Test parseAuthenticateResponse10()295 public void parseAuthenticateResponse10() { 296 XmlDoc xmlDoc = new XmlDoc(AUTH_RESPONSE_XML_10); 297 298 assertThat(xmlDoc.getFromVonrHome("EntitlementStatus").get()).isEqualTo("1"); 299 assertThat(xmlDoc.getFromVonrRoaming("EntitlementStatus").isPresent()).isFalse(); 300 } 301 } 302