1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sal.hxx"
26
27 #include "rtl/strbuf.hxx"
28 #include "rtl/textenc.h"
29 #include "rtl/uri.h"
30 #include "rtl/uri.hxx"
31 #include "rtl/ustrbuf.hxx"
32 #include "rtl/ustring.h"
33 #include "rtl/ustring.hxx"
34
35 #include <cstddef>
36 #include <stdio.h>
37 #include "gtest/gtest.h"
38
39 namespace {
40
41 class Test: public ::testing::Test {
42 public:
43 };
44
TEST_F(Test,test_Uri)45 TEST_F(Test, test_Uri) {
46 rtl_UriCharClass const eFirstCharClass = rtl_UriCharClassNone;
47 rtl_UriCharClass const eLastCharClass = rtl_UriCharClassUnoParamValue;
48
49 rtl::OUStringBuffer aBuffer;
50 rtl::OUString aText1;
51 rtl::OUString aText2;
52
53 // Check that all characters map back to themselves when encoded/decoded:
54
55 aText1 = rtl::OUString(
56 RTL_CONSTASCII_USTRINGPARAM(
57 "\0x00\0x01\0x02\0x03\0x04\0x05\0x06\0x07"
58 "\0x08\0x09\0x0A\0x0B\0x0C\0x0D\0x0E\0x0F"
59 "\0x10\0x11\0x12\0x13\0x14\0x15\0x16\0x17"
60 "\0x18\0x19\0x1A\0x1B\0x1C\0x1D\0x1E\0x1F"
61 "\0x20\0x21\0x22\0x23\0x24\0x25\0x26\0x27"
62 "\0x28\0x29\0x2A\0x2B\0x2C\0x2D\0x2E\0x2F"
63 "\0x30\0x31\0x32\0x33\0x34\0x35\0x36\0x37"
64 "\0x38\0x39\0x3A\0x3B\0x3C\0x3D\0x3E\0x3F"
65 "\0x40\0x41\0x42\0x43\0x44\0x45\0x46\0x47"
66 "\0x48\0x49\0x4A\0x4B\0x4C\0x4D\0x4E\0x4F"
67 "\0x50\0x51\0x52\0x53\0x54\0x55\0x56\0x57"
68 "\0x58\0x59\0x5A\0x5B\0x5C\0x5D\0x5E\0x5F"
69 "\0x60\0x61\0x62\0x63\0x64\0x65\0x66\0x67"
70 "\0x68\0x69\0x6A\0x6B\0x6C\0x6D\0x6E\0x6F"
71 "\0x70\0x71\0x72\0x73\0x74\0x75\0x76\0x77"
72 "\0x78\0x79\0x7A\0x7B\0x7C\0x7D\0x7E\0x7F"));
73 aText2 = aText1;
74 {for (rtl_UriCharClass eCharClass = eFirstCharClass;
75 eCharClass <= eLastCharClass;
76 eCharClass = static_cast< rtl_UriCharClass >(eCharClass + 1))
77 {
78 ASSERT_TRUE((rtl::Uri::decode(
79 rtl::Uri::encode(
80 aText1, eCharClass, rtl_UriEncodeKeepEscapes,
81 RTL_TEXTENCODING_ISO_8859_1),
82 rtl_UriDecodeWithCharset, RTL_TEXTENCODING_ASCII_US)
83 == aText2)) <<
84 "failure 1";
85 ASSERT_TRUE((rtl::Uri::decode(
86 rtl::Uri::encode(
87 aText1, eCharClass, rtl_UriEncodeCheckEscapes,
88 RTL_TEXTENCODING_ISO_8859_1),
89 rtl_UriDecodeWithCharset, RTL_TEXTENCODING_ASCII_US)
90 == aText2)) <<
91 "failure 2";
92 ASSERT_TRUE((rtl::Uri::decode(
93 rtl::Uri::encode(
94 aText1, eCharClass, rtl_UriEncodeKeepEscapes,
95 RTL_TEXTENCODING_ISO_8859_1),
96 rtl_UriDecodeWithCharset, RTL_TEXTENCODING_ISO_8859_1)
97 == aText2)) <<
98 "failure 3";
99 ASSERT_TRUE((rtl::Uri::decode(
100 rtl::Uri::encode(
101 aText1, eCharClass, rtl_UriEncodeCheckEscapes,
102 RTL_TEXTENCODING_ISO_8859_1),
103 rtl_UriDecodeWithCharset, RTL_TEXTENCODING_ISO_8859_1)
104 == aText2)) <<
105 "failure 4";
106 ASSERT_TRUE((rtl::Uri::decode(
107 rtl::Uri::encode(
108 aText1, eCharClass, rtl_UriEncodeKeepEscapes,
109 RTL_TEXTENCODING_ISO_8859_1),
110 rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8)
111 == aText2)) <<
112 "failure 5";
113 ASSERT_TRUE((rtl::Uri::decode(
114 rtl::Uri::encode(
115 aText1, eCharClass, rtl_UriEncodeCheckEscapes,
116 RTL_TEXTENCODING_ISO_8859_1),
117 rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8)
118 == aText2)) <<
119 "failure 6";
120 }}
121
122 aText1 = rtl::OUString(
123 RTL_CONSTASCII_USTRINGPARAM(
124 "\0x00\0x01\0x02\0x03\0x04\0x05\0x06\0x07"
125 "\0x08\0x09\0x0A\0x0B\0x0C\0x0D\0x0E\0x0F"
126 "\0x10\0x11\0x12\0x13\0x14\0x15\0x16\0x17"
127 "\0x18\0x19\0x1A\0x1B\0x1C\0x1D\0x1E\0x1F"
128 "\0x20\0x21\0x22\0x23\0x24\0x25\0x26\0x27"
129 "\0x28\0x29\0x2A\0x2B\0x2C\0x2D\0x2E\0x2F"
130 "\0x30\0x31\0x32\0x33\0x34\0x35\0x36\0x37"
131 "\0x38\0x39\0x3A\0x3B\0x3C\0x3D\0x3E\0x3F"
132 "\0x40\0x41\0x42\0x43\0x44\0x45\0x46\0x47"
133 "\0x48\0x49\0x4A\0x4B\0x4C\0x4D\0x4E\0x4F"
134 "\0x50\0x51\0x52\0x53\0x54\0x55\0x56\0x57"
135 "\0x58\0x59\0x5A\0x5B\0x5C\0x5D\0x5E\0x5F"
136 "\0x60\0x61\0x62\0x63\0x64\0x65\0x66\0x67"
137 "\0x68\0x69\0x6A\0x6B\0x6C\0x6D\0x6E\0x6F"
138 "\0x70\0x71\0x72\0x73\0x74\0x75\0x76\0x77"
139 "\0x78\0x79\0x7A\0x7B\0x7C\0x7D\0x7E\0x7F"
140 "\0x80\0x81\0x82\0x83\0x84\0x85\0x86\0x87"
141 "\0x88\0x89\0x8A\0x8B\0x8C\0x8D\0x8E\0x8F"
142 "\0x90\0x91\0x92\0x93\0x94\0x95\0x96\0x97"
143 "\0x98\0x99\0x9A\0x9B\0x9C\0x9D\0x9E\0x9F"
144 "\0xA0\0xA1\0xA2\0xA3\0xA4\0xA5\0xA6\0xA7"
145 "\0xA8\0xA9\0xAA\0xAB\0xAC\0xAD\0xAE\0xAF"
146 "\0xB0\0xB1\0xB2\0xB3\0xB4\0xB5\0xB6\0xB7"
147 "\0xB8\0xB9\0xBA\0xBB\0xBC\0xBD\0xBE\0xBF"
148 "\0xC0\0xC1\0xC2\0xC3\0xC4\0xC5\0xC6\0xC7"
149 "\0xC8\0xC9\0xCA\0xCB\0xCC\0xCD\0xCE\0xCF"
150 "\0xD0\0xD1\0xD2\0xD3\0xD4\0xD5\0xD6\0xD7"
151 "\0xD8\0xD9\0xDA\0xDB\0xDC\0xDD\0xDE\0xDF"
152 "\0xE0\0xE1\0xE2\0xE3\0xE4\0xE5\0xE6\0xE7"
153 "\0xE8\0xE9\0xEA\0xEB\0xEC\0xED\0xEE\0xEF"
154 "\0xF0\0xF1\0xF2\0xF3\0xF4\0xF5\0xF6\0xF7"
155 "\0xF8\0xF9\0xFA\0xFB\0xFC\0xFD\0xFE\0xFF"));
156 aText2 = aText1;
157 {for (rtl_UriCharClass eCharClass = eFirstCharClass;
158 eCharClass <= eLastCharClass;
159 eCharClass = static_cast< rtl_UriCharClass >(eCharClass + 1))
160 {
161 ASSERT_TRUE((rtl::Uri::decode(
162 rtl::Uri::encode(
163 aText1, eCharClass, rtl_UriEncodeKeepEscapes,
164 RTL_TEXTENCODING_ISO_8859_1),
165 rtl_UriDecodeWithCharset, RTL_TEXTENCODING_ISO_8859_1)
166 == aText2)) <<
167 "failure 7";
168 ASSERT_TRUE((rtl::Uri::decode(
169 rtl::Uri::encode(
170 aText1, eCharClass, rtl_UriEncodeCheckEscapes,
171 RTL_TEXTENCODING_ISO_8859_1),
172 rtl_UriDecodeWithCharset, RTL_TEXTENCODING_ISO_8859_1)
173 == aText2)) <<
174 "failure 8";
175 ASSERT_TRUE((rtl::Uri::decode(
176 rtl::Uri::encode(
177 aText1, eCharClass, rtl_UriEncodeKeepEscapes,
178 RTL_TEXTENCODING_UTF8),
179 rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8)
180 == aText2)) <<
181 "failure 9";
182 ASSERT_TRUE((rtl::Uri::decode(
183 rtl::Uri::encode(
184 aText1, eCharClass, rtl_UriEncodeCheckEscapes,
185 RTL_TEXTENCODING_UTF8),
186 rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8)
187 == aText2)) <<
188 "failure 10";
189 }}
190
191 // Check surrogate handling:
192
193 aBuffer.append(static_cast< sal_Unicode >(0xD800)); // %ED%A0%80
194 aBuffer.append(static_cast< sal_Unicode >(0xD800)); // %F0%90%8F%BF
195 aBuffer.append(static_cast< sal_Unicode >(0xDFFF));
196 aBuffer.append(static_cast< sal_Unicode >(0xDFFF)); // %ED%BF%BF
197 aBuffer.append(static_cast< sal_Unicode >('A')); // A
198 aText1 = aBuffer.makeStringAndClear();
199 aText2 = rtl::OUString(
200 RTL_CONSTASCII_USTRINGPARAM(
201 "%ED%A0%80" "%F0%90%8F%BF" "%ED%BF%BF" "A"));
202 ASSERT_TRUE((rtl::Uri::encode(
203 aText1, rtl_UriCharClassUric, rtl_UriEncodeIgnoreEscapes,
204 RTL_TEXTENCODING_UTF8)
205 == aText2)) <<
206 "failure 11";
207 ASSERT_TRUE((rtl::Uri::encode(
208 aText1, rtl_UriCharClassUric, rtl_UriEncodeKeepEscapes,
209 RTL_TEXTENCODING_UTF8)
210 == aText2)) <<
211 "failure 12";
212 ASSERT_TRUE((rtl::Uri::encode(
213 aText1, rtl_UriCharClassUric, rtl_UriEncodeCheckEscapes,
214 RTL_TEXTENCODING_UTF8)
215 == aText2)) <<
216 "failure 13";
217
218 aText1 = rtl::OUString(
219 RTL_CONSTASCII_USTRINGPARAM(
220 "%ed%a0%80" "%f0%90%8f%bf" "%ed%bf%bf" "A"));
221 aBuffer.appendAscii(RTL_CONSTASCII_STRINGPARAM("%ED%A0%80"));
222 aBuffer.append(static_cast< sal_Unicode >(0xD800));
223 aBuffer.append(static_cast< sal_Unicode >(0xDFFF));
224 aBuffer.appendAscii(RTL_CONSTASCII_STRINGPARAM("%ED%BF%BF"));
225 aBuffer.append(static_cast< sal_Unicode >('A'));
226 aText2 = aBuffer.makeStringAndClear();
227 ASSERT_TRUE((rtl::Uri::decode(aText1, rtl_UriDecodeToIuri, RTL_TEXTENCODING_UTF8)
228 == aText2)) <<
229 "failure 14";
230 ASSERT_TRUE((rtl::Uri::decode(
231 aText1, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8)
232 == aText2)) <<
233 "failure 15";
234
235 // Check UTF-8 handling:
236
237 aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%E0%83%BF"));
238 // \U+00FF encoded with three instead of two bytes
239 aText2 = aText1;
240 ASSERT_TRUE((rtl::Uri::encode(
241 aText1, rtl_UriCharClassUric, rtl_UriEncodeCheckEscapes,
242 RTL_TEXTENCODING_UTF8)
243 == aText2)) <<
244 "failure 16";
245
246 aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%EF%BF%BF"));
247 // \U+FFFF is no legal character
248 aText2 = aText1;
249 ASSERT_TRUE((rtl::Uri::encode(
250 aText1, rtl_UriCharClassUric, rtl_UriEncodeCheckEscapes,
251 RTL_TEXTENCODING_UTF8)
252 == aText2)) <<
253 "failure 17";
254
255 // Check IURI handling:
256
257 aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%30%C3%BF"));
258 aBuffer.appendAscii(RTL_CONSTASCII_STRINGPARAM("%30"));
259 aBuffer.append(static_cast< sal_Unicode >(0x00FF));
260 aText2 = aBuffer.makeStringAndClear();
261 ASSERT_TRUE((rtl::Uri::decode(aText1, rtl_UriDecodeToIuri, RTL_TEXTENCODING_UTF8)
262 == aText2)) <<
263 "failure 18";
264
265 // Check modified rtl_UriCharClassUnoParamValue (removed '[' and ']'):
266
267 aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("[]%5B%5D"));
268 aText2 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%5B%5D%5B%5D"));
269 ASSERT_TRUE((rtl::Uri::encode(
270 aText1, rtl_UriCharClassUnoParamValue, rtl_UriEncodeCheckEscapes,
271 RTL_TEXTENCODING_ASCII_US)
272 == aText2)) <<
273 "failure 19";
274
275 // Check Uri::convertRelToAbs:
276
277 struct RelToAbsTest
278 {
279 char const * pBase;
280 char const * pRel;
281 char const * pAbs;
282 };
283 static RelToAbsTest const aRelToAbsTest[]
284 = { // The following tests are taken from RFC 2396:
285 { "http://a/b/c/d;p?q", "g:h", "g:h" },
286 { "http://a/b/c/d;p?q", "g", "http://a/b/c/g" },
287 { "http://a/b/c/d;p?q", "./g", "http://a/b/c/g" },
288 { "http://a/b/c/d;p?q", "g/", "http://a/b/c/g/" },
289 { "http://a/b/c/d;p?q", "/g", "http://a/g" },
290 { "http://a/b/c/d;p?q", "//g", "http://g" },
291 { "http://a/b/c/d;p?q", "?y", "http://a/b/c/?y" },
292 { "http://a/b/c/d;p?q", "g?y", "http://a/b/c/g?y" },
293 { "http://a/b/c/d;p?q", "#s", "http://a/b/c/d;p?q#s" },
294 { "http://a/b/c/d;p?q", "g#s", "http://a/b/c/g#s" },
295 { "http://a/b/c/d;p?q", "g?y#s", "http://a/b/c/g?y#s" },
296 { "http://a/b/c/d;p?q", ";x", "http://a/b/c/;x" },
297 { "http://a/b/c/d;p?q", "g;x", "http://a/b/c/g;x" },
298 { "http://a/b/c/d;p?q", "g;x?y#s", "http://a/b/c/g;x?y#s" },
299 { "http://a/b/c/d;p?q", ".", "http://a/b/c/" },
300 { "http://a/b/c/d;p?q", "./", "http://a/b/c/" },
301 { "http://a/b/c/d;p?q", "..", "http://a/b/" },
302 { "http://a/b/c/d;p?q", "../", "http://a/b/" },
303 { "http://a/b/c/d;p?q", "../g", "http://a/b/g" },
304 { "http://a/b/c/d;p?q", "../..", "http://a/" },
305 { "http://a/b/c/d;p?q", "../../", "http://a/" },
306 { "http://a/b/c/d;p?q", "../../g", "http://a/g" },
307 { "http://a/b/c/d;p?q", "", "http://a/b/c/d;p?q" },
308 { "http://a/b/c/d;p?q", "../../../g", "http://a/../g" },
309 { "http://a/b/c/d;p?q", "../../../../g", "http://a/../../g" },
310 { "http://a/b/c/d;p?q", "/./g", "http://a/./g" },
311 { "http://a/b/c/d;p?q", "/../g", "http://a/../g" },
312 { "http://a/b/c/d;p?q", "g.", "http://a/b/c/g." },
313 { "http://a/b/c/d;p?q", ".g", "http://a/b/c/.g" },
314 { "http://a/b/c/d;p?q", "g..", "http://a/b/c/g.." },
315 { "http://a/b/c/d;p?q", "..g", "http://a/b/c/..g" },
316 { "http://a/b/c/d;p?q", "./../g", "http://a/b/g" },
317 { "http://a/b/c/d;p?q", "./g/.", "http://a/b/c/g/" },
318 { "http://a/b/c/d;p?q", "g/./h", "http://a/b/c/g/h" },
319 { "http://a/b/c/d;p?q", "g/../h", "http://a/b/c/h" },
320 { "http://a/b/c/d;p?q", "g;x=1/./y", "http://a/b/c/g;x=1/y" },
321 { "http://a/b/c/d;p?q", "g;x=1/../y", "http://a/b/c/y" },
322 { "http://a/b/c/d;p?q", "g?y/./x", "http://a/b/c/g?y/./x" },
323 { "http://a/b/c/d;p?q", "g?y/../x", "http://a/b/c/g?y/../x" },
324 { "http://a/b/c/d;p?q", "g#s/./x", "http://a/b/c/g#s/./x" },
325 { "http://a/b/c/d;p?q", "g#s/../x", "http://a/b/c/g#s/../x" },
326 { "http://a/b/c/d;p?q", "http:g", "http:g" },
327 { "http!://a/b/c/d;p?q", "g:h", "g:h" },
328 { "http!://a/b/c/d;p?q", "g", 0 },
329 { "http:b/c/d;p?q", "g:h", "g:h" },
330 { "http:b/c/d;p?q", "g", 0 },
331 { "http://a/b/../", "../c", "http://a/b/../../c" },
332 { "http://a/b/..", "../c", "http://a/c" },
333 { "http://a/./b/", ".././.././../c", "http://a/./../../c" } };
334 for (std::size_t i = 0; i < sizeof aRelToAbsTest / sizeof (RelToAbsTest); ++i)
335 {
336 rtl::OUString aAbs;
337 bool bMalformed = false;
338 try {
339 aAbs = rtl::Uri::convertRelToAbs(
340 rtl::OUString::createFromAscii(aRelToAbsTest[i].pBase),
341 rtl::OUString::createFromAscii(aRelToAbsTest[i].pRel));
342 } catch (rtl::MalformedUriException &) {
343 bMalformed = true;
344 }
345 if (bMalformed
346 ? aRelToAbsTest[i].pAbs != 0
347 : (aRelToAbsTest[i].pAbs == 0
348 || !aAbs.equalsAscii(aRelToAbsTest[i].pAbs)))
349 {
350 printf(
351 "FAILED convertRelToAbs(%s, %s) -> %s != %s\n",
352 aRelToAbsTest[i].pBase, aRelToAbsTest[i].pRel,
353 (bMalformed
354 ? "<MALFORMED>"
355 : rtl::OUStringToOString(
356 aAbs, RTL_TEXTENCODING_UTF8).getStr()),
357 (aRelToAbsTest[i].pAbs == 0
358 ? "<MALFORMED>" : aRelToAbsTest[i].pAbs));
359 FAIL();
360 }
361 }
362
363 // Check encode with unusual text encodings:
364
365 {
366 sal_Unicode const aText1U[] = { ' ', '!', 0x0401, 0x045F, 0 };
367 aText1 = rtl::OUString(aText1U);
368 aText2 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%20!%A1%FF"));
369 ASSERT_TRUE((rtl::Uri::encode(
370 aText1, rtl_UriCharClassUric, rtl_UriEncodeIgnoreEscapes,
371 RTL_TEXTENCODING_ISO_8859_5)
372 == aText2)) <<
373 "failure 20";
374 ASSERT_TRUE((rtl::Uri::decode(
375 aText2, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_ISO_8859_5)
376 == aText1)) <<
377 "failure 20a";
378 }
379 {
380 sal_Unicode const aText1U[] = { ' ', '!', 0x0401, 0x0700, 0x045F, 0 };
381 aText1 = rtl::OUString(aText1U);
382 sal_Unicode const aText2U[] = {
383 '%', '2', '0', '!', '%', 'A', '1', 0x0700, '%', 'F', 'F', 0 };
384 aText2 = rtl::OUString(aText2U);
385 ASSERT_TRUE((rtl::Uri::encode(
386 aText1, rtl_UriCharClassUric, rtl_UriEncodeIgnoreEscapes,
387 RTL_TEXTENCODING_ISO_8859_5)
388 == aText2)) <<
389 "failure 21";
390 ASSERT_TRUE((rtl::Uri::decode(
391 aText2, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_ISO_8859_5)
392 == aText1)) <<
393 "failure 21a";
394 }
395 {
396 sal_Unicode const aText1U[] = { ' ', '!', 0x028A, 0xD849, 0xDD13, 0 };
397 aText1 = rtl::OUString(aText1U);
398 aText2 = rtl::OUString(
399 RTL_CONSTASCII_USTRINGPARAM("%20!%81%30%B1%33%95%39%C5%37"));
400 ASSERT_TRUE((rtl::Uri::encode(
401 aText1, rtl_UriCharClassUric, rtl_UriEncodeIgnoreEscapes,
402 RTL_TEXTENCODING_GB_18030)
403 == aText2)) <<
404 "failure 22";
405 ASSERT_TRUE((rtl::Uri::decode(
406 aText2, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_GB_18030)
407 == aText1)) <<
408 "failure 22a";
409 }
410
411 // Check strict mode:
412
413 {
414 sal_Unicode const aText1U[] = { ' ', '!', 0x0401, 0x0700, 0x045F, 0 };
415 aText1 = rtl::OUString(aText1U);
416 aText2 = rtl::OUString();
417 ASSERT_TRUE((rtl::Uri::encode(
418 aText1, rtl_UriCharClassUric, rtl_UriEncodeStrict,
419 RTL_TEXTENCODING_ISO_8859_5)
420 == aText2)) <<
421 "failure 23";
422 }
423 {
424 aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%20%C4%80%FF"));
425 aText2 = rtl::OUString();
426 ASSERT_TRUE((rtl::Uri::decode(
427 aText1, rtl_UriDecodeStrict, RTL_TEXTENCODING_UTF8)
428 == aText2)) <<
429 "failure 24";
430 }
431 {
432 aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%81 "));
433 aText2 = rtl::OUString();
434 ASSERT_TRUE((rtl::Uri::decode(
435 aText1, rtl_UriDecodeStrict, RTL_TEXTENCODING_GB_18030)
436 == aText2)) <<
437 "failure 25";
438 }
439 {
440 aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%81%20"));
441 aText2 = rtl::OUString();
442 ASSERT_TRUE((rtl::Uri::decode(
443 aText1, rtl_UriDecodeStrict, RTL_TEXTENCODING_GB_18030)
444 == aText2)) <<
445 "failure 26";
446 }
447 {
448 aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%81%30%B1%33"));
449 sal_Unicode const aText2U[] = { 0x028A, 0 };
450 aText2 = rtl::OUString(aText2U);
451 ASSERT_TRUE((rtl::Uri::decode(
452 aText1, rtl_UriDecodeStrict, RTL_TEXTENCODING_GB_18030)
453 == aText2)) <<
454 "failure 27";
455 }
456 {
457 aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%810%B13"));
458 sal_Unicode const aText2U[] = { 0x028A, 0 };
459 aText2 = rtl::OUString(aText2U);
460 ASSERT_TRUE((rtl::Uri::decode(
461 aText1, rtl_UriDecodeStrict, RTL_TEXTENCODING_GB_18030)
462 == aText2)) <<
463 "failure 28";
464 }
465
466 // Check rtl_UriEncodeStrictKeepEscapes mode:
467
468 {
469 aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%%ea%c3%aa"));
470 aText2 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%25%EA%C3%AA"));
471 ASSERT_TRUE((rtl::Uri::encode(
472 aText1, rtl_UriCharClassUric, rtl_UriEncodeStrictKeepEscapes,
473 RTL_TEXTENCODING_UTF8)
474 == aText2)) <<
475 "failure 29";
476 }
477 {
478 sal_Unicode const aText1U[] = { 0x00EA, 0 };
479 aText1 = rtl::OUString(aText1U);
480 aText2 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%C3%AA"));
481 ASSERT_TRUE((rtl::Uri::encode(
482 aText1, rtl_UriCharClassUric, rtl_UriEncodeStrictKeepEscapes,
483 RTL_TEXTENCODING_UTF8)
484 == aText2)) <<
485 "failure 30";
486 }
487 {
488 sal_Unicode const aText1U[] = { ' ', '!', 0x0401, 0x0700, 0x045F, 0 };
489 aText1 = rtl::OUString(aText1U);
490 aText2 = rtl::OUString();
491 ASSERT_TRUE((rtl::Uri::encode(
492 aText1, rtl_UriCharClassUric, rtl_UriEncodeStrictKeepEscapes,
493 RTL_TEXTENCODING_ISO_8859_5)
494 == aText2)) <<
495 "failure 23";
496 }
497 }
498
499 }
500
main(int argc,char ** argv)501 int main(int argc, char **argv)
502 {
503 ::testing::InitGoogleTest(&argc, argv);
504 return RUN_ALL_TESTS();
505 }
506