VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstRTUri.cpp@ 77923

Last change on this file since 77923 was 76553, checked in by vboxsync, 6 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 38.4 KB
Line 
1/* $Id: tstRTUri.cpp 76553 2019-01-01 01:45:53Z vboxsync $ */
2/** @file
3 * IPRT Testcase - URI parsing and creation.
4 */
5
6/*
7 * Copyright (C) 2011-2019 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27
28/*********************************************************************************************************************************
29* Header Files *
30*********************************************************************************************************************************/
31#include <iprt/uri.h>
32
33#include <iprt/string.h>
34#include <iprt/err.h>
35#include <iprt/mem.h>
36#include <iprt/path.h>
37#include <iprt/test.h>
38
39#if 0 && defined(RT_OS_WINDOWS) /* Enable for windows API reference results. */
40# define TSTRTURI_WITH_WINDOWS_REFERENCE_RESULTS
41# include <iprt/win/shlwapi.h>
42# include <iprt/stream.h>
43#endif
44
45
46/*********************************************************************************************************************************
47* Test data *
48*********************************************************************************************************************************/
49
50static struct
51{
52 const char *pszUri;
53 const char *pszScheme;
54 const char *pszAuthority;
55 const char *pszPath;
56 const char *pszQuery;
57 const char *pszFragment;
58
59 const char *pszUsername;
60 const char *pszPassword;
61 const char *pszHost;
62 uint32_t uPort;
63
64 const char *pszCreated;
65} g_aTests[] =
66{
67 { /* #0 */
68 "foo://tt:[email protected]:8042/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
69 /*.pszScheme =*/ "foo",
70 /*.pszAuthority =*/ "tt:[email protected]:8042",
71 /*.pszPath =*/ "/over/ <>#%\"{}|^[]`/there",
72 /*.pszQuery =*/ "name= <>#%\"{}|^[]`ferret",
73 /*.pszFragment =*/ "nose <>#%\"{}|^[]`",
74 /*.pszUsername =*/ "tt",
75 /*.pszPassword =*/ "yt",
76 /*.pszHost =*/ "example.com",
77 /*.uPort =*/ 8042,
78 /*.pszCreated =*/ NULL /* same as pszUri*/,
79 },
80 { /* #1 */
81 "foo://tt:[email protected]:8042/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret",
82 /*.pszScheme =*/ "foo",
83 /*.pszAuthority =*/ "tt:[email protected]:8042",
84 /*.pszPath =*/ "/over/ <>#%\"{}|^[]`/there",
85 /*.pszQuery =*/ "name= <>#%\"{}|^[]`ferret",
86 /*.pszFragment =*/ NULL,
87 /*.pszUsername =*/ "tt",
88 /*.pszPassword =*/ "yt",
89 /*.pszHost =*/ "example.com",
90 /*.uPort =*/ 8042,
91 /*.pszCreated =*/ NULL /* same as pszUri*/,
92 },
93 { /* #2 */
94 "foo://tt:[email protected]:8042/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there",
95 /*.pszScheme =*/ "foo",
96 /*.pszAuthority =*/ "tt:[email protected]:8042",
97 /*.pszPath =*/ "/over/ <>#%\"{}|^[]`/there",
98 /*.pszQuery =*/ NULL,
99 /*.pszFragment =*/ NULL,
100 /*.pszUsername =*/ "tt",
101 /*.pszPassword =*/ "yt",
102 /*.pszHost =*/ "example.com",
103 /*.uPort =*/ 8042,
104 /*.pszCreated =*/ NULL /* same as pszUri*/,
105 },
106 { /* #3 */
107 "foo:[email protected]",
108 /*.pszScheme =*/ "foo",
109 /*.pszAuthority =*/ NULL,
110 /*.pszPath =*/ "[email protected]",
111 /*.pszQuery =*/ NULL,
112 /*.pszFragment =*/ NULL,
113 /*.pszUsername =*/ NULL,
114 /*.pszPassword =*/ NULL,
115 /*.pszHost =*/ NULL,
116 /*.uPort =*/ UINT32_MAX,
117 /*.pszCreated =*/ NULL /* same as pszUri*/,
118 },
119 { /* #4 */
120 "foo:/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
121 /*.pszScheme =*/ "foo",
122 /*.pszAuthority =*/ NULL,
123 /*.pszPath =*/ "/over/ <>#%\"{}|^[]`/there",
124 /*.pszQuery =*/ "name= <>#%\"{}|^[]`ferret",
125 /*.pszFragment =*/ "nose <>#%\"{}|^[]`",
126 /*.pszUsername =*/ NULL,
127 /*.pszPassword =*/ NULL,
128 /*.pszHost =*/ NULL,
129 /*.uPort =*/ UINT32_MAX,
130 /*.pszCreated =*/ NULL /* same as pszUri*/,
131 },
132 { /* #5 */
133 "foo:/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
134 /*.pszScheme =*/ "foo",
135 /*.pszAuthority =*/ NULL,
136 /*.pszPath =*/ "/over/ <>#%\"{}|^[]`/there",
137 /*.pszQuery =*/ NULL,
138 /*.pszFragment =*/ "nose <>#%\"{}|^[]`",
139 /*.pszUsername =*/ NULL,
140 /*.pszPassword =*/ NULL,
141 /*.pszHost =*/ NULL,
142 /*.uPort =*/ UINT32_MAX,
143 /*.pszCreated =*/ NULL /* same as pszUri*/,
144 },
145 { /* #6 */
146 "urn:example:animal:ferret:nose",
147 /*.pszScheme =*/ "urn",
148 /*.pszAuthority =*/ NULL,
149 /*.pszPath =*/ "example:animal:ferret:nose",
150 /*.pszQuery =*/ NULL,
151 /*.pszFragment =*/ NULL,
152 /*.pszUsername =*/ NULL,
153 /*.pszPassword =*/ NULL,
154 /*.pszHost =*/ NULL,
155 /*.uPort =*/ UINT32_MAX,
156 /*.pszCreated =*/ NULL /* same as pszUri*/,
157 },
158 { /* #7 */
159 "foo:?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
160 /*.pszScheme =*/ "foo",
161 /*.pszAuthority =*/ NULL,
162 /*.pszPath =*/ NULL,
163 /*.pszQuery =*/ "name= <>#%\"{}|^[]`ferret",
164 /*.pszFragment =*/ "nose <>#%\"{}|^[]`",
165 /*.pszUsername =*/ NULL,
166 /*.pszPassword =*/ NULL,
167 /*.pszHost =*/ NULL,
168 /*.uPort =*/ UINT32_MAX,
169 /*.pszCreated =*/ NULL /* same as pszUri*/,
170 },
171 { /* #8 */
172 "foo:#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
173 /*.pszScheme =*/ "foo",
174 /*.pszAuthority =*/ NULL,
175 /*.pszPath =*/ NULL,
176 /*.pszQuery =*/ NULL,
177 /*.pszFragment =*/ "nose <>#%\"{}|^[]`",
178 /*.pszUsername =*/ NULL,
179 /*.pszPassword =*/ NULL,
180 /*.pszHost =*/ NULL,
181 /*.uPort =*/ UINT32_MAX,
182 /*.pszCreated =*/ NULL /* same as pszUri*/,
183 },
184 { /* #9 */
185 "foo://tt:[email protected]:8042/?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
186 /*.pszScheme =*/ "foo",
187 /*.pszAuthority =*/ "tt:[email protected]:8042",
188 /*.pszPath =*/ "/",
189 /*.pszQuery =*/ "name= <>#%\"{}|^[]`ferret",
190 /*.pszFragment =*/ "nose <>#%\"{}|^[]`",
191 /*.pszUsername =*/ "tt",
192 /*.pszPassword =*/ "yt",
193 /*.pszHost =*/ "example.com",
194 /*.uPort =*/ 8042,
195 /*.pszCreated =*/ NULL /* same as pszUri*/,
196 },
197 { /* #10 */
198 "foo://tt:[email protected]:8042/",
199 /*.pszScheme =*/ "foo",
200 /*.pszAuthority =*/ "tt:[email protected]:8042",
201 /*.pszPath =*/ "/",
202 /*.pszQuery =*/ NULL,
203 /*.pszFragment =*/ NULL,
204 /*.pszUsername =*/ "tt",
205 /*.pszPassword =*/ "yt",
206 /*.pszHost =*/ "example.com",
207 /*.uPort =*/ 8042,
208 /*.pszCreated =*/ NULL /* same as pszUri*/,
209 },
210 { /* #11 */
211 "foo://tt:[email protected]:8042?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
212 /*.pszScheme =*/ "foo",
213 /*.pszAuthority =*/ "tt:[email protected]:8042",
214 /*.pszPath =*/ NULL,
215 /*.pszQuery =*/ "name= <>#%\"{}|^[]`ferret",
216 /*.pszFragment =*/ "nose <>#%\"{}|^[]`",
217 /*.pszUsername =*/ "tt",
218 /*.pszPassword =*/ "yt",
219 /*.pszHost =*/ "example.com",
220 /*.uPort =*/ 8042,
221 /*.pszCreated =*/ NULL /* same as pszUri*/,
222 },
223 { /* #12 */
224 "foo://tt:[email protected]:8042#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
225 /*.pszScheme =*/ "foo",
226 /*.pszAuthority =*/ "tt:[email protected]:8042",
227 /*.pszPath =*/ NULL,
228 /*.pszQuery =*/ NULL,
229 /*.pszFragment =*/ "nose <>#%\"{}|^[]`",
230 /*.pszUsername =*/ "tt",
231 /*.pszPassword =*/ "yt",
232 /*.pszHost =*/ "example.com",
233 /*.uPort =*/ 8042,
234 /*.pszCreated =*/ NULL /* same as pszUri*/,
235 },
236 { /* #13 */
237 "foo://tt:[email protected]:8042",
238 /*.pszScheme =*/ "foo",
239 /*.pszAuthority =*/ "tt:[email protected]:8042",
240 /*.pszPath =*/ NULL,
241 /*.pszQuery =*/ NULL,
242 /*.pszFragment =*/ NULL,
243 /*.pszUsername =*/ "tt",
244 /*.pszPassword =*/ "yt",
245 /*.pszHost =*/ "example.com",
246 /*.uPort =*/ 8042,
247 /*.pszCreated =*/ NULL /* same as pszUri*/,
248 },
249 { /* #14 */
250 "file:///dir/dir/file",
251 /*.pszScheme =*/ "file",
252 /*.pszAuthority =*/ "",
253 /*.pszPath =*/ "/dir/dir/file",
254 /*.pszQuery =*/ NULL,
255 /*.pszFragment =*/ NULL,
256 /*.pszUsername =*/ NULL,
257 /*.pszPassword =*/ NULL,
258 /*.pszHost =*/ NULL,
259 /*.uPort =*/ UINT32_MAX,
260 /*.pszCreated =*/ NULL /* same as pszUri*/,
261 },
262 { /* #15 */
263 "foo:///",
264 /*.pszScheme =*/ "foo",
265 /*.pszAuthority =*/ "",
266 /*.pszPath =*/ "/",
267 /*.pszQuery =*/ NULL,
268 /*.pszFragment =*/ NULL,
269 /*.pszUsername =*/ NULL,
270 /*.pszPassword =*/ NULL,
271 /*.pszHost =*/ NULL,
272 /*.uPort =*/ UINT32_MAX,
273 /*.pszCreated =*/ NULL /* same as pszUri*/,
274 },
275 { /* #16 */
276 "foo://",
277 /*.pszScheme =*/ "foo",
278 /*.pszAuthority =*/ "",
279 /*.pszPath =*/ NULL,
280 /*.pszQuery =*/ NULL,
281 /*.pszFragment =*/ NULL,
282 /*.pszUsername =*/ NULL,
283 /*.pszPassword =*/ NULL,
284 /*.pszHost =*/ NULL,
285 /*.uPort =*/ UINT32_MAX,
286 /*.pszCreated =*/ NULL /* same as pszUri*/,
287 },
288 { /* #17 - UTF-8 escape sequences. */
289 "http://example.com/%ce%b3%ce%bb%cf%83%ce%b1%20%e0%a4%95\xe0\xa4\x95",
290 /*.pszScheme =*/ "http",
291 /*.pszAuthority =*/ "example.com",
292 /*.pszPath =*/ "/\xce\xb3\xce\xbb\xcf\x83\xce\xb1 \xe0\xa4\x95\xe0\xa4\x95",
293 /*.pszQuery =*/ NULL,
294 /*.pszFragment =*/ NULL,
295 /*.pszUsername =*/ NULL,
296 /*.pszPassword =*/ NULL,
297 /*.pszHost =*/ "example.com",
298 /*.uPort =*/ UINT32_MAX,
299 /*.pszCreated =*/ "http://example.com/\xce\xb3\xce\xbb\xcf\x83\xce\xb1%20\xe0\xa4\x95\xe0\xa4\x95",
300 },
301};
302
303
304static struct URIFILETEST
305{
306 const char *pszPath;
307 uint32_t fPathPathStyle;
308 const char *pszUri;
309 uint32_t fUriPathStyle;
310 const char *pszCreatedPath;
311 const char *pszCreatedUri;
312} g_aCreateFileURIs[] =
313{
314 { /* #0: */
315 /* .pszPath =*/ "C:\\over\\ <>#%\"{}|^[]`\\there",
316 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
317 /* .pszUri =*/ "file:///C:%5Cover/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60%5Cthere",
318 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
319 /* .pszCreatedPath =*/ "C:\\over\\ <>#%\"{}|^[]`\\there",
320 /* .pszCreatedUri =*/ "file:///C:/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there",
321 /* PathCreateFromUrl = "C:\\over\\ <>#%\"{}|^[]`\\there" - same */
322 /* UrlCreateFromPath = "file:///C:/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there" - same */
323 },
324 { /* #1: */
325 /* .pszPath =*/ "/over/ <>#%\"{}|^[]`/there",
326 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_UNIX,
327 /* .pszUri =*/ "file:///over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there",
328 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_UNIX,
329 /* .pszCreatedPath =*/ "/over/ <>#%\"{}|^[]`/there",
330 /* .pszCreatedUri =*/ "file:///over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there",
331 /* PathCreateFromUrl = "\\over\\ <>#%\"{}|^[]`\\there" - differs */
332 /* UrlCreateFromPath = "file:///over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there" - same */
333 },
334 { /* #2: */
335 /* .pszPath =*/ NULL,
336 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_UNIX,
337 /* .pszUri =*/ "file://",
338 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_UNIX,
339 /* .pszCreatedPath =*/ NULL,
340 /* .pszCreatedUri =*/ NULL,
341 /* PathCreateFromUrl = "" - differs */
342 /* UrlCreateFromPath => 0x80070057 (E_INVALIDARG) */
343 },
344 { /* #3: */
345 /* .pszPath =*/ NULL,
346 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
347 /* .pszUri =*/ "file://",
348 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
349 /* .pszCreatedPath =*/ NULL,
350 /* .pszCreatedUri =*/ NULL,
351 /* PathCreateFromUrl = "" - differs */
352 /* UrlCreateFromPath => 0x80070057 (E_INVALIDARG) */
353 },
354 { /* #4: */
355 /* .pszPath =*/ "/",
356 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_UNIX,
357 /* .pszUri =*/ "file:///",
358 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_UNIX,
359 /* .pszCreatedPath =*/ "/",
360 /* .pszCreatedUri =*/ "file:///",
361 /* PathCreateFromUrl = "" - differs */
362 /* UrlCreateFromPath = "file:///" - same */
363 },
364 { /* #5: */
365 /* .pszPath =*/ "\\",
366 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
367 /* .pszUri =*/ "file:///",
368 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
369 /* .pszCreatedPath =*/ "\\",
370 /* .pszCreatedUri =*/ "file:///",
371 /* PathCreateFromUrl = "" - differs */
372 /* UrlCreateFromPath = "file:///" - same */
373 },
374 { /* #6: */
375 /* .pszPath =*/ "/foo/bar",
376 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_UNIX,
377 /* .pszUri =*/ "file:///foo/bar",
378 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_UNIX,
379 /* .pszCreatedPath =*/ "/foo/bar",
380 /* .pszCreatedUri =*/ "file:///foo/bar",
381 /* PathCreateFromUrl = "\\foo\\bar" - differs */
382 /* UrlCreateFromPath = "file:///foo/bar" - same */
383 },
384 { /* #7: */
385 /* .pszPath =*/ "\\foo\\bar",
386 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
387 /* .pszUri =*/ "file:///foo%5Cbar",
388 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
389 /* .pszCreatedPath =*/ "\\foo\\bar",
390 /* .pszCreatedUri =*/ "file:///foo/bar",
391 /* PathCreateFromUrl = "\\foo\\bar" - same */
392 /* UrlCreateFromPath = "file:///foo/bar" - same */
393 },
394 { /* #8: */
395 /* .pszPath =*/ "C:/over/ <>#%\"{}|^[]`/there",
396 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_UNIX,
397 /* .pszUri =*/ "file:///C:/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there",
398 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_UNIX,
399 /* .pszCreatedPath =*/ "C:/over/ <>#%\"{}|^[]`/there",
400 /* .pszCreatedUri =*/ "file:///C:/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there",
401 /* PathCreateFromUrl = "C:\\over\\ <>#%\"{}|^[]`\\there" - differs */
402 /* UrlCreateFromPath = "file:///C:/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there" - same */
403 },
404 { /* #9: */
405 /* .pszPath =*/ "\\over\\ <>#%\"{}|^[]`\\there",
406 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
407 /* .pszUri =*/ "file:///over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there",
408 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
409 /* .pszCreatedPath =*/ "\\over\\ <>#%\"{}|^[]`\\there",
410 /* .pszCreatedUri =*/ "file:///over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there",
411 /* PathCreateFromUrl = "\\over\\ <>#%\"{}|^[]`\\there" - same */
412 /* UrlCreateFromPath = "file:///over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there" - same */
413 },
414 { /* #10: */
415 /* .pszPath =*/ "/usr/bin/grep",
416 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_UNIX,
417 /* .pszUri =*/ "file:///usr/bin/grep",
418 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_UNIX,
419 /* .pszCreatedPath =*/ "/usr/bin/grep",
420 /* .pszCreatedUri =*/ "file:///usr/bin/grep",
421 /* PathCreateFromUrl = "\\usr\\bin\\grep" - differs */
422 /* UrlCreateFromPath = "file:///usr/bin/grep" - same */
423 },
424 { /* #11: */
425 /* .pszPath =*/ "\\usr\\bin\\grep",
426 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
427 /* .pszUri =*/ "file:///usr/bin/grep",
428 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
429 /* .pszCreatedPath =*/ "\\usr\\bin\\grep",
430 /* .pszCreatedUri =*/ "file:///usr/bin/grep",
431 /* PathCreateFromUrl = "\\usr\\bin\\grep" - same */
432 /* UrlCreateFromPath = "file:///usr/bin/grep" - same */
433 },
434 { /* #12: */
435 /* .pszPath =*/ "/somerootsubdir/isos/files.lst",
436 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_UNIX,
437 /* .pszUri =*/ "file:///somerootsubdir/isos/files.lst",
438 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_UNIX,
439 /* .pszCreatedPath =*/ "/somerootsubdir/isos/files.lst",
440 /* .pszCreatedUri =*/ "file:///somerootsubdir/isos/files.lst",
441 /* PathCreateFromUrl = "\\somerootsubdir\\isos\\files.lst" - differs */
442 /* UrlCreateFromPath = "file:///somerootsubdir/isos/files.lst" - same */
443 },
444 { /* #13: */
445 /* .pszPath =*/ "\\not-a-cifsserver\\isos\\files.lst",
446 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
447 /* .pszUri =*/ "file:///not-a-cifsserver/isos/files.lst",
448 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
449 /* .pszCreatedPath =*/ "\\not-a-cifsserver\\isos\\files.lst",
450 /* .pszCreatedUri =*/ "file:///not-a-cifsserver/isos/files.lst",
451 /* PathCreateFromUrl = "\\not-a-cifsserver\\isos\\files.lst" - same */
452 /* UrlCreateFromPath = "file:///not-a-cifsserver/isos/files.lst" - same */
453 },
454 { /* #14: */
455 /* .pszPath =*/ "/rootsubdir/isos/files.lst",
456 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_UNIX,
457 /* .pszUri =*/ "file:///rootsubdir/isos/files.lst",
458 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_UNIX,
459 /* .pszCreatedPath =*/ "/rootsubdir/isos/files.lst",
460 /* .pszCreatedUri =*/ "file:///rootsubdir/isos/files.lst",
461 /* PathCreateFromUrl = "\\rootsubdir\\isos\\files.lst" - differs */
462 /* UrlCreateFromPath = "file:///rootsubdir/isos/files.lst" - same */
463 },
464 { /* #15: */
465 /* .pszPath =*/ "\\not-a-cifsserver-either\\isos\\files.lst",
466 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
467 /* .pszUri =*/ "file:///not-a-cifsserver-either/isos/files.lst",
468 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
469 /* .pszCreatedPath =*/ "\\not-a-cifsserver-either\\isos\\files.lst",
470 /* .pszCreatedUri =*/ "file:///not-a-cifsserver-either/isos/files.lst",
471 /* PathCreateFromUrl = "\\not-a-cifsserver-either\\isos\\files.lst" - same */
472 /* UrlCreateFromPath = "file:///not-a-cifsserver-either/isos/files.lst" - same */
473 },
474 { /* #16: */
475 /* .pszPath =*/ "\\\\cifsserver\\isos\\files.lst",
476 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
477 /* .pszUri =*/ "file:////cifsserver/isos/files.lst",
478 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
479 /* .pszCreatedPath =*/ "\\\\cifsserver\\isos\\files.lst",
480 /* .pszCreatedUri =*/ "file://cifsserver/isos/files.lst",
481 /* PathCreateFromUrl = "\\\\cifsserver\\isos\\files.lst" - same */
482 /* UrlCreateFromPath = "file://cifsserver/isos/files.lst" - same */
483 },
484 { /* #17: */
485 /* .pszPath =*/ "c:boot.ini",
486 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
487 /* .pszUri =*/ "file://localhost/c:boot.ini",
488 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
489 /* .pszCreatedPath =*/ "c:boot.ini",
490 /* .pszCreatedUri =*/ "file:///c:boot.ini",
491 /* PathCreateFromUrl = "c:boot.ini" - same */
492 /* UrlCreateFromPath = "file:///c:boot.ini" - same */
493 },
494 { /* #18: */
495 /* .pszPath =*/ "c:boot.ini",
496 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
497 /* .pszUri =*/ "file:///c|boot.ini",
498 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
499 /* .pszCreatedPath =*/ "c:boot.ini",
500 /* .pszCreatedUri =*/ "file:///c:boot.ini",
501 /* PathCreateFromUrl = "c:boot.ini" - same */
502 /* UrlCreateFromPath = "file:///c:boot.ini" - same */
503 },
504 { /* #19: */
505 /* .pszPath =*/ "c:\\legacy-no-slash.ini",
506 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
507 /* .pszUri =*/ "file:c:\\legacy-no-slash%2Eini",
508 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
509 /* .pszCreatedPath =*/ "c:\\legacy-no-slash.ini",
510 /* .pszCreatedUri =*/ "file:///c:/legacy-no-slash.ini",
511 /* PathCreateFromUrl = "c:\\legacy-no-slash.ini" - same */
512 /* UrlCreateFromPath = "file:///c:/legacy-no-slash.ini" - same */
513 },
514 { /* #20: */
515 /* .pszPath =*/ "c:\\legacy-no-slash.ini",
516 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
517 /* .pszUri =*/ "file:c|\\legacy-no-slash%2Eini",
518 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
519 /* .pszCreatedPath =*/ "c:\\legacy-no-slash.ini",
520 /* .pszCreatedUri =*/ "file:///c:/legacy-no-slash.ini",
521 /* PathCreateFromUrl = "c:\\legacy-no-slash.ini" - same */
522 /* UrlCreateFromPath = "file:///c:/legacy-no-slash.ini" - same */
523 },
524 { /* #21: */
525 /* .pszPath =*/ "c:\\legacy-single-slash.ini",
526 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
527 /* .pszUri =*/ "file:/c:\\legacy-single-slash%2Eini",
528 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
529 /* .pszCreatedPath =*/ "c:\\legacy-single-slash.ini",
530 /* .pszCreatedUri =*/ "file:///c:/legacy-single-slash.ini",
531 /* PathCreateFromUrl = "c:\\legacy-single-slash.ini" - same */
532 /* UrlCreateFromPath = "file:///c:/legacy-single-slash.ini" - same */
533 },
534 { /* #22: */
535 /* .pszPath =*/ "c:\\legacy-single-slash.ini",
536 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
537 /* .pszUri =*/ "file:/c:\\legacy-single-slash%2Eini",
538 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
539 /* .pszCreatedPath =*/ "c:\\legacy-single-slash.ini",
540 /* .pszCreatedUri =*/ "file:///c:/legacy-single-slash.ini",
541 /* PathCreateFromUrl = "c:\\legacy-single-slash.ini" - same */
542 /* UrlCreateFromPath = "file:///c:/legacy-single-slash.ini" - same */
543 },
544 { /* #23: */
545 /* .pszPath =*/ "\\legacy-single-slash.ini",
546 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
547 /* .pszUri =*/ "file:/legacy-single-slash%2Eini",
548 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
549 /* .pszCreatedPath =*/ "\\legacy-single-slash.ini",
550 /* .pszCreatedUri =*/ "file:///legacy-single-slash.ini",
551 /* PathCreateFromUrl = "\\legacy-single-slash.ini" - same */
552 /* UrlCreateFromPath = "file:///legacy-single-slash.ini" - same */
553 },
554 { /* #24: */
555 /* .pszPath =*/ "C:\\legacy-double-slash%2E.ini",
556 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
557 /* .pszUri =*/ "file://C:\\legacy-double-slash%2E.ini",
558 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
559 /* .pszCreatedPath =*/ "C:\\legacy-double-slash%2E.ini",
560 /* .pszCreatedUri =*/ "file:///C:/legacy-double-slash%252E.ini",
561 /* PathCreateFromUrl = "C:\\legacy-double-slash%2E.ini" - same */
562 /* UrlCreateFromPath = "file:///C:/legacy-double-slash.ini" - same */
563 },
564 { /* #25: */
565 /* .pszPath =*/ "C:\\legacy-double-slash%2E.ini",
566 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
567 /* .pszUri =*/ "file://C|/legacy-double-slash%2E.ini",
568 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
569 /* .pszCreatedPath =*/ "C:\\legacy-double-slash%2E.ini",
570 /* .pszCreatedUri =*/ "file:///C:/legacy-double-slash%252E.ini",
571 /* PathCreateFromUrl = "C:\\legacy-double-slash%2E.ini" - same */
572 /* UrlCreateFromPath = "file:///C:/legacy-double-slash%252E.ini" - same */
573 },
574 { /* #26: */
575 /* .pszPath =*/ "C:\\legacy-4-slashes%2E.ini",
576 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
577 /* .pszUri =*/ "file:////C|/legacy-4-slashes%2E.ini",
578 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
579 /* .pszCreatedPath =*/ "C:\\legacy-4-slashes%2E.ini",
580 /* .pszCreatedUri =*/ "file:///C:/legacy-4-slashes%252E.ini",
581 /* PathCreateFromUrl = "C:\\legacy-4-slashes%2E.ini" - same */
582 /* UrlCreateFromPath = "file:///C:/legacy-4-slashes%252E.ini" - same */
583 },
584 { /* #27: */
585 /* .pszPath =*/ "C:\\legacy-4-slashes%2E.ini",
586 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
587 /* .pszUri =*/ "file:////C:/legacy-4-slashes%2E.ini",
588 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
589 /* .pszCreatedPath =*/ "C:\\legacy-4-slashes%2E.ini",
590 /* .pszCreatedUri =*/ "file:///C:/legacy-4-slashes%252E.ini",
591 /* PathCreateFromUrl = "C:\\legacy-4-slashes%2E.ini" - same */
592 /* UrlCreateFromPath = "file:///C:/legacy-4-slashes%252E.ini" - same */
593 },
594 { /* #28: */
595 /* .pszPath =*/ "\\\\cifsserver\\share\\legacy-4-slashes%2E.ini",
596 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
597 /* .pszUri =*/ "file:////cifsserver/share/legacy-4-slashes%2E.ini",
598 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
599 /* .pszCreatedPath =*/ "\\\\cifsserver\\share\\legacy-4-slashes%2E.ini",
600 /* .pszCreatedUri =*/ "file://cifsserver/share/legacy-4-slashes%252E.ini",
601 /* PathCreateFromUrl = "\\\\cifsserver\\share\\legacy-4-slashes%2E.ini" - same */
602 /* UrlCreateFromPath = "file://cifsserver/share/legacy-4-slashes%252E.ini" - same */
603 },
604 { /* #29: */
605 /* .pszPath =*/ "\\\\cifsserver\\share\\legacy-5-slashes.ini",
606 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
607 /* .pszUri =*/ "file://///cifsserver/share/legacy-5-slashes%2Eini",
608 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
609 /* .pszCreatedPath =*/ "\\\\cifsserver\\share\\legacy-5-slashes.ini",
610 /* .pszCreatedUri =*/ "file://cifsserver/share/legacy-5-slashes.ini",
611 /* PathCreateFromUrl = "\\\\cifsserver\\share\\legacy-5-slashes.ini" - same */
612 /* UrlCreateFromPath = "file://cifsserver/share/legacy-5-slashes.ini" - same */
613 },
614 { /* #30: */
615 /* .pszPath =*/ "\\\\C|\\share\\legacy-5-slashes.ini",
616 /* .fPathPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
617 /* .pszUri =*/ "file://///C|/share/legacy-5-slashes%2Eini",
618 /* .fUriPathStyle =*/ RTPATH_STR_F_STYLE_DOS,
619 /* .pszCreatedPath =*/ "\\\\C|\\share\\legacy-5-slashes.ini",
620 /* .pszCreatedUri =*/ "file://C%7C/share/legacy-5-slashes.ini",
621 /* PathCreateFromUrl = "\\\\C|\\share\\legacy-5-slashes.ini" - same */
622 /* UrlCreateFromPath = "file:///C%7C/share/legacy-5-slashes.ini" - differs */
623 },
624};
625
626#ifdef TSTRTURI_WITH_WINDOWS_REFERENCE_RESULTS
627
628static void tstPrintCString(const char *pszString)
629{
630 if (pszString)
631 {
632 char ch;
633 RTPrintf("\"");
634 while ((ch = *pszString++) != '\0')
635 {
636 if (ch >= 0x20 && ch < 0x7f)
637 switch (ch)
638 {
639 default:
640 RTPrintf("%c", ch);
641 break;
642 case '\\':
643 case '"':
644 RTPrintf("\\%c", ch);
645 break;
646 }
647 else
648 RTPrintf("\\x%02X", ch); /* good enough */
649 }
650 RTPrintf("\"");
651 }
652 else
653 RTPrintf("NULL");
654}
655
656static const char *tstNamePathStyle(uint32_t fPathStyle)
657{
658 switch (fPathStyle)
659 {
660 case RTPATH_STR_F_STYLE_DOS: return "RTPATH_STR_F_STYLE_DOS";
661 case RTPATH_STR_F_STYLE_UNIX: return "RTPATH_STR_F_STYLE_UNIX";
662 case RTPATH_STR_F_STYLE_HOST: return "RTPATH_STR_F_STYLE_HOST";
663 default: AssertFailedReturn("Invalid");
664 }
665}
666
667static void tstWindowsReferenceResults(void)
668{
669 /*
670 * Feed the g_aCreateFileURIs values as input to the Windows
671 * PathCreateFromUrl and URlCreateFromPath APIs and print the results.
672 *
673 * We reproduce the entire source file content of g_aCreateFileURIs here.
674 */
675 for (size_t i = 0; i < RT_ELEMENTS(g_aCreateFileURIs); ++i)
676 {
677 RTPrintf(" { /* #%u: */\n", i);
678 RTPrintf(" /* .pszPath =*/ ");
679 tstPrintCString(g_aCreateFileURIs[i].pszPath);
680 RTPrintf(",\n");
681 RTPrintf(" /* .fPathPathStyle =*/ %s,\n", tstNamePathStyle(g_aCreateFileURIs[i].fPathPathStyle));
682 RTPrintf(" /* .pszUri =*/ ");
683 tstPrintCString(g_aCreateFileURIs[i].pszUri);
684 RTPrintf(",\n");
685 RTPrintf(" /* .fUriPathStyle =*/ %s,\n", tstNamePathStyle(g_aCreateFileURIs[i].fUriPathStyle));
686 RTPrintf(" /* .pszCreatedPath =*/ ");
687 tstPrintCString(g_aCreateFileURIs[i].pszCreatedPath);
688 RTPrintf(",\n");
689 RTPrintf(" /* .pszCreatedUri =*/ ");
690 tstPrintCString(g_aCreateFileURIs[i].pszCreatedUri);
691 RTPrintf(",\n");
692
693 /*
694 * PathCreateFromUrl
695 */
696 PRTUTF16 pwszInput = NULL;
697 if (g_aCreateFileURIs[i].pszUri)
698 RTTESTI_CHECK_RC_OK_RETV(RTStrToUtf16(g_aCreateFileURIs[i].pszUri, &pwszInput));
699 WCHAR wszResult[_1K];
700 DWORD cwcResult = RT_ELEMENTS(wszResult);
701 RT_ZERO(wszResult);
702 HRESULT hrc = PathCreateFromUrlW(pwszInput, wszResult, &cwcResult, 0 /*dwFlags*/);
703 RTUtf16Free(pwszInput);
704
705 if (SUCCEEDED(hrc))
706 {
707 char *pszResult;
708 RTTESTI_CHECK_RC_OK_RETV(RTUtf16ToUtf8(wszResult, &pszResult));
709 RTPrintf(" /* PathCreateFromUrl = ");
710 tstPrintCString(pszResult);
711 if ( g_aCreateFileURIs[i].pszCreatedPath
712 && strcmp(pszResult, g_aCreateFileURIs[i].pszCreatedPath) == 0)
713 RTPrintf(" - same */\n");
714 else
715 RTPrintf(" - differs */\n");
716 RTStrFree(pszResult);
717 }
718 else
719 RTPrintf(" /* PathCreateFromUrl => %#x (%Rhrc) */\n", hrc, hrc);
720
721 /*
722 * UrlCreateFromPath + UrlEscape
723 */
724 pwszInput = NULL;
725 if (g_aCreateFileURIs[i].pszPath)
726 RTTESTI_CHECK_RC_OK_RETV(RTStrToUtf16(g_aCreateFileURIs[i].pszPath, &pwszInput));
727 RT_ZERO(wszResult);
728 cwcResult = RT_ELEMENTS(wszResult);
729 hrc = UrlCreateFromPathW(pwszInput, wszResult, &cwcResult, 0 /*dwFlags*/);
730 RTUtf16Free(pwszInput);
731
732 if (SUCCEEDED(hrc))
733 {
734 WCHAR wszResult2[_1K];
735 DWORD cwcResult2 = RT_ELEMENTS(wszResult2);
736 hrc = UrlEscapeW(wszResult, wszResult2, &cwcResult2, URL_DONT_ESCAPE_EXTRA_INFO | URL_ESCAPE_AS_UTF8 );
737 if (SUCCEEDED(hrc))
738 {
739 char *pszResult;
740 RTTESTI_CHECK_RC_OK_RETV(RTUtf16ToUtf8(wszResult2, &pszResult));
741 RTPrintf(" /* UrlCreateFromPath = ");
742 tstPrintCString(pszResult);
743 if ( g_aCreateFileURIs[i].pszCreatedUri
744 && strcmp(pszResult, g_aCreateFileURIs[i].pszCreatedUri) == 0)
745 RTPrintf(" - same */\n");
746 else
747 RTPrintf(" - differs */\n");
748 RTStrFree(pszResult);
749 }
750 else
751 RTPrintf(" /* UrlEscapeW => %#x (%Rhrc) */\n", hrc, hrc);
752 }
753 else
754 RTPrintf(" /* UrlCreateFromPath => %#x (%Rhrc) */\n", hrc, hrc);
755 RTPrintf(" },\n");
756 }
757}
758
759#endif /* TSTRTURI_WITH_WINDOWS_REFERENCE_RESULTS */
760
761
762static void tstRTUriFilePathEx(void)
763{
764 RTTestISub("RTUriFilePathEx");
765 for (size_t i = 0; i < RT_ELEMENTS(g_aCreateFileURIs); ++i)
766 {
767 uint32_t const fPathStyle = g_aCreateFileURIs[i].fUriPathStyle;
768 const char * const pszUri = g_aCreateFileURIs[i].pszUri;
769 char *pszPath = (char *)&pszPath;
770 int rc = RTUriFilePathEx(pszUri, fPathStyle, &pszPath, 0, NULL);
771 if (RT_SUCCESS(rc))
772 {
773 if (g_aCreateFileURIs[i].pszCreatedPath)
774 {
775 if (strcmp(pszPath, g_aCreateFileURIs[i].pszCreatedPath) == 0)
776 {
777 /** @todo check out the other variations of the API. */
778 }
779 else
780 RTTestIFailed("#%u: '%s'/%#x => '%s', expected '%s'",
781 i, pszUri, fPathStyle, pszPath, g_aCreateFileURIs[i].pszCreatedPath);
782 }
783 else
784 RTTestIFailed("#%u: bad testcase; pszCreatedPath is NULL\n", i);
785 RTStrFree(pszPath);
786 }
787 else if (rc != VERR_PATH_ZERO_LENGTH || RTStrCmp(pszUri, "file://") != 0)
788 RTTestIFailed("#%u: '%s'/%#x => %Rrc", i, pszUri, fPathStyle, rc);
789 }
790}
791
792
793static void tstRTUriFileCreateEx(void)
794{
795 RTTestISub("RTUriFileCreateEx");
796 for (size_t i = 0; i < RT_ELEMENTS(g_aCreateFileURIs); ++i)
797 {
798 uint32_t const fPathStyle = g_aCreateFileURIs[i].fPathPathStyle;
799 const char * const pszPath = g_aCreateFileURIs[i].pszPath;
800 char *pszUri = (char *)&pszUri;
801 int rc = RTUriFileCreateEx(pszPath, fPathStyle, &pszUri, 0, NULL);
802 if (RT_SUCCESS(rc))
803 {
804 if (g_aCreateFileURIs[i].pszCreatedUri)
805 {
806 if (strcmp(pszUri, g_aCreateFileURIs[i].pszCreatedUri) == 0)
807 {
808 /** @todo check out the other variations of the API. */
809 }
810 else
811 RTTestIFailed("#%u: '%s'/%#x => '%s', expected '%s'",
812 i, pszPath, fPathStyle, pszUri, g_aCreateFileURIs[i].pszCreatedUri);
813 }
814 else
815 RTTestIFailed("#%u: bad testcase; pszCreatedUri is NULL\n", i);
816 RTStrFree(pszUri);
817 }
818 else if (rc != VERR_INVALID_POINTER || pszPath != NULL)
819 RTTestIFailed("#%u: '%s'/%#x => %Rrc", i, pszPath, fPathStyle, rc);
820 }
821}
822
823
824int main()
825{
826 RTTEST hTest;
827 int rc = RTTestInitAndCreate("tstRTUri", &hTest);
828 if (rc)
829 return rc;
830 RTTestBanner(hTest);
831
832#define CHECK_STR_API(a_Call, a_pszExpected) \
833 do { \
834 char *pszTmp = a_Call; \
835 if (a_pszExpected) \
836 { \
837 if (!pszTmp) \
838 RTTestIFailed("#%u: %s returns NULL, expected '%s'", i, #a_Call, a_pszExpected); \
839 else if (strcmp(pszTmp, a_pszExpected)) \
840 RTTestIFailed("#%u: %s returns '%s', expected '%s'", i, #a_Call, pszTmp, a_pszExpected); \
841 } \
842 else if (pszTmp) \
843 RTTestIFailed("#%u: %s returns '%s', expected NULL", i, #a_Call, pszTmp); \
844 RTStrFree(pszTmp); \
845 } while (0)
846
847 RTTestISub("RTUriParse & RTUriParsed*");
848 for (uint32_t i = 0; i < RT_ELEMENTS(g_aTests); i++)
849 {
850 RTURIPARSED Parsed;
851 RTTESTI_CHECK_RC(rc = RTUriParse(g_aTests[i].pszUri, &Parsed), VINF_SUCCESS);
852 if (RT_SUCCESS(rc))
853 {
854 CHECK_STR_API(RTUriParsedScheme(g_aTests[i].pszUri, &Parsed), g_aTests[i].pszScheme);
855 CHECK_STR_API(RTUriParsedAuthority(g_aTests[i].pszUri, &Parsed), g_aTests[i].pszAuthority);
856 CHECK_STR_API(RTUriParsedAuthorityUsername(g_aTests[i].pszUri, &Parsed), g_aTests[i].pszUsername);
857 CHECK_STR_API(RTUriParsedAuthorityPassword(g_aTests[i].pszUri, &Parsed), g_aTests[i].pszPassword);
858 CHECK_STR_API(RTUriParsedAuthorityHost(g_aTests[i].pszUri, &Parsed), g_aTests[i].pszHost);
859 CHECK_STR_API(RTUriParsedPath(g_aTests[i].pszUri, &Parsed), g_aTests[i].pszPath);
860 CHECK_STR_API(RTUriParsedQuery(g_aTests[i].pszUri, &Parsed), g_aTests[i].pszQuery);
861 CHECK_STR_API(RTUriParsedFragment(g_aTests[i].pszUri, &Parsed), g_aTests[i].pszFragment);
862 uint32_t uPort = RTUriParsedAuthorityPort(g_aTests[i].pszUri, &Parsed);
863 if (uPort != g_aTests[i].uPort)
864 RTTestIFailed("#%u: RTUriParsedAuthorityPort returns %#x, expected %#x", i, uPort, g_aTests[i].uPort);
865 }
866 }
867
868 /* Creation */
869 RTTestISub("RTUriCreate");
870 for (uint32_t i = 0; i < RT_ELEMENTS(g_aTests); i++)
871 CHECK_STR_API(RTUriCreate(g_aTests[i].pszScheme, g_aTests[i].pszAuthority, g_aTests[i].pszPath,
872 g_aTests[i].pszQuery, g_aTests[i].pszFragment),
873 g_aTests[i].pszCreated ? g_aTests[i].pszCreated : g_aTests[i].pszUri);
874
875#ifdef TSTRTURI_WITH_WINDOWS_REFERENCE_RESULTS
876 tstWindowsReferenceResults();
877#endif
878
879 bool fSavedMayPanic = RTAssertSetMayPanic(false);
880 bool fSavedQuiet = RTAssertSetQuiet(true);
881
882 tstRTUriFilePathEx();
883 tstRTUriFileCreateEx();
884
885 RTAssertSetMayPanic(fSavedMayPanic);
886 RTAssertSetQuiet(fSavedQuiet);
887
888 return RTTestSummaryAndDestroy(hTest);
889}
890
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette