• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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&amp;entitlementStatus=0&amp;protocol=TS43&amp;"
50                     + "provStatus=2&amp;deviceId=358316079424742&amp;subscriberId=0311580718847611"
51                     + "%40nai.epc.mnc130.mcc310.3gppnetwork.org&amp;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;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;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 "&amp;" 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;amp;" in input XML is un-escaped to "&amp;"
235         assertThat(xmlDoc.getFromVowifi("ServiceFlow_UserData").get())
236                 .isEqualTo("PostData=U6%2FbQ%2BEP&amp;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