urlmon: Added parser for IPv6 addresses.
[wine.git] / dlls / urlmon / tests / uri.c
blob5c32fec2d3583ef25d939cdaac8e651322a45d63
1 /*
2 * UrlMon IUri tests
4 * Copyright 2010 Thomas Mullaly
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 * IUri testing framework goals:
23 * - Test invalid args
24 * - invalid flags
25 * - invalid args (IUri, uri string)
26 * - Test parsing for components when no canonicalization occurs
27 * - Test parsing for components when canonicalization occurs.
28 * - More tests...
31 #include <wine/test.h>
32 #include <stdarg.h>
33 #include <stddef.h>
35 #define COBJMACROS
37 #include "windef.h"
38 #include "winbase.h"
39 #include "urlmon.h"
40 #include "shlwapi.h"
42 #define URI_STR_PROPERTY_COUNT Uri_PROPERTY_STRING_LAST+1
43 #define URI_DWORD_PROPERTY_COUNT (Uri_PROPERTY_DWORD_LAST - Uri_PROPERTY_DWORD_START)+1
45 static HRESULT (WINAPI *pCreateUri)(LPCWSTR, DWORD, DWORD_PTR, IUri**);
47 static const WCHAR http_urlW[] = { 'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q',
48 '.','o','r','g','/',0};
50 typedef struct _uri_create_flag_test {
51 DWORD flags;
52 HRESULT expected;
53 } uri_create_flag_test;
55 static const uri_create_flag_test invalid_flag_tests[] = {
56 /* Set of invalid flag combinations to test for. */
57 {Uri_CREATE_DECODE_EXTRA_INFO | Uri_CREATE_NO_DECODE_EXTRA_INFO, E_INVALIDARG},
58 {Uri_CREATE_CANONICALIZE | Uri_CREATE_NO_CANONICALIZE, E_INVALIDARG},
59 {Uri_CREATE_CRACK_UNKNOWN_SCHEMES | Uri_CREATE_NO_CRACK_UNKNOWN_SCHEMES, E_INVALIDARG},
60 {Uri_CREATE_PRE_PROCESS_HTML_URI | Uri_CREATE_NO_PRE_PROCESS_HTML_URI, E_INVALIDARG},
61 {Uri_CREATE_IE_SETTINGS | Uri_CREATE_NO_IE_SETTINGS, E_INVALIDARG}
64 typedef struct _uri_str_property {
65 const char* value;
66 HRESULT expected;
67 BOOL todo;
68 } uri_str_property;
70 typedef struct _uri_dword_property {
71 DWORD value;
72 HRESULT expected;
73 BOOL todo;
74 } uri_dword_property;
76 typedef struct _uri_properties {
77 const char* uri;
78 DWORD create_flags;
79 HRESULT create_expected;
80 BOOL create_todo;
81 DWORD props;
82 BOOL props_todo;
84 uri_str_property str_props[URI_STR_PROPERTY_COUNT];
85 uri_dword_property dword_props[URI_DWORD_PROPERTY_COUNT];
86 } uri_properties;
88 static const uri_properties uri_tests[] = {
89 { "http://www.winehq.org/tests/../tests/../..", 0, S_OK, FALSE,
90 /* A flag bitmap containing all the Uri_HAS_* flags that correspond to this uri. */
91 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
92 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|
93 Uri_HAS_PORT|Uri_HAS_SCHEME,
94 TRUE,
96 {"http://www.winehq.org/",S_OK,TRUE}, /* ABSOLUTE_URI */
97 {"www.winehq.org",S_OK,TRUE}, /* AUTHORITY */
98 {"http://www.winehq.org/",S_OK,TRUE}, /* DISPLAY_URI */
99 {"winehq.org",S_OK,TRUE}, /* DOMAIN */
100 {"",S_FALSE,TRUE}, /* EXTENSION */
101 {"",S_FALSE,TRUE}, /* FRAGMENT */
102 {"www.winehq.org",S_OK,TRUE}, /* HOST */
103 {"",S_FALSE,FALSE}, /* PASSWORD */
104 {"/",S_OK,TRUE}, /* PATH */
105 {"/",S_OK,TRUE}, /* PATH_AND_QUERY */
106 {"",S_FALSE,TRUE}, /* QUERY */
107 {"http://www.winehq.org/tests/../tests/../..",S_OK,FALSE}, /* RAW_URI */
108 {"http",S_OK,FALSE}, /* SCHEME_NAME */
109 {"",S_FALSE,FALSE}, /* USER_INFO */
110 {"",S_FALSE,FALSE} /* USER_NAME */
113 {Uri_HOST_DNS,S_OK,TRUE}, /* HOST_TYPE */
114 {80,S_OK,TRUE}, /* PORT */
115 {URL_SCHEME_HTTP,S_OK,FALSE}, /* SCHEME */
116 {URLZONE_INVALID,E_NOTIMPL,FALSE} /* ZONE */
119 { "http://winehq.org/tests/.././tests", 0, S_OK, FALSE,
120 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
121 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|
122 Uri_HAS_PORT|Uri_HAS_SCHEME,
123 TRUE,
125 {"http://winehq.org/tests",S_OK,TRUE},
126 {"winehq.org",S_OK,TRUE},
127 {"http://winehq.org/tests",S_OK,TRUE},
128 {"winehq.org",S_OK,TRUE},
129 {"",S_FALSE,TRUE},
130 {"",S_FALSE,TRUE},
131 {"winehq.org",S_OK,TRUE},
132 {"",S_FALSE,FALSE},
133 {"/tests",S_OK,TRUE},
134 {"/tests",S_OK,TRUE},
135 {"",S_FALSE,TRUE},
136 {"http://winehq.org/tests/.././tests",S_OK,FALSE},
137 {"http",S_OK,FALSE},
138 {"",S_FALSE,FALSE},
139 {"",S_FALSE,FALSE}
142 {Uri_HOST_DNS,S_OK,TRUE},
143 {80,S_OK,TRUE},
144 {URL_SCHEME_HTTP,S_OK,FALSE},
145 {URLZONE_INVALID,E_NOTIMPL,FALSE}
148 { "HtTp://www.winehq.org/tests/..?query=x&return=y", 0, S_OK, FALSE,
149 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
150 Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_QUERY|Uri_HAS_RAW_URI|
151 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
152 TRUE,
154 {"http://www.winehq.org/?query=x&return=y",S_OK,TRUE},
155 {"www.winehq.org",S_OK,TRUE},
156 {"http://www.winehq.org/?query=x&return=y",S_OK,TRUE},
157 {"winehq.org",S_OK,TRUE},
158 {"",S_FALSE,TRUE},
159 {"",S_FALSE,TRUE},
160 {"www.winehq.org",S_OK,TRUE},
161 {"",S_FALSE,FALSE},
162 {"/",S_OK,TRUE},
163 {"/?query=x&return=y",S_OK,TRUE},
164 {"?query=x&return=y",S_OK,TRUE},
165 {"HtTp://www.winehq.org/tests/..?query=x&return=y",S_OK,FALSE},
166 {"http",S_OK,FALSE},
167 {"",S_FALSE,FALSE},
168 {"",S_FALSE,FALSE}
171 {Uri_HOST_DNS,S_OK,TRUE},
172 {80,S_OK,TRUE},
173 {URL_SCHEME_HTTP,S_OK,FALSE},
174 {URLZONE_INVALID,E_NOTIMPL,FALSE},
177 { "hTTp://us%45r%3Ainfo@examp%4CE.com:80/path/a/b/./c/../%2E%2E/Forbidden'<|> Characters", 0, S_OK, FALSE,
178 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|Uri_HAS_PATH|
179 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|
180 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
181 TRUE,
183 {"http://usEr%3Ainfo@example.com/path/a/Forbidden'%3C%7C%3E%20Characters",S_OK,TRUE},
184 {"usEr%3Ainfo@example.com",S_OK,TRUE},
185 {"http://example.com/path/a/Forbidden'%3C%7C%3E%20Characters",S_OK,TRUE},
186 {"example.com",S_OK,TRUE},
187 {"",S_FALSE,TRUE},
188 {"",S_FALSE,TRUE},
189 {"example.com",S_OK,TRUE},
190 {"",S_FALSE,FALSE},
191 {"/path/a/Forbidden'%3C%7C%3E%20Characters",S_OK,TRUE},
192 {"/path/a/Forbidden'%3C%7C%3E%20Characters",S_OK,TRUE},
193 {"",S_FALSE,TRUE},
194 {"hTTp://us%45r%3Ainfo@examp%4CE.com:80/path/a/b/./c/../%2E%2E/Forbidden'<|> Characters",S_OK,FALSE},
195 {"http",S_OK,FALSE},
196 {"usEr%3Ainfo",S_OK,FALSE},
197 {"usEr%3Ainfo",S_OK,FALSE}
200 {Uri_HOST_DNS,S_OK,TRUE},
201 {80,S_OK,TRUE},
202 {URL_SCHEME_HTTP,S_OK,FALSE},
203 {URLZONE_INVALID,E_NOTIMPL,FALSE},
206 { "ftp://winepass:wine@ftp.winehq.org:9999/dir/foo bar.txt", 0, S_OK, FALSE,
207 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_EXTENSION|
208 Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
209 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|
210 Uri_HAS_SCHEME,
211 TRUE,
213 {"ftp://winepass:wine@ftp.winehq.org:9999/dir/foo%20bar.txt",S_OK,TRUE},
214 {"winepass:wine@ftp.winehq.org:9999",S_OK,TRUE},
215 {"ftp://ftp.winehq.org:9999/dir/foo%20bar.txt",S_OK,TRUE},
216 {"winehq.org",S_OK,TRUE},
217 {".txt",S_OK,TRUE},
218 {"",S_FALSE,TRUE},
219 {"ftp.winehq.org",S_OK,TRUE},
220 {"wine",S_OK,FALSE},
221 {"/dir/foo%20bar.txt",S_OK,TRUE},
222 {"/dir/foo%20bar.txt",S_OK,TRUE},
223 {"",S_FALSE,TRUE},
224 {"ftp://winepass:wine@ftp.winehq.org:9999/dir/foo bar.txt",S_OK,FALSE},
225 {"ftp",S_OK,FALSE},
226 {"winepass:wine",S_OK,FALSE},
227 {"winepass",S_OK,FALSE}
230 {Uri_HOST_DNS,S_OK,TRUE},
231 {9999,S_OK,TRUE},
232 {URL_SCHEME_FTP,S_OK,FALSE},
233 {URLZONE_INVALID,E_NOTIMPL,FALSE}
236 { "file://c:\\tests\\../tests/foo%20bar.mp3", 0, S_OK, FALSE,
237 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|
238 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
239 TRUE,
241 {"file:///c:/tests/foo%2520bar.mp3",S_OK,TRUE},
242 {"",S_FALSE,TRUE},
243 {"file:///c:/tests/foo%2520bar.mp3",S_OK,TRUE},
244 {"",S_FALSE,TRUE},
245 {".mp3",S_OK,TRUE},
246 {"",S_FALSE,TRUE},
247 {"",S_FALSE,TRUE},
248 {"",S_FALSE,FALSE},
249 {"/c:/tests/foo%2520bar.mp3",S_OK,TRUE},
250 {"/c:/tests/foo%2520bar.mp3",S_OK,TRUE},
251 {"",S_FALSE,TRUE},
252 {"file://c:\\tests\\../tests/foo%20bar.mp3",S_OK,FALSE},
253 {"file",S_OK,FALSE},
254 {"",S_FALSE,FALSE},
255 {"",S_FALSE,FALSE}
258 {Uri_HOST_UNKNOWN,S_OK,TRUE},
259 {0,S_FALSE,TRUE},
260 {URL_SCHEME_FILE,S_OK,FALSE},
261 {URLZONE_INVALID,E_NOTIMPL,FALSE}
264 { "FILE://localhost/test dir\\../tests/test%20file.README.txt", 0, S_OK, FALSE,
265 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|
266 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
267 TRUE,
269 {"file:///tests/test%20file.README.txt",S_OK,TRUE},
270 {"",S_FALSE,TRUE},
271 {"file:///tests/test%20file.README.txt",S_OK,TRUE},
272 {"",S_FALSE,TRUE},
273 {".txt",S_OK,TRUE},
274 {"",S_FALSE,TRUE},
275 {"",S_FALSE,TRUE},
276 {"",S_FALSE,FALSE},
277 {"/tests/test%20file.README.txt",S_OK,TRUE},
278 {"/tests/test%20file.README.txt",S_OK,TRUE},
279 {"",S_FALSE,TRUE},
280 {"FILE://localhost/test dir\\../tests/test%20file.README.txt",S_OK,FALSE},
281 {"file",S_OK,FALSE},
282 {"",S_FALSE,FALSE},
283 {"",S_FALSE,FALSE}
286 {Uri_HOST_UNKNOWN,S_OK,TRUE},
287 {0,S_FALSE,TRUE},
288 {URL_SCHEME_FILE,S_OK,FALSE},
289 {URLZONE_INVALID,E_NOTIMPL,FALSE}
292 { "urn:nothing:should:happen here", 0, S_OK, FALSE,
293 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|
294 Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
295 TRUE,
297 {"urn:nothing:should:happen here",S_OK,TRUE},
298 {"",S_FALSE,TRUE},
299 {"urn:nothing:should:happen here",S_OK,TRUE},
300 {"",S_FALSE,TRUE},
301 {"",S_FALSE,TRUE},
302 {"",S_FALSE,TRUE},
303 {"",S_FALSE,TRUE},
304 {"",S_FALSE,FALSE},
305 {"nothing:should:happen here",S_OK,TRUE},
306 {"nothing:should:happen here",S_OK,TRUE},
307 {"",S_FALSE,TRUE},
308 {"urn:nothing:should:happen here",S_OK,FALSE},
309 {"urn",S_OK,FALSE},
310 {"",S_FALSE,FALSE},
311 {"",S_FALSE,FALSE}
314 {Uri_HOST_UNKNOWN,S_OK,TRUE},
315 {0,S_FALSE,TRUE},
316 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
317 {URLZONE_INVALID,E_NOTIMPL,FALSE}
320 { "http://127.0.0.1/tests/../test dir/./test.txt", 0, S_OK, FALSE,
321 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|
322 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
323 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
324 TRUE,
326 {"http://127.0.0.1/test%20dir/test.txt",S_OK,TRUE},
327 {"127.0.0.1",S_OK,TRUE},
328 {"http://127.0.0.1/test%20dir/test.txt",S_OK,TRUE},
329 {"",S_FALSE,TRUE},
330 {".txt",S_OK,TRUE},
331 {"",S_FALSE,TRUE},
332 {"127.0.0.1",S_OK,FALSE},
333 {"",S_FALSE,FALSE},
334 {"/test%20dir/test.txt",S_OK,TRUE},
335 {"/test%20dir/test.txt",S_OK,TRUE},
336 {"",S_FALSE,TRUE},
337 {"http://127.0.0.1/tests/../test dir/./test.txt",S_OK,FALSE},
338 {"http",S_OK,FALSE},
339 {"",S_FALSE,FALSE},
340 {"",S_FALSE,FALSE}
343 {Uri_HOST_IPV4,S_OK,TRUE},
344 {80,S_OK,TRUE},
345 {URL_SCHEME_HTTP,S_OK,FALSE},
346 {URLZONE_INVALID,E_NOTIMPL,FALSE}
349 { "http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]", 0, S_OK, FALSE,
350 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
351 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
352 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
353 TRUE,
355 {"http://[fedc:ba98:7654:3210:fedc:ba98:7654:3210]/",S_OK,TRUE},
356 {"[fedc:ba98:7654:3210:fedc:ba98:7654:3210]",S_OK,TRUE},
357 {"http://[fedc:ba98:7654:3210:fedc:ba98:7654:3210]/",S_OK,TRUE},
358 {"",S_FALSE,TRUE},
359 {"",S_FALSE,TRUE},
360 {"",S_FALSE,TRUE},
361 {"fedc:ba98:7654:3210:fedc:ba98:7654:3210",S_OK,TRUE},
362 {"",S_FALSE,FALSE},
363 {"/",S_OK,TRUE},
364 {"/",S_OK,TRUE},
365 {"",S_FALSE,TRUE},
366 {"http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]",S_OK,FALSE},
367 {"http",S_OK,FALSE},
368 {"",S_FALSE,FALSE},
369 {"",S_FALSE,FALSE}
372 {Uri_HOST_IPV6,S_OK,TRUE},
373 {80,S_OK,TRUE},
374 {URL_SCHEME_HTTP,S_OK,FALSE},
375 {URLZONE_INVALID,E_NOTIMPL,FALSE}
378 { "ftp://[::13.1.68.3]", 0, S_OK, FALSE,
379 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
380 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
381 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
382 TRUE,
384 {"ftp://[::13.1.68.3]/",S_OK,TRUE},
385 {"[::13.1.68.3]",S_OK,TRUE},
386 {"ftp://[::13.1.68.3]/",S_OK,TRUE},
387 {"",S_FALSE,TRUE},
388 {"",S_FALSE,TRUE},
389 {"",S_FALSE,TRUE},
390 {"::13.1.68.3",S_OK,TRUE},
391 {"",S_FALSE,FALSE},
392 {"/",S_OK,TRUE},
393 {"/",S_OK,TRUE},
394 {"",S_FALSE,TRUE},
395 {"ftp://[::13.1.68.3]",S_OK,FALSE},
396 {"ftp",S_OK,FALSE},
397 {"",S_FALSE,FALSE},
398 {"",S_FALSE,FALSE}
401 {Uri_HOST_IPV6,S_OK,TRUE},
402 {21,S_OK,TRUE},
403 {URL_SCHEME_FTP,S_OK,FALSE},
404 {URLZONE_INVALID,E_NOTIMPL,FALSE}
407 { "http://[FEDC:BA98:0:0:0:0:0:3210]", 0, S_OK, FALSE,
408 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
409 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
410 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
411 TRUE,
413 {"http://[fedc:ba98::3210]/",S_OK,TRUE},
414 {"[fedc:ba98::3210]",S_OK,TRUE},
415 {"http://[fedc:ba98::3210]/",S_OK,TRUE},
416 {"",S_FALSE,TRUE},
417 {"",S_FALSE,TRUE},
418 {"",S_FALSE,TRUE},
419 {"fedc:ba98::3210",S_OK,TRUE},
420 {"",S_FALSE,FALSE},
421 {"/",S_OK,TRUE},
422 {"/",S_OK,TRUE},
423 {"",S_FALSE,TRUE},
424 {"http://[FEDC:BA98:0:0:0:0:0:3210]",S_OK,FALSE},
425 {"http",S_OK,FALSE},
426 {"",S_FALSE,FALSE},
427 {"",S_FALSE,FALSE},
430 {Uri_HOST_IPV6,S_OK,TRUE},
431 {80,S_OK,TRUE},
432 {URL_SCHEME_HTTP,S_OK,FALSE},
433 {URLZONE_INVALID,E_NOTIMPL,FALSE}
436 { "1234://www.winehq.org", 0, S_OK, FALSE,
437 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
438 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
439 Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
440 TRUE,
442 {"1234://www.winehq.org/",S_OK,TRUE},
443 {"www.winehq.org",S_OK,TRUE},
444 {"1234://www.winehq.org/",S_OK,TRUE},
445 {"winehq.org",S_OK,TRUE},
446 {"",S_FALSE,TRUE},
447 {"",S_FALSE,TRUE},
448 {"www.winehq.org",S_OK,TRUE},
449 {"",S_FALSE,FALSE},
450 {"/",S_OK,TRUE},
451 {"/",S_OK,TRUE},
452 {"",S_FALSE,TRUE},
453 {"1234://www.winehq.org",S_OK,FALSE},
454 {"1234",S_OK,FALSE},
455 {"",S_FALSE,FALSE},
456 {"",S_FALSE,FALSE}
459 {Uri_HOST_DNS,S_OK,TRUE},
460 {0,S_FALSE,TRUE},
461 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
462 {URLZONE_INVALID,E_NOTIMPL,FALSE}
465 { "://www.winehq.org", 0, E_INVALIDARG, FALSE,
466 0, TRUE,
468 {"",S_FALSE,TRUE},
469 {"",S_FALSE,TRUE},
470 {"",S_FALSE,TRUE},
471 {"",S_FALSE,TRUE},
472 {"",S_FALSE,TRUE},
473 {"",S_FALSE,TRUE},
474 {"",S_FALSE,TRUE},
475 {"",S_FALSE,TRUE},
476 {"",S_FALSE,TRUE},
477 {"",S_FALSE,TRUE},
478 {"",S_FALSE,TRUE},
479 {"",S_FALSE,TRUE},
480 {"",S_FALSE,TRUE},
481 {"",S_FALSE,TRUE},
482 {"",S_FALSE,TRUE}
485 {Uri_HOST_UNKNOWN,S_FALSE,TRUE},
486 {0,S_FALSE,TRUE},
487 {URL_SCHEME_UNKNOWN,S_FALSE,FALSE},
488 {URLZONE_INVALID,E_NOTIMPL,FALSE}
491 /* Window's doesn't like URI's which are implicitly file paths without the ALLOW_IMPLICIT_FILE_SCHEME flag set. */
492 { "C:/test/test.mp3", 0, E_INVALIDARG, FALSE,
493 0, TRUE,
495 {"",S_FALSE,FALSE},
496 {"",S_FALSE,FALSE},
497 {"",S_FALSE,FALSE},
498 {"",S_FALSE,FALSE},
499 {"",S_FALSE,FALSE},
500 {"",S_FALSE,FALSE},
501 {"",S_FALSE,FALSE},
502 {"",S_FALSE,FALSE},
503 {"",S_FALSE,FALSE},
504 {"",S_FALSE,FALSE},
505 {"",S_FALSE,FALSE},
506 {"",S_FALSE,FALSE},
507 {"",S_FALSE,FALSE},
508 {"",S_FALSE,FALSE},
509 {"",S_FALSE,FALSE}
512 {Uri_HOST_UNKNOWN,S_FALSE,FALSE},
513 {0,S_FALSE,FALSE},
514 {URL_SCHEME_INVALID,S_FALSE,FALSE},
515 {URLZONE_INVALID,E_NOTIMPL,FALSE}
518 /* Window's doesn't like URI's which are implicitly file paths without the ALLOW_IMPLICIT_FILE_SCHEME flag set. */
519 { "\\\\Server/test/test.mp3", 0, E_INVALIDARG, FALSE,
520 0, TRUE,
522 {"",S_FALSE,FALSE},
523 {"",S_FALSE,FALSE},
524 {"",S_FALSE,FALSE},
525 {"",S_FALSE,FALSE},
526 {"",S_FALSE,FALSE},
527 {"",S_FALSE,FALSE},
528 {"",S_FALSE,FALSE},
529 {"",S_FALSE,FALSE},
530 {"",S_FALSE,FALSE},
531 {"",S_FALSE,FALSE},
532 {"",S_FALSE,FALSE},
533 {"",S_FALSE,FALSE},
534 {"",S_FALSE,FALSE},
535 {"",S_FALSE,FALSE},
536 {"",S_FALSE,FALSE}
539 {Uri_HOST_UNKNOWN,S_FALSE,FALSE},
540 {0,S_FALSE,FALSE},
541 {URL_SCHEME_INVALID,S_FALSE,FALSE},
542 {URLZONE_INVALID,E_NOTIMPL,FALSE}
545 /* Window's doesn't like URI's which are implicitly file paths without the ALLOW_IMPLICIT_FILE_SCHEME flag set. */
546 { "\\\\Server/test/test.mp3", Uri_CREATE_ALLOW_RELATIVE, E_INVALIDARG, FALSE,
547 0, TRUE,
549 {"",S_FALSE,FALSE},
550 {"",S_FALSE,FALSE},
551 {"",S_FALSE,FALSE},
552 {"",S_FALSE,FALSE},
553 {"",S_FALSE,FALSE},
554 {"",S_FALSE,FALSE},
555 {"",S_FALSE,FALSE},
556 {"",S_FALSE,FALSE},
557 {"",S_FALSE,FALSE},
558 {"",S_FALSE,FALSE},
559 {"",S_FALSE,FALSE},
560 {"",S_FALSE,FALSE},
561 {"",S_FALSE,FALSE},
562 {"",S_FALSE,FALSE},
563 {"",S_FALSE,FALSE}
566 {Uri_HOST_UNKNOWN,S_FALSE,FALSE},
567 {0,S_FALSE,FALSE},
568 {URL_SCHEME_INVALID,S_FALSE,FALSE},
569 {URLZONE_INVALID,E_NOTIMPL,FALSE}
572 /* Window's doesn't like URI's which are implicitly file paths without the ALLOW_IMPLICIT_FILE_SCHEME flag set. */
573 { "C:/test/test.mp3", Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME, E_INVALIDARG, FALSE,
574 0, TRUE,
576 {"",S_FALSE,FALSE},
577 {"",S_FALSE,FALSE},
578 {"",S_FALSE,FALSE},
579 {"",S_FALSE,FALSE},
580 {"",S_FALSE,FALSE},
581 {"",S_FALSE,FALSE},
582 {"",S_FALSE,FALSE},
583 {"",S_FALSE,FALSE},
584 {"",S_FALSE,FALSE},
585 {"",S_FALSE,FALSE},
586 {"",S_FALSE,FALSE},
587 {"",S_FALSE,FALSE},
588 {"",S_FALSE,FALSE},
589 {"",S_FALSE,FALSE},
590 {"",S_FALSE,FALSE}
593 {Uri_HOST_UNKNOWN,S_FALSE,FALSE},
594 {0,S_FALSE,FALSE},
595 {URL_SCHEME_INVALID,S_FALSE,FALSE},
596 {URLZONE_INVALID,E_NOTIMPL,FALSE}
599 /* Test's to make sure the parser/canonicalizer handles implicit file schemes correctly. */
600 { "C:/test/test.mp3", Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME, S_OK, FALSE,
601 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|
602 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
603 TRUE,
605 {"file:///C:/test/test.mp3",S_OK,TRUE},
606 {"",S_FALSE,TRUE},
607 {"file:///C:/test/test.mp3",S_OK,TRUE},
608 {"",S_FALSE,TRUE},
609 {".mp3",S_OK,TRUE},
610 {"",S_FALSE,TRUE},
611 {"",S_FALSE,TRUE},
612 {"",S_FALSE,FALSE},
613 {"/C:/test/test.mp3",S_OK,TRUE},
614 {"/C:/test/test.mp3",S_OK,TRUE},
615 {"",S_FALSE,TRUE},
616 {"C:/test/test.mp3",S_OK,FALSE},
617 {"file",S_OK,FALSE},
618 {"",S_FALSE,FALSE},
619 {"",S_FALSE,FALSE}
622 {Uri_HOST_UNKNOWN,S_OK,TRUE},
623 {0,S_FALSE,TRUE},
624 {URL_SCHEME_FILE,S_OK,FALSE},
625 {URLZONE_INVALID,E_NOTIMPL,FALSE}
628 /* Test's to make sure the parser/canonicalizer handles implicit file schemes correctly. */
629 { "\\\\Server/test.mp3", Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME, S_OK, FALSE,
630 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|
631 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_HOST|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
632 Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
633 TRUE,
635 {"file://server/test.mp3",S_OK,TRUE},
636 {"server",S_OK,TRUE},
637 {"file://server/test.mp3",S_OK,TRUE},
638 {"",S_FALSE,TRUE},
639 {".mp3",S_OK,TRUE},
640 {"",S_FALSE,TRUE},
641 {"server",S_OK,TRUE},
642 {"",S_FALSE,FALSE},
643 {"/test.mp3",S_OK,TRUE},
644 {"/test.mp3",S_OK,TRUE},
645 {"",S_FALSE,TRUE},
646 {"\\\\Server/test.mp3",S_OK,FALSE},
647 {"file",S_OK,FALSE},
648 {"",S_FALSE,FALSE},
649 {"",S_FALSE,FALSE}
652 {Uri_HOST_DNS,S_OK,TRUE},
653 {0,S_FALSE,TRUE},
654 {URL_SCHEME_FILE,S_OK,FALSE},
655 {URLZONE_INVALID,E_NOTIMPL,FALSE}
658 { "www.winehq.org/test", Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME, S_OK, FALSE,
659 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
660 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|
661 Uri_HAS_SCHEME,
662 TRUE,
664 {"*:www.winehq.org/test",S_OK,TRUE},
665 {"www.winehq.org",S_OK,TRUE},
666 {"*:www.winehq.org/test",S_OK,TRUE},
667 {"winehq.org",S_OK,TRUE},
668 {"",S_FALSE,TRUE},
669 {"",S_FALSE,TRUE},
670 {"www.winehq.org",S_OK,TRUE},
671 {"",S_FALSE,FALSE},
672 {"/test",S_OK,TRUE},
673 {"/test",S_OK,TRUE},
674 {"",S_FALSE,TRUE},
675 {"www.winehq.org/test",S_OK,FALSE},
676 {"*",S_OK,FALSE},
677 {"",S_FALSE,FALSE},
678 {"",S_FALSE,FALSE}
681 {Uri_HOST_DNS,S_OK,TRUE},
682 {0,S_FALSE,TRUE},
683 {URL_SCHEME_WILDCARD,S_OK,FALSE},
684 {URLZONE_INVALID,E_NOTIMPL,FALSE}
687 /* Valid since the '*' is the only character in the scheme name. */
688 { "*:www.winehq.org/test", 0, S_OK, FALSE,
689 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
690 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|
691 Uri_HAS_SCHEME,
692 TRUE,
694 {"*:www.winehq.org/test",S_OK,TRUE},
695 {"www.winehq.org",S_OK,TRUE},
696 {"*:www.winehq.org/test",S_OK,TRUE},
697 {"winehq.org",S_OK,TRUE},
698 {"",S_FALSE,TRUE},
699 {"",S_FALSE,TRUE},
700 {"www.winehq.org",S_OK,TRUE},
701 {"",S_FALSE,FALSE},
702 {"/test",S_OK,TRUE},
703 {"/test",S_OK,TRUE},
704 {"",S_FALSE,TRUE},
705 {"*:www.winehq.org/test",S_OK,FALSE},
706 {"*",S_OK,FALSE},
707 {"",S_FALSE,FALSE},
708 {"",S_FALSE,FALSE}
711 {Uri_HOST_DNS,S_OK,TRUE},
712 {0,S_FALSE,TRUE},
713 {URL_SCHEME_WILDCARD,S_OK,FALSE},
714 {URLZONE_INVALID,E_NOTIMPL,FALSE}
717 /* Not valid since a '*' is only allowed to appear if its the only character in scheme. */
718 { "*abcd://not.valid.com", 0, E_INVALIDARG, FALSE,
719 0, TRUE,
721 {"",S_FALSE,FALSE},
722 {"",S_FALSE,FALSE},
723 {"",S_FALSE,FALSE},
724 {"",S_FALSE,FALSE},
725 {"",S_FALSE,FALSE},
726 {"",S_FALSE,FALSE},
727 {"",S_FALSE,FALSE},
728 {"",S_FALSE,FALSE},
729 {"",S_FALSE,FALSE},
730 {"",S_FALSE,FALSE},
731 {"",S_FALSE,FALSE},
732 {"",S_FALSE,FALSE},
733 {"",S_FALSE,FALSE},
734 {"",S_FALSE,FALSE},
735 {"",S_FALSE,FALSE}
738 {Uri_HOST_UNKNOWN,S_FALSE,FALSE},
739 {0,S_FALSE,FALSE},
740 {URL_SCHEME_INVALID,S_FALSE,FALSE},
741 {URLZONE_INVALID,E_NOTIMPL,FALSE}
744 /* Not valid since a '*' is only allowed to appear if its the only character in scheme. */
745 { "*a*b*c*d://not.valid.com", 0, E_INVALIDARG, FALSE,
746 0, TRUE,
748 {"",S_FALSE,FALSE},
749 {"",S_FALSE,FALSE},
750 {"",S_FALSE,FALSE},
751 {"",S_FALSE,FALSE},
752 {"",S_FALSE,FALSE},
753 {"",S_FALSE,FALSE},
754 {"",S_FALSE,FALSE},
755 {"",S_FALSE,FALSE},
756 {"",S_FALSE,FALSE},
757 {"",S_FALSE,FALSE},
758 {"",S_FALSE,FALSE},
759 {"",S_FALSE,FALSE},
760 {"",S_FALSE,FALSE},
761 {"",S_FALSE,FALSE},
762 {"",S_FALSE,FALSE}
765 {Uri_HOST_UNKNOWN,S_FALSE,FALSE},
766 {0,S_FALSE,FALSE},
767 {URL_SCHEME_INVALID,S_FALSE,FALSE},
768 {URLZONE_INVALID,E_NOTIMPL,FALSE}
771 { "/../some dir/test.ext", Uri_CREATE_ALLOW_RELATIVE, S_OK, FALSE,
772 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|
773 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
774 TRUE,
776 {"/../some dir/test.ext",S_OK,TRUE},
777 {"",S_FALSE,TRUE},
778 {"/../some dir/test.ext",S_OK,TRUE},
779 {"",S_FALSE,TRUE},
780 {".ext",S_OK,TRUE},
781 {"",S_FALSE,TRUE},
782 {"",S_FALSE,TRUE},
783 {"",S_FALSE,FALSE},
784 {"/../some dir/test.ext",S_OK,TRUE},
785 {"/../some dir/test.ext",S_OK,TRUE},
786 {"",S_FALSE,TRUE},
787 {"/../some dir/test.ext",S_OK,FALSE},
788 {"",S_FALSE,FALSE},
789 {"",S_FALSE,FALSE},
790 {"",S_FALSE,FALSE}
793 {Uri_HOST_UNKNOWN,S_OK,TRUE},
794 {0,S_FALSE,TRUE},
795 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
796 {URLZONE_INVALID,E_NOTIMPL,FALSE}
799 { "//implicit/wildcard/uri scheme", Uri_CREATE_ALLOW_RELATIVE|Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME, S_OK, FALSE,
800 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|Uri_HAS_PATH|
801 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
802 TRUE,
804 {"*://implicit/wildcard/uri%20scheme",S_OK,TRUE},
805 {"",S_OK,TRUE},
806 {"*://implicit/wildcard/uri%20scheme",S_OK,TRUE},
807 {"",S_FALSE,TRUE},
808 {"",S_FALSE,TRUE},
809 {"",S_FALSE,TRUE},
810 {"",S_OK,TRUE},
811 {"",S_FALSE,FALSE},
812 {"//implicit/wildcard/uri%20scheme",S_OK,TRUE},
813 {"//implicit/wildcard/uri%20scheme",S_OK,TRUE},
814 {"",S_FALSE,TRUE},
815 {"//implicit/wildcard/uri scheme",S_OK,FALSE},
816 {"*",S_OK,FALSE},
817 {"",S_FALSE,FALSE},
818 {"",S_FALSE,FALSE},
821 {Uri_HOST_UNKNOWN,S_OK,TRUE},
822 {0,S_FALSE,TRUE},
823 {URL_SCHEME_WILDCARD,S_OK,FALSE},
824 {URLZONE_INVALID,E_NOTIMPL,FALSE}
827 /* URI is considered opaque since CREATE_NO_CRACK_UNKNOWN_SCHEMES is set and its an unknown scheme. */
828 { "zip://google.com", Uri_CREATE_NO_CRACK_UNKNOWN_SCHEMES, S_OK, FALSE,
829 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|
830 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME_NAME|
831 Uri_HAS_SCHEME,
832 TRUE,
834 {"zip:/.//google.com",S_OK,TRUE},
835 {"",S_FALSE,TRUE},
836 {"zip:/.//google.com",S_OK,TRUE},
837 {"",S_FALSE,TRUE},
838 {".com",S_OK,TRUE},
839 {"",S_FALSE,TRUE},
840 {"",S_FALSE,TRUE},
841 {"",S_FALSE,FALSE},
842 {"/.//google.com",S_OK,TRUE},
843 {"/.//google.com",S_OK,TRUE},
844 {"",S_FALSE,TRUE},
845 {"zip://google.com",S_OK,FALSE},
846 {"zip",S_OK,FALSE},
847 {"",S_FALSE,FALSE},
848 {"",S_FALSE,FALSE}
851 {Uri_HOST_UNKNOWN,S_OK,TRUE},
852 {0,S_FALSE,TRUE},
853 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
854 {URLZONE_INVALID,E_NOTIMPL,FALSE}
857 /* Windows uses the first occurence of ':' to delimit the userinfo. */
858 { "ftp://user:pass:word@winehq.org/", 0, S_OK, FALSE,
859 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
860 Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
861 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|
862 Uri_HAS_SCHEME,
863 TRUE,
865 {"ftp://user:pass:word@winehq.org/",S_OK,TRUE},
866 {"user:pass:word@winehq.org",S_OK,TRUE},
867 {"ftp://winehq.org/",S_OK,TRUE},
868 {"winehq.org",S_OK,TRUE},
869 {"",S_FALSE,TRUE},
870 {"",S_FALSE,TRUE},
871 {"winehq.org",S_OK,TRUE},
872 {"pass:word",S_OK,FALSE},
873 {"/",S_OK,TRUE},
874 {"/",S_OK,TRUE},
875 {"",S_FALSE,TRUE},
876 {"ftp://user:pass:word@winehq.org/",S_OK,FALSE},
877 {"ftp",S_OK,FALSE},
878 {"user:pass:word",S_OK,FALSE},
879 {"user",S_OK,FALSE}
882 {Uri_HOST_DNS,S_OK,TRUE},
883 {21,S_OK,TRUE},
884 {URL_SCHEME_FTP,S_OK,FALSE},
885 {URLZONE_INVALID,E_NOTIMPL,FALSE}
888 /* Make sure % encoded unreserved characters are decoded. */
889 { "ftp://w%49%4Ee:PA%53%53@ftp.google.com/", 0, S_OK, FALSE,
890 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
891 Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
892 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|
893 Uri_HAS_SCHEME,
894 TRUE,
896 {"ftp://wINe:PASS@ftp.google.com/",S_OK,TRUE},
897 {"wINe:PASS@ftp.google.com",S_OK,TRUE},
898 {"ftp://ftp.google.com/",S_OK,TRUE},
899 {"google.com",S_OK,TRUE},
900 {"",S_FALSE,TRUE},
901 {"",S_FALSE,TRUE},
902 {"ftp.google.com",S_OK,TRUE},
903 {"PASS",S_OK,FALSE},
904 {"/",S_OK,TRUE},
905 {"/",S_OK,TRUE},
906 {"",S_FALSE,TRUE},
907 {"ftp://w%49%4Ee:PA%53%53@ftp.google.com/",S_OK,FALSE},
908 {"ftp",S_OK,FALSE},
909 {"wINe:PASS",S_OK,FALSE},
910 {"wINe",S_OK,FALSE}
913 {Uri_HOST_DNS,S_OK,TRUE},
914 {21,S_OK,TRUE},
915 {URL_SCHEME_FTP,S_OK,FALSE},
916 {URLZONE_INVALID,E_NOTIMPL,FALSE}
919 /* Make sure % encoded characters which are NOT unreserved are NOT decoded. */
920 { "ftp://w%5D%5Be:PA%7B%7D@ftp.google.com/", 0, S_OK, FALSE,
921 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
922 Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
923 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|
924 Uri_HAS_SCHEME,
925 TRUE,
927 {"ftp://w%5D%5Be:PA%7B%7D@ftp.google.com/",S_OK,TRUE},
928 {"w%5D%5Be:PA%7B%7D@ftp.google.com",S_OK,TRUE},
929 {"ftp://ftp.google.com/",S_OK,TRUE},
930 {"google.com",S_OK,TRUE},
931 {"",S_FALSE,TRUE},
932 {"",S_FALSE,TRUE},
933 {"ftp.google.com",S_OK,TRUE},
934 {"PA%7B%7D",S_OK,FALSE},
935 {"/",S_OK,TRUE},
936 {"/",S_OK,TRUE},
937 {"",S_FALSE,TRUE},
938 {"ftp://w%5D%5Be:PA%7B%7D@ftp.google.com/",S_OK,FALSE},
939 {"ftp",S_OK,FALSE},
940 {"w%5D%5Be:PA%7B%7D",S_OK,FALSE},
941 {"w%5D%5Be",S_OK,FALSE}
944 {Uri_HOST_DNS,S_OK,TRUE},
945 {21,S_OK,TRUE},
946 {URL_SCHEME_FTP,S_OK,FALSE},
947 {URLZONE_INVALID,E_NOTIMPL,FALSE}
950 /* You're allowed to have an empty password portion in the userinfo section. */
951 { "ftp://empty:@ftp.google.com/", 0, S_OK, FALSE,
952 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
953 Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
954 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|
955 Uri_HAS_SCHEME,
956 TRUE,
958 {"ftp://empty:@ftp.google.com/",S_OK,TRUE},
959 {"empty:@ftp.google.com",S_OK,TRUE},
960 {"ftp://ftp.google.com/",S_OK,TRUE},
961 {"google.com",S_OK,TRUE},
962 {"",S_FALSE,TRUE},
963 {"",S_FALSE,TRUE},
964 {"ftp.google.com",S_OK,TRUE},
965 {"",S_OK,FALSE},
966 {"/",S_OK,TRUE},
967 {"/",S_OK,TRUE},
968 {"",S_FALSE,TRUE},
969 {"ftp://empty:@ftp.google.com/",S_OK,FALSE},
970 {"ftp",S_OK,FALSE},
971 {"empty:",S_OK,FALSE},
972 {"empty",S_OK,FALSE}
975 {Uri_HOST_DNS,S_OK,TRUE},
976 {21,S_OK,TRUE},
977 {URL_SCHEME_FTP,S_OK,FALSE},
978 {URLZONE_INVALID,E_NOTIMPL,FALSE}
981 /* Make sure forbidden characters in "userinfo" get encoded. */
982 { "ftp://\" \"weird@ftp.google.com/", 0, S_OK, FALSE,
983 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
984 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
985 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|
986 Uri_HAS_SCHEME,
987 TRUE,
989 {"ftp://%22%20%22weird@ftp.google.com/",S_OK,TRUE},
990 {"%22%20%22weird@ftp.google.com",S_OK,TRUE},
991 {"ftp://ftp.google.com/",S_OK,TRUE},
992 {"google.com",S_OK,TRUE},
993 {"",S_FALSE,TRUE},
994 {"",S_FALSE,TRUE},
995 {"ftp.google.com",S_OK,TRUE},
996 {"",S_FALSE,FALSE},
997 {"/",S_OK,TRUE},
998 {"/",S_OK,TRUE},
999 {"",S_FALSE,TRUE},
1000 {"ftp://\" \"weird@ftp.google.com/",S_OK,FALSE},
1001 {"ftp",S_OK,FALSE},
1002 {"%22%20%22weird",S_OK,FALSE},
1003 {"%22%20%22weird",S_OK,FALSE}
1006 {Uri_HOST_DNS,S_OK,TRUE},
1007 {21,S_OK,TRUE},
1008 {URL_SCHEME_FTP,S_OK,FALSE},
1009 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1012 /* Make sure the forbidden characters don't get percent encoded. */
1013 { "ftp://\" \"weird@ftp.google.com/", Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS, S_OK, FALSE,
1014 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1015 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
1016 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|
1017 Uri_HAS_SCHEME,
1018 TRUE,
1020 {"ftp://\" \"weird@ftp.google.com/",S_OK,TRUE},
1021 {"\" \"weird@ftp.google.com",S_OK,TRUE},
1022 {"ftp://ftp.google.com/",S_OK,TRUE},
1023 {"google.com",S_OK,TRUE},
1024 {"",S_FALSE,TRUE},
1025 {"",S_FALSE,TRUE},
1026 {"ftp.google.com",S_OK,TRUE},
1027 {"",S_FALSE,FALSE},
1028 {"/",S_OK,TRUE},
1029 {"/",S_OK,TRUE},
1030 {"",S_FALSE,TRUE},
1031 {"ftp://\" \"weird@ftp.google.com/",S_OK,FALSE},
1032 {"ftp",S_OK,FALSE},
1033 {"\" \"weird",S_OK,FALSE},
1034 {"\" \"weird",S_OK,FALSE}
1037 {Uri_HOST_DNS,S_OK,TRUE},
1038 {21,S_OK,TRUE},
1039 {URL_SCHEME_FTP,S_OK,FALSE},
1040 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1043 /* Allowed to have invalid % encoded because its an unknown scheme type. */
1044 { "zip://%xy:word@winehq.org/", 0, S_OK, FALSE,
1045 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1046 Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
1047 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
1048 TRUE,
1050 {"zip://%xy:word@winehq.org/",S_OK,TRUE},
1051 {"%xy:word@winehq.org",S_OK,TRUE},
1052 {"zip://%xy:word@winehq.org/",S_OK,TRUE},
1053 {"winehq.org",S_OK,TRUE},
1054 {"",S_FALSE,TRUE},
1055 {"",S_FALSE,TRUE},
1056 {"winehq.org",S_OK,TRUE},
1057 {"word",S_OK,FALSE},
1058 {"/",S_OK,TRUE},
1059 {"/",S_OK,TRUE},
1060 {"",S_FALSE,TRUE},
1061 {"zip://%xy:word@winehq.org/",S_OK,FALSE},
1062 {"zip",S_OK,FALSE},
1063 {"%xy:word",S_OK,FALSE},
1064 {"%xy",S_OK,FALSE}
1067 {Uri_HOST_DNS,S_OK,TRUE},
1068 {0,S_FALSE,TRUE},
1069 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
1070 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1073 /* Unreserved, percent encoded characters aren't decoded in the userinfo becuase the scheme
1074 * isn't known.
1076 { "zip://%2E:%52%53ord@winehq.org/", 0, S_OK, FALSE,
1077 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1078 Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
1079 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
1080 TRUE,
1082 {"zip://%2E:%52%53ord@winehq.org/",S_OK,TRUE},
1083 {"%2E:%52%53ord@winehq.org",S_OK,TRUE},
1084 {"zip://%2E:%52%53ord@winehq.org/",S_OK,TRUE},
1085 {"winehq.org",S_OK,TRUE},
1086 {"",S_FALSE,TRUE},
1087 {"",S_FALSE,TRUE},
1088 {"winehq.org",S_OK,TRUE},
1089 {"%52%53ord",S_OK,FALSE},
1090 {"/",S_OK,TRUE},
1091 {"/",S_OK,TRUE},
1092 {"",S_FALSE,TRUE},
1093 {"zip://%2E:%52%53ord@winehq.org/",S_OK,FALSE},
1094 {"zip",S_OK,FALSE},
1095 {"%2E:%52%53ord",S_OK,FALSE},
1096 {"%2E",S_OK,FALSE}
1099 {Uri_HOST_DNS,S_OK,TRUE},
1100 {0,S_FALSE,TRUE},
1101 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
1102 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1105 { "ftp://[](),'test':word@winehq.org/", 0, S_OK, FALSE,
1106 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1107 Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
1108 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|
1109 Uri_HAS_SCHEME,
1110 TRUE,
1112 {"ftp://[](),'test':word@winehq.org/",S_OK,TRUE},
1113 {"[](),'test':word@winehq.org",S_OK,TRUE},
1114 {"ftp://winehq.org/",S_OK,TRUE},
1115 {"winehq.org",S_OK,TRUE},
1116 {"",S_FALSE,TRUE},
1117 {"",S_FALSE,TRUE},
1118 {"winehq.org",S_OK,TRUE},
1119 {"word",S_OK,FALSE},
1120 {"/",S_OK,TRUE},
1121 {"/",S_OK,TRUE},
1122 {"",S_FALSE,TRUE},
1123 {"ftp://[](),'test':word@winehq.org/",S_OK,FALSE},
1124 {"ftp",S_OK,FALSE},
1125 {"[](),'test':word",S_OK,FALSE},
1126 {"[](),'test'",S_OK,FALSE}
1129 {Uri_HOST_DNS,S_OK,TRUE},
1130 {21,S_OK,TRUE},
1131 {URL_SCHEME_FTP,S_OK,FALSE},
1132 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1135 { "ftp://test?:word@winehq.org/", 0, S_OK, FALSE,
1136 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1137 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1138 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1139 TRUE,
1141 {"ftp://test/?:word@winehq.org/",S_OK,TRUE},
1142 {"test",S_OK,TRUE},
1143 {"ftp://test/?:word@winehq.org/",S_OK,TRUE},
1144 {"",S_FALSE,TRUE},
1145 {"",S_FALSE,TRUE},
1146 {"",S_FALSE,TRUE},
1147 {"test",S_OK,TRUE},
1148 {"",S_FALSE,FALSE},
1149 {"/",S_OK,TRUE},
1150 {"/?:word@winehq.org/",S_OK,TRUE},
1151 {"?:word@winehq.org/",S_OK,TRUE},
1152 {"ftp://test?:word@winehq.org/",S_OK,FALSE},
1153 {"ftp",S_OK,FALSE},
1154 {"",S_FALSE,FALSE},
1155 {"",S_FALSE,FALSE}
1158 {Uri_HOST_DNS,S_OK,TRUE},
1159 {21,S_OK,TRUE},
1160 {URL_SCHEME_FTP,S_OK,FALSE},
1161 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1164 { "ftp://test#:word@winehq.org/", 0, S_OK, FALSE,
1165 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_FRAGMENT|Uri_HAS_HOST|
1166 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1167 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1168 TRUE,
1170 {"ftp://test/#:word@winehq.org/",S_OK,TRUE},
1171 {"test",S_OK,TRUE},
1172 {"ftp://test/#:word@winehq.org/",S_OK,TRUE},
1173 {"",S_FALSE,TRUE},
1174 {"",S_FALSE,TRUE},
1175 {"#:word@winehq.org/",S_OK,TRUE},
1176 {"test",S_OK,TRUE},
1177 {"",S_FALSE,FALSE},
1178 {"/",S_OK,TRUE},
1179 {"/",S_OK,TRUE},
1180 {"",S_FALSE,TRUE},
1181 {"ftp://test#:word@winehq.org/",S_OK,FALSE},
1182 {"ftp",S_OK,FALSE},
1183 {"",S_FALSE,FALSE},
1184 {"",S_FALSE,FALSE}
1187 {Uri_HOST_DNS,S_OK,TRUE},
1188 {21,S_OK,TRUE},
1189 {URL_SCHEME_FTP,S_OK,FALSE},
1190 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1193 /* Allowed to have a backslash in the userinfo since it's an unknown scheme. */
1194 { "zip://test\\:word@winehq.org/", 0, S_OK, FALSE,
1195 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
1196 Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1197 Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
1198 TRUE,
1200 {"zip://test\\:word@winehq.org/",S_OK,TRUE},
1201 {"test\\:word@winehq.org",S_OK,TRUE},
1202 {"zip://test\\:word@winehq.org/",S_OK,TRUE},
1203 {"winehq.org",S_OK,TRUE},
1204 {"",S_FALSE,TRUE},
1205 {"",S_FALSE,TRUE},
1206 {"winehq.org",S_OK,TRUE},
1207 {"word",S_OK,FALSE},
1208 {"/",S_OK,TRUE},
1209 {"/",S_OK,TRUE},
1210 {"",S_FALSE,TRUE},
1211 {"zip://test\\:word@winehq.org/",S_OK,FALSE},
1212 {"zip",S_OK,FALSE},
1213 {"test\\:word",S_OK,FALSE},
1214 {"test\\",S_OK,FALSE}
1217 {Uri_HOST_DNS,S_OK,TRUE},
1218 {0,S_FALSE,TRUE},
1219 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
1220 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1223 /* It normalizes IPv4 addresses correctly. */
1224 { "http://127.000.000.100/", 0, S_OK, FALSE,
1225 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1226 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1227 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1228 TRUE,
1230 {"http://127.0.0.100/",S_OK,TRUE},
1231 {"127.0.0.100",S_OK,TRUE},
1232 {"http://127.0.0.100/",S_OK,TRUE},
1233 {"",S_FALSE,TRUE},
1234 {"",S_FALSE,TRUE},
1235 {"",S_FALSE,TRUE},
1236 {"127.0.0.100",S_OK,FALSE},
1237 {"",S_FALSE,FALSE},
1238 {"/",S_OK,TRUE},
1239 {"/",S_OK,TRUE},
1240 {"",S_FALSE,TRUE},
1241 {"http://127.000.000.100/",S_OK,FALSE},
1242 {"http",S_OK,FALSE},
1243 {"",S_FALSE,FALSE},
1244 {"",S_FALSE,FALSE}
1247 {Uri_HOST_IPV4,S_OK,TRUE},
1248 {80,S_OK,TRUE},
1249 {URL_SCHEME_HTTP,S_OK,FALSE},
1250 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1253 /* Make sure it normalizes partial IPv4 addresses correctly. */
1254 { "http://127.0/", 0, S_OK, FALSE,
1255 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1256 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1257 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1258 TRUE,
1260 {"http://127.0.0.0/",S_OK,TRUE},
1261 {"127.0.0.0",S_OK,TRUE},
1262 {"http://127.0.0.0/",S_OK,TRUE},
1263 {"",S_FALSE,TRUE},
1264 {"",S_FALSE,TRUE},
1265 {"",S_FALSE,TRUE},
1266 {"127.0.0.0",S_OK,FALSE},
1267 {"",S_FALSE,FALSE},
1268 {"/",S_OK,TRUE},
1269 {"/",S_OK,TRUE},
1270 {"",S_FALSE,TRUE},
1271 {"http://127.0/",S_OK,FALSE},
1272 {"http",S_OK,FALSE},
1273 {"",S_FALSE,FALSE},
1274 {"",S_FALSE,FALSE}
1277 {Uri_HOST_IPV4,S_OK,TRUE},
1278 {80,S_OK,TRUE},
1279 {URL_SCHEME_HTTP,S_OK,FALSE},
1280 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1283 /* Make sure it converts implicit IPv4's correctly. */
1284 { "http://123456/", 0, S_OK, FALSE,
1285 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1286 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1287 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1288 TRUE,
1290 {"http://0.1.226.64/",S_OK,TRUE},
1291 {"0.1.226.64",S_OK,TRUE},
1292 {"http://0.1.226.64/",S_OK,TRUE},
1293 {"",S_FALSE,TRUE},
1294 {"",S_FALSE,TRUE},
1295 {"",S_FALSE,TRUE},
1296 {"0.1.226.64",S_OK,FALSE},
1297 {"",S_FALSE,FALSE},
1298 {"/",S_OK,TRUE},
1299 {"/",S_OK,TRUE},
1300 {"",S_FALSE,TRUE},
1301 {"http://123456/",S_OK,FALSE},
1302 {"http",S_OK,FALSE},
1303 {"",S_FALSE,FALSE},
1304 {"",S_FALSE,FALSE}
1307 {Uri_HOST_IPV4,S_OK,TRUE},
1308 {80,S_OK,TRUE},
1309 {URL_SCHEME_HTTP,S_OK,FALSE},
1310 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1313 /* UINT_MAX */
1314 { "http://4294967295/", 0, S_OK, FALSE,
1315 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1316 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1317 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1318 TRUE,
1320 {"http://255.255.255.255/",S_OK,TRUE},
1321 {"255.255.255.255",S_OK,TRUE},
1322 {"http://255.255.255.255/",S_OK,TRUE},
1323 {"",S_FALSE,TRUE},
1324 {"",S_FALSE,TRUE},
1325 {"",S_FALSE,TRUE},
1326 {"255.255.255.255",S_OK,FALSE},
1327 {"",S_FALSE,FALSE},
1328 {"/",S_OK,TRUE},
1329 {"/",S_OK,TRUE},
1330 {"",S_FALSE,TRUE},
1331 {"http://4294967295/",S_OK,FALSE},
1332 {"http",S_OK,FALSE},
1333 {"",S_FALSE,FALSE},
1334 {"",S_FALSE,FALSE}
1337 {Uri_HOST_IPV4,S_OK,TRUE},
1338 {80,S_OK,TRUE},
1339 {URL_SCHEME_HTTP,S_OK,FALSE},
1340 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1343 /* UINT_MAX+1 */
1344 { "http://4294967296/", 0, S_OK, FALSE,
1345 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1346 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1347 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1348 TRUE,
1350 {"http://4294967296/",S_OK,TRUE},
1351 {"4294967296",S_OK,TRUE},
1352 {"http://4294967296/",S_OK,TRUE},
1353 {"",S_FALSE,TRUE},
1354 {"",S_FALSE,TRUE},
1355 {"",S_FALSE,TRUE},
1356 {"4294967296",S_OK,TRUE},
1357 {"",S_FALSE,FALSE},
1358 {"/",S_OK,TRUE},
1359 {"/",S_OK,TRUE},
1360 {"",S_FALSE,TRUE},
1361 {"http://4294967296/",S_OK,FALSE},
1362 {"http",S_OK,FALSE},
1363 {"",S_FALSE,FALSE},
1364 {"",S_FALSE,FALSE}
1367 {Uri_HOST_DNS,S_OK,TRUE},
1368 {80,S_OK,TRUE},
1369 {URL_SCHEME_HTTP,S_OK,FALSE},
1370 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1373 /* Window's doesn't normalize IP address for unknown schemes. */
1374 { "1234://4294967295/", 0, S_OK, FALSE,
1375 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1376 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1377 Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
1378 TRUE,
1380 {"1234://4294967295/",S_OK,TRUE},
1381 {"4294967295",S_OK,TRUE},
1382 {"1234://4294967295/",S_OK,TRUE},
1383 {"",S_FALSE,TRUE},
1384 {"",S_FALSE,TRUE},
1385 {"",S_FALSE,TRUE},
1386 {"4294967295",S_OK,FALSE},
1387 {"",S_FALSE,FALSE},
1388 {"/",S_OK,TRUE},
1389 {"/",S_OK,TRUE},
1390 {"",S_FALSE,TRUE},
1391 {"1234://4294967295/",S_OK,FALSE},
1392 {"1234",S_OK,FALSE},
1393 {"",S_FALSE,FALSE},
1394 {"",S_FALSE,FALSE}
1397 {Uri_HOST_IPV4,S_OK,TRUE},
1398 {0,S_FALSE,TRUE},
1399 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
1400 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1403 /* Window's doesn't normalize IP address for unknown schemes. */
1404 { "1234://127.001/", 0, S_OK, FALSE,
1405 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1406 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1407 Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
1408 TRUE,
1410 {"1234://127.001/",S_OK,TRUE},
1411 {"127.001",S_OK,TRUE},
1412 {"1234://127.001/",S_OK,TRUE},
1413 {"",S_FALSE,TRUE},
1414 {"",S_FALSE,TRUE},
1415 {"",S_FALSE,TRUE},
1416 {"127.001",S_OK,FALSE},
1417 {"",S_FALSE,FALSE},
1418 {"/",S_OK,TRUE},
1419 {"/",S_OK,TRUE},
1420 {"",S_FALSE,TRUE},
1421 {"1234://127.001/",S_OK,FALSE},
1422 {"1234",S_OK,FALSE},
1423 {"",S_FALSE,FALSE},
1424 {"",S_FALSE,FALSE}
1427 {Uri_HOST_IPV4,S_OK,TRUE},
1428 {0,S_FALSE,TRUE},
1429 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
1430 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1433 { "http://[FEDC:BA98::3210]", 0, S_OK, FALSE,
1434 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1435 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1436 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1437 TRUE,
1439 {"http://[fedc:ba98::3210]/",S_OK,TRUE},
1440 {"[fedc:ba98::3210]",S_OK,TRUE},
1441 {"http://[fedc:ba98::3210]/",S_OK,TRUE},
1442 {"",S_FALSE,TRUE},
1443 {"",S_FALSE,TRUE},
1444 {"",S_FALSE,TRUE},
1445 {"fedc:ba98::3210",S_OK,TRUE},
1446 {"",S_FALSE,FALSE},
1447 {"/",S_OK,TRUE},
1448 {"/",S_OK,TRUE},
1449 {"",S_FALSE,TRUE},
1450 {"http://[FEDC:BA98::3210]",S_OK,FALSE},
1451 {"http",S_OK,FALSE},
1452 {"",S_FALSE,FALSE},
1453 {"",S_FALSE,FALSE},
1456 {Uri_HOST_IPV6,S_OK,TRUE},
1457 {80,S_OK,TRUE},
1458 {URL_SCHEME_HTTP,S_OK,FALSE},
1459 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1462 { "http://[::]", 0, S_OK, FALSE,
1463 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1464 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1465 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1466 TRUE,
1468 {"http://[::]/",S_OK,TRUE},
1469 {"[::]",S_OK,TRUE},
1470 {"http://[::]/",S_OK,TRUE},
1471 {"",S_FALSE,TRUE},
1472 {"",S_FALSE,TRUE},
1473 {"",S_FALSE,TRUE},
1474 {"::",S_OK,TRUE},
1475 {"",S_FALSE,FALSE},
1476 {"/",S_OK,TRUE},
1477 {"/",S_OK,TRUE},
1478 {"",S_FALSE,TRUE},
1479 {"http://[::]",S_OK,FALSE},
1480 {"http",S_OK,FALSE},
1481 {"",S_FALSE,FALSE},
1482 {"",S_FALSE,FALSE},
1485 {Uri_HOST_IPV6,S_OK,TRUE},
1486 {80,S_OK,TRUE},
1487 {URL_SCHEME_HTTP,S_OK,FALSE},
1488 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1491 { "http://[FEDC:BA98::]", 0, S_OK, FALSE,
1492 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1493 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1494 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1495 TRUE,
1497 {"http://[fedc:ba98::]/",S_OK,TRUE},
1498 {"[fedc:ba98::]",S_OK,TRUE},
1499 {"http://[fedc:ba98::]/",S_OK,TRUE},
1500 {"",S_FALSE,TRUE},
1501 {"",S_FALSE,TRUE},
1502 {"",S_FALSE,TRUE},
1503 {"fedc:ba98::",S_OK,TRUE},
1504 {"",S_FALSE,FALSE},
1505 {"/",S_OK,TRUE},
1506 {"/",S_OK,TRUE},
1507 {"",S_FALSE,TRUE},
1508 {"http://[FEDC:BA98::]",S_OK,FALSE},
1509 {"http",S_OK,FALSE},
1510 {"",S_FALSE,FALSE},
1511 {"",S_FALSE,FALSE},
1514 {Uri_HOST_IPV6,S_OK,TRUE},
1515 {80,S_OK,TRUE},
1516 {URL_SCHEME_HTTP,S_OK,FALSE},
1517 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1522 typedef struct _uri_equality {
1523 const char* a;
1524 DWORD create_flags_a;
1525 BOOL create_todo_a;
1526 const char* b;
1527 DWORD create_flags_b;
1528 BOOL create_todo_b;
1529 BOOL equal;
1530 BOOL todo;
1531 } uri_equality;
1533 static const uri_equality equality_tests[] = {
1535 "HTTP://www.winehq.org/test dir/./",0,FALSE,
1536 "http://www.winehq.org/test dir/../test dir/",0,FALSE,
1537 TRUE, TRUE
1540 /* http://www.winehq.org/test%20dir */
1541 "http://%77%77%77%2E%77%69%6E%65%68%71%2E%6F%72%67/%74%65%73%74%20%64%69%72",0,FALSE,
1542 "http://www.winehq.org/test dir",0,FALSE,
1543 TRUE, TRUE,
1546 "c:\\test.mp3",Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME,FALSE,
1547 "file:///c:/test.mp3",0,FALSE,
1548 TRUE,TRUE
1551 "ftp://ftp.winehq.org/",0,FALSE,
1552 "ftp://ftp.winehq.org",0,FALSE,
1553 TRUE, TRUE
1556 "ftp://ftp.winehq.org/test/test2/../../testB/",0,FALSE,
1557 "ftp://ftp.winehq.org/t%45stB/",0,FALSE,
1558 FALSE, TRUE
1562 static inline LPWSTR a2w(LPCSTR str) {
1563 LPWSTR ret = NULL;
1565 if(str) {
1566 DWORD len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
1567 ret = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
1568 MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
1571 return ret;
1574 static inline BOOL heap_free(void* mem) {
1575 return HeapFree(GetProcessHeap(), 0, mem);
1578 static inline DWORD strcmp_aw(LPCSTR strA, LPCWSTR strB) {
1579 LPWSTR strAW = a2w(strA);
1580 DWORD ret = lstrcmpW(strAW, strB);
1581 heap_free(strAW);
1582 return ret;
1586 * Simple tests to make sure the CreateUri function handles invalid flag combinations
1587 * correctly.
1589 static void test_CreateUri_InvalidFlags(void) {
1590 DWORD i;
1592 for(i = 0; i < sizeof(invalid_flag_tests)/sizeof(invalid_flag_tests[0]); ++i) {
1593 HRESULT hr;
1594 IUri *uri = (void*) 0xdeadbeef;
1596 hr = pCreateUri(http_urlW, invalid_flag_tests[i].flags, 0, &uri);
1597 todo_wine {
1598 ok(hr == invalid_flag_tests[i].expected, "Error: CreateUri returned 0x%08x, expected 0x%08x, flags=0x%08x\n",
1599 hr, invalid_flag_tests[i].expected, invalid_flag_tests[i].flags);
1601 todo_wine { ok(uri == NULL, "Error: expected the IUri to be NULL, but it was %p instead\n", uri); }
1605 static void test_CreateUri_InvalidArgs(void) {
1606 HRESULT hr;
1607 IUri *uri = (void*) 0xdeadbeef;
1609 const WCHAR invalidW[] = {'i','n','v','a','l','i','d',0};
1611 hr = pCreateUri(http_urlW, 0, 0, NULL);
1612 ok(hr == E_INVALIDARG, "Error: CreateUri returned 0x%08x, expected 0x%08x\n", hr, E_INVALIDARG);
1614 hr = pCreateUri(NULL, 0, 0, &uri);
1615 ok(hr == E_INVALIDARG, "Error: CreateUri returned 0x%08x, expected 0x%08x\n", hr, E_INVALIDARG);
1616 ok(uri == NULL, "Error: Expected the IUri to be NULL, but it was %p instead\n", uri);
1618 uri = (void*) 0xdeadbeef;
1619 hr = pCreateUri(invalidW, 0, 0, &uri);
1620 ok(hr == E_INVALIDARG, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
1621 ok(uri == NULL, "Error: Expected the IUri to be NULL, but it was %p instead\n", uri);
1624 static void test_IUri_GetPropertyBSTR(void) {
1625 IUri *uri = NULL;
1626 HRESULT hr;
1627 DWORD i;
1629 /* Make sure GetPropertyBSTR handles invalid args correctly. */
1630 hr = pCreateUri(http_urlW, 0, 0, &uri);
1631 ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
1632 if(SUCCEEDED(hr)) {
1633 BSTR received = NULL;
1635 hr = IUri_GetPropertyBSTR(uri, Uri_PROPERTY_RAW_URI, NULL, 0);
1636 ok(hr == E_POINTER, "Error: GetPropertyBSTR returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
1638 /* Make sure it handles a invalid Uri_PROPERTY's correctly. */
1639 hr = IUri_GetPropertyBSTR(uri, Uri_PROPERTY_PORT, &received, 0);
1640 ok(hr == S_OK, "Error: GetPropertyBSTR returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
1641 ok(received != NULL, "Error: Expected the string not to be NULL.\n");
1642 ok(!SysStringLen(received), "Error: Expected the string to be of len=0 but it was %d instead.\n", SysStringLen(received));
1643 SysFreeString(received);
1645 /* Make sure it handles the ZONE property correctly. */
1646 received = NULL;
1647 hr = IUri_GetPropertyBSTR(uri, Uri_PROPERTY_ZONE, &received, 0);
1648 ok(hr == S_FALSE, "Error: GetPropertyBSTR returned 0x%08x, expected 0x%08x.\n", hr, S_FALSE);
1649 ok(received != NULL, "Error: Expected the string not to be NULL.\n");
1650 ok(!SysStringLen(received), "Error: Expected the string to be of len=0 but it was %d instead.\n", SysStringLen(received));
1651 SysFreeString(received);
1653 if(uri) IUri_Release(uri);
1655 for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
1656 uri_properties test = uri_tests[i];
1657 LPWSTR uriW;
1658 uri = NULL;
1660 uriW = a2w(test.uri);
1661 hr = pCreateUri(uriW, test.create_flags, 0, &uri);
1662 if(test.create_todo) {
1663 todo_wine {
1664 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x. Failed on uri_tests[%d].\n",
1665 hr, test.create_expected, i);
1667 } else {
1668 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x. Failed on uri_tests[%d].\n",
1669 hr, test.create_expected, i);
1672 if(SUCCEEDED(hr)) {
1673 DWORD j;
1675 /* Checks all the string properties of the uri. */
1676 for(j = Uri_PROPERTY_STRING_START; j <= Uri_PROPERTY_STRING_LAST; ++j) {
1677 BSTR received = NULL;
1678 uri_str_property prop = test.str_props[j];
1680 hr = IUri_GetPropertyBSTR(uri, j, &received, 0);
1681 if(prop.todo) {
1682 todo_wine {
1683 ok(hr == prop.expected, "GetPropertyBSTR returned 0x%08x, expected 0x%08x. On uri_tests[%d].str_props[%d].\n",
1684 hr, prop.expected, i, j);
1686 todo_wine {
1687 ok(!strcmp_aw(prop.value, received), "Expected %s but got %s on uri_tests[%d].str_props[%d].\n",
1688 prop.value, wine_dbgstr_w(received), i, j);
1690 } else {
1691 ok(hr == prop.expected, "GetPropertyBSTR returned 0x%08x, expected 0x%08x. On uri_tests[%d].str_props[%d].\n",
1692 hr, prop.expected, i, j);
1693 ok(!strcmp_aw(prop.value, received), "Expected %s but got %s on uri_tests[%d].str_props[%d].\n",
1694 prop.value, wine_dbgstr_w(received), i, j);
1697 SysFreeString(received);
1701 if(uri) IUri_Release(uri);
1703 heap_free(uriW);
1707 static void test_IUri_GetPropertyDWORD(void) {
1708 IUri *uri = NULL;
1709 HRESULT hr;
1710 DWORD i;
1712 hr = pCreateUri(http_urlW, 0, 0, &uri);
1713 ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
1714 if(SUCCEEDED(hr)) {
1715 DWORD received = 0xdeadbeef;
1717 hr = IUri_GetPropertyDWORD(uri, Uri_PROPERTY_DWORD_START, NULL, 0);
1718 ok(hr == E_INVALIDARG, "Error: GetPropertyDWORD returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
1720 hr = IUri_GetPropertyDWORD(uri, Uri_PROPERTY_ABSOLUTE_URI, &received, 0);
1721 ok(hr == E_INVALIDARG, "Error: GetPropertyDWORD returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
1722 ok(received == 0, "Error: Expected received=%d but instead received=%d.\n", 0, received);
1724 if(uri) IUri_Release(uri);
1726 for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
1727 uri_properties test = uri_tests[i];
1728 LPWSTR uriW;
1729 uri = NULL;
1731 uriW = a2w(test.uri);
1732 hr = pCreateUri(uriW, test.create_flags, 0, &uri);
1733 if(test.create_todo) {
1734 todo_wine {
1735 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x. Failed on uri_tests[%d].\n",
1736 hr, test.create_expected, i);
1738 } else {
1739 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x. Failed on uri_tests[%d].\n",
1740 hr, test.create_expected, i);
1743 if(SUCCEEDED(hr)) {
1744 DWORD j;
1746 /* Checks all the DWORD properties of the uri. */
1747 for(j = 0; j < sizeof(test.dword_props)/sizeof(test.dword_props[0]); ++j) {
1748 DWORD received;
1749 uri_dword_property prop = test.dword_props[j];
1751 hr = IUri_GetPropertyDWORD(uri, j+Uri_PROPERTY_DWORD_START, &received, 0);
1752 if(prop.todo) {
1753 todo_wine {
1754 ok(hr == prop.expected, "GetPropertyDWORD returned 0x%08x, expected 0x%08x. On uri_tests[%d].dword_props[%d].\n",
1755 hr, prop.expected, i, j);
1757 todo_wine {
1758 ok(prop.value == received, "Expected %d but got %d on uri_tests[%d].dword_props[%d].\n",
1759 prop.value, received, i, j);
1761 } else {
1762 ok(hr == prop.expected, "GetPropertyDWORD returned 0x%08x, expected 0x%08x. On uri_tests[%d].dword_props[%d].\n",
1763 hr, prop.expected, i, j);
1764 ok(prop.value == received, "Expected %d but got %d on uri_tests[%d].dword_props[%d].\n",
1765 prop.value, received, i, j);
1770 if(uri) IUri_Release(uri);
1772 heap_free(uriW);
1776 /* Tests all the 'Get*' property functions which deal with strings. */
1777 static void test_IUri_GetStrProperties(void) {
1778 IUri *uri = NULL;
1779 HRESULT hr;
1780 DWORD i;
1782 /* Make sure all the 'Get*' string property functions handle invalid args correctly. */
1783 hr = pCreateUri(http_urlW, 0, 0, &uri);
1784 ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
1785 if(SUCCEEDED(hr)) {
1786 hr = IUri_GetAbsoluteUri(uri, NULL);
1787 ok(hr == E_POINTER, "Error: GetAbsoluteUri returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
1789 hr = IUri_GetAuthority(uri, NULL);
1790 ok(hr == E_POINTER, "Error: GetAuthority returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
1792 hr = IUri_GetDisplayUri(uri, NULL);
1793 ok(hr == E_POINTER, "Error: GetDisplayUri returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
1795 hr = IUri_GetDomain(uri, NULL);
1796 ok(hr == E_POINTER, "Error: GetDomain returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
1798 hr = IUri_GetExtension(uri, NULL);
1799 ok(hr == E_POINTER, "Error: GetExtension returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
1801 hr = IUri_GetFragment(uri, NULL);
1802 ok(hr == E_POINTER, "Error: GetFragment returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
1804 hr = IUri_GetHost(uri, NULL);
1805 ok(hr == E_POINTER, "Error: GetHost returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
1807 hr = IUri_GetPassword(uri, NULL);
1808 ok(hr == E_POINTER, "Error: GetPassword returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
1810 hr = IUri_GetPath(uri, NULL);
1811 ok(hr == E_POINTER, "Error: GetPath returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
1813 hr = IUri_GetPathAndQuery(uri, NULL);
1814 ok(hr == E_POINTER, "Error: GetPathAndQuery returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
1816 hr = IUri_GetQuery(uri, NULL);
1817 ok(hr == E_POINTER, "Error: GetQuery returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
1819 hr = IUri_GetRawUri(uri, NULL);
1820 ok(hr == E_POINTER, "Error: GetRawUri returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
1822 hr = IUri_GetSchemeName(uri, NULL);
1823 ok(hr == E_POINTER, "Error: GetSchemeName returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
1825 hr = IUri_GetUserInfo(uri, NULL);
1826 ok(hr == E_POINTER, "Error: GetUserInfo returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
1828 hr = IUri_GetUserName(uri, NULL);
1829 ok(hr == E_POINTER, "Error: GetUserName returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
1831 if(uri) IUri_Release(uri);
1833 for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
1834 uri_properties test = uri_tests[i];
1835 LPWSTR uriW;
1836 uri = NULL;
1838 uriW = a2w(test.uri);
1839 hr = pCreateUri(uriW, test.create_flags, 0, &uri);
1840 if(test.create_todo) {
1841 todo_wine {
1842 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
1843 hr, test.create_expected, i);
1845 } else {
1846 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
1847 hr, test.create_expected, i);
1850 if(SUCCEEDED(hr)) {
1851 uri_str_property prop;
1852 BSTR received = NULL;
1854 /* GetAbsoluteUri() tests. */
1855 prop = test.str_props[Uri_PROPERTY_ABSOLUTE_URI];
1856 hr = IUri_GetAbsoluteUri(uri, &received);
1857 if(prop.todo) {
1858 todo_wine {
1859 ok(hr == prop.expected, "Error: GetAbsoluteUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
1860 hr, prop.expected, i);
1862 todo_wine {
1863 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
1864 prop.value, wine_dbgstr_w(received), i);
1866 } else {
1867 ok(hr == prop.expected, "Error: GetAbsoluteUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
1868 hr, prop.expected, i);
1869 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
1870 prop.value, wine_dbgstr_w(received), i);
1872 SysFreeString(received);
1873 received = NULL;
1875 /* GetAuthority() tests. */
1876 prop = test.str_props[Uri_PROPERTY_AUTHORITY];
1877 hr = IUri_GetAuthority(uri, &received);
1878 if(prop.todo) {
1879 todo_wine {
1880 ok(hr == prop.expected, "Error: GetAuthority returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
1881 hr, prop.expected, i);
1883 todo_wine {
1884 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
1885 prop.value, wine_dbgstr_w(received), i);
1887 } else {
1888 ok(hr == prop.expected, "Error: GetAuthority returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
1889 hr, prop.expected, i);
1890 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
1891 prop.value, wine_dbgstr_w(received), i);
1893 SysFreeString(received);
1894 received = NULL;
1896 /* GetDisplayUri() tests. */
1897 prop = test.str_props[Uri_PROPERTY_DISPLAY_URI];
1898 hr = IUri_GetDisplayUri(uri, &received);
1899 if(prop.todo) {
1900 todo_wine {
1901 ok(hr == prop.expected, "Error: GetDisplayUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
1902 hr, prop.expected, i);
1904 todo_wine {
1905 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_test[%d].\n",
1906 prop.value, wine_dbgstr_w(received), i);
1908 } else {
1909 ok(hr == prop.expected, "Error: GetDisplayUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
1910 hr, prop.expected, i);
1911 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
1912 prop.value, wine_dbgstr_w(received), i);
1914 SysFreeString(received);
1915 received = NULL;
1917 /* GetDomain() tests. */
1918 prop = test.str_props[Uri_PROPERTY_DOMAIN];
1919 hr = IUri_GetDomain(uri, &received);
1920 if(prop.todo) {
1921 todo_wine {
1922 ok(hr == prop.expected, "Error: GetDomain returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
1923 hr, prop.expected, i);
1925 todo_wine {
1926 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
1927 prop.value, wine_dbgstr_w(received), i);
1929 } else {
1930 ok(hr == prop.expected, "Error: GetDomain returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
1931 hr, prop.expected, i);
1932 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
1933 prop.value, wine_dbgstr_w(received), i);
1935 SysFreeString(received);
1936 received = NULL;
1938 /* GetExtension() tests. */
1939 prop = test.str_props[Uri_PROPERTY_EXTENSION];
1940 hr = IUri_GetExtension(uri, &received);
1941 if(prop.todo) {
1942 todo_wine {
1943 ok(hr == prop.expected, "Error: GetExtension returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
1944 hr, prop.expected, i);
1946 todo_wine {
1947 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
1948 prop.value, wine_dbgstr_w(received), i);
1950 } else {
1951 ok(hr == prop.expected, "Error: GetExtension returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
1952 hr, prop.expected, i);
1953 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
1954 prop.value, wine_dbgstr_w(received), i);
1956 SysFreeString(received);
1957 received = NULL;
1959 /* GetFragment() tests. */
1960 prop = test.str_props[Uri_PROPERTY_FRAGMENT];
1961 hr = IUri_GetFragment(uri, &received);
1962 if(prop.todo) {
1963 todo_wine {
1964 ok(hr == prop.expected, "Error: GetFragment returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
1965 hr, prop.expected, i);
1967 todo_wine {
1968 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
1969 prop.value, wine_dbgstr_w(received), i);
1971 } else {
1972 ok(hr == prop.expected, "Error: GetFragment returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
1973 hr, prop.expected, i);
1974 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
1975 prop.value, wine_dbgstr_w(received), i);
1977 SysFreeString(received);
1978 received = NULL;
1980 /* GetHost() tests. */
1981 prop = test.str_props[Uri_PROPERTY_HOST];
1982 hr = IUri_GetHost(uri, &received);
1983 if(prop.todo) {
1984 todo_wine {
1985 ok(hr == prop.expected, "Error: GetHost returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
1986 hr, prop.expected, i);
1988 todo_wine {
1989 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
1990 prop.value, wine_dbgstr_w(received), i);
1992 } else {
1993 ok(hr == prop.expected, "Error: GetHost returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
1994 hr, prop.expected, i);
1995 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
1996 prop.value, wine_dbgstr_w(received), i);
1998 SysFreeString(received);
1999 received = NULL;
2001 /* GetPassword() tests. */
2002 prop = test.str_props[Uri_PROPERTY_PASSWORD];
2003 hr = IUri_GetPassword(uri, &received);
2004 if(prop.todo) {
2005 todo_wine {
2006 ok(hr == prop.expected, "Error: GetPassword returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2007 hr, prop.expected, i);
2009 todo_wine {
2010 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
2011 prop.value, wine_dbgstr_w(received), i);
2013 } else {
2014 ok(hr == prop.expected, "Error: GetPassword returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2015 hr, prop.expected, i);
2016 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
2017 prop.value, wine_dbgstr_w(received), i);
2019 SysFreeString(received);
2020 received = NULL;
2022 /* GetPath() tests. */
2023 prop = test.str_props[Uri_PROPERTY_PATH];
2024 hr = IUri_GetPath(uri, &received);
2025 if(prop.todo) {
2026 todo_wine {
2027 ok(hr == prop.expected, "Error: GetPath returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2028 hr, prop.expected, i);
2030 todo_wine {
2031 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
2032 prop.value, wine_dbgstr_w(received), i);
2034 } else {
2035 ok(hr == prop.expected, "Error: GetPath returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2036 hr, prop.expected, i);
2037 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
2038 prop.value, wine_dbgstr_w(received), i);
2040 SysFreeString(received);
2041 received = NULL;
2043 /* GetPathAndQuery() tests. */
2044 prop = test.str_props[Uri_PROPERTY_PATH_AND_QUERY];
2045 hr = IUri_GetPathAndQuery(uri, &received);
2046 if(prop.todo) {
2047 todo_wine {
2048 ok(hr == prop.expected, "Error: GetPathAndQuery returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2049 hr, prop.expected, i);
2051 todo_wine {
2052 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
2053 prop.value, wine_dbgstr_w(received), i);
2055 } else {
2056 ok(hr == prop.expected, "Error: GetPathAndQuery returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2057 hr, prop.expected, i);
2058 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
2059 prop.value, wine_dbgstr_w(received), i);
2061 SysFreeString(received);
2062 received = NULL;
2064 /* GetQuery() tests. */
2065 prop = test.str_props[Uri_PROPERTY_QUERY];
2066 hr = IUri_GetQuery(uri, &received);
2067 if(prop.todo) {
2068 todo_wine {
2069 ok(hr == prop.expected, "Error: GetQuery returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2070 hr, prop.expected, i);
2072 todo_wine {
2073 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
2074 prop.value, wine_dbgstr_w(received), i);
2076 } else {
2077 ok(hr == prop.expected, "Error: GetQuery returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2078 hr, prop.expected, i);
2079 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
2080 prop.value, wine_dbgstr_w(received), i);
2082 SysFreeString(received);
2083 received = NULL;
2085 /* GetRawUri() tests. */
2086 prop = test.str_props[Uri_PROPERTY_RAW_URI];
2087 hr = IUri_GetRawUri(uri, &received);
2088 if(prop.todo) {
2089 todo_wine {
2090 ok(hr == prop.expected, "Error: GetRawUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2091 hr, prop.expected, i);
2093 todo_wine {
2094 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
2095 prop.value, wine_dbgstr_w(received), i);
2097 } else {
2098 ok(hr == prop.expected, "Error: GetRawUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2099 hr, prop.expected, i);
2100 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
2101 prop.value, wine_dbgstr_w(received), i);
2103 SysFreeString(received);
2104 received = NULL;
2106 /* GetSchemeName() tests. */
2107 prop = test.str_props[Uri_PROPERTY_SCHEME_NAME];
2108 hr = IUri_GetSchemeName(uri, &received);
2109 if(prop.todo) {
2110 todo_wine {
2111 ok(hr == prop.expected, "Error: GetSchemeName returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2112 hr, prop.expected, i);
2114 todo_wine {
2115 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
2116 prop.value, wine_dbgstr_w(received), i);
2118 } else {
2119 ok(hr == prop.expected, "Error: GetSchemeName returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2120 hr, prop.expected, i);
2121 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
2122 prop.value, wine_dbgstr_w(received), i);
2124 SysFreeString(received);
2125 received = NULL;
2127 /* GetUserInfo() tests. */
2128 prop = test.str_props[Uri_PROPERTY_USER_INFO];
2129 hr = IUri_GetUserInfo(uri, &received);
2130 if(prop.todo) {
2131 todo_wine {
2132 ok(hr == prop.expected, "Error: GetUserInfo returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2133 hr, prop.expected, i);
2135 todo_wine {
2136 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
2137 prop.value, wine_dbgstr_w(received), i);
2139 } else {
2140 ok(hr == prop.expected, "Error: GetUserInfo returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2141 hr, prop.expected, i);
2142 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
2143 prop.value, wine_dbgstr_w(received), i);
2145 SysFreeString(received);
2146 received = NULL;
2148 /* GetUserName() tests. */
2149 prop = test.str_props[Uri_PROPERTY_USER_NAME];
2150 hr = IUri_GetUserName(uri, &received);
2151 if(prop.todo) {
2152 todo_wine {
2153 ok(hr == prop.expected, "Error: GetUserName returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2154 hr, prop.expected, i);
2156 todo_wine {
2157 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
2158 prop.value, wine_dbgstr_w(received), i);
2160 } else {
2161 ok(hr == prop.expected, "Error: GetUserName returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2162 hr, prop.expected, i);
2163 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
2164 prop.value, wine_dbgstr_w(received), i);
2166 SysFreeString(received);
2169 if(uri) IUri_Release(uri);
2171 heap_free(uriW);
2175 static void test_IUri_GetDwordProperties(void) {
2176 IUri *uri = NULL;
2177 HRESULT hr;
2178 DWORD i;
2180 /* Make sure all the 'Get*' dword property functions handle invalid args correctly. */
2181 hr = pCreateUri(http_urlW, 0, 0, &uri);
2182 ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
2183 if(SUCCEEDED(hr)) {
2184 hr = IUri_GetHostType(uri, NULL);
2185 ok(hr == E_INVALIDARG, "Error: GetHostType returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
2187 hr = IUri_GetPort(uri, NULL);
2188 ok(hr == E_INVALIDARG, "Error: GetPort returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
2190 hr = IUri_GetScheme(uri, NULL);
2191 ok(hr == E_INVALIDARG, "Error: GetScheme returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
2193 hr = IUri_GetZone(uri, NULL);
2194 ok(hr == E_INVALIDARG, "Error: GetZone returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
2196 if(uri) IUri_Release(uri);
2198 for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
2199 uri_properties test = uri_tests[i];
2200 LPWSTR uriW;
2201 uri = NULL;
2203 uriW = a2w(test.uri);
2204 hr = pCreateUri(uriW, test.create_flags, 0, &uri);
2205 if(test.create_todo) {
2206 todo_wine {
2207 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2208 hr, test.create_expected, i);
2210 } else {
2211 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2212 hr, test.create_expected, i);
2215 if(SUCCEEDED(hr)) {
2216 uri_dword_property prop;
2217 DWORD received;
2219 /* Assign an insane value so tests don't accidentally pass when
2220 * they shouldn't!
2222 received = -9999999;
2224 /* GetHostType() tests. */
2225 prop = test.dword_props[Uri_PROPERTY_HOST_TYPE-Uri_PROPERTY_DWORD_START];
2226 hr = IUri_GetHostType(uri, &received);
2227 if(prop.todo) {
2228 todo_wine {
2229 ok(hr == prop.expected, "Error: GetHostType returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2230 hr, prop.expected, i);
2232 todo_wine {
2233 ok(received == prop.value, "Error: Expected %d but got %d on uri_tests[%d].\n", prop.value, received, i);
2235 } else {
2236 ok(hr == prop.expected, "Error: GetHostType returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2237 hr, prop.expected, i);
2238 ok(received == prop.value, "Error: Expected %d but got %d on uri_tests[%d].\n", prop.value, received, i);
2240 received = -9999999;
2242 /* GetPort() tests. */
2243 prop = test.dword_props[Uri_PROPERTY_PORT-Uri_PROPERTY_DWORD_START];
2244 hr = IUri_GetPort(uri, &received);
2245 if(prop.todo) {
2246 todo_wine {
2247 ok(hr == prop.expected, "Error: GetPort returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2248 hr, prop.expected, i);
2250 todo_wine {
2251 ok(received == prop.value, "Error: Expected %d but got %d on uri_tests[%d].\n", prop.value, received, i);
2253 } else {
2254 ok(hr == prop.expected, "Error: GetPort returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2255 hr, prop.expected, i);
2256 ok(received == prop.value, "Error: Expected %d but got %d on uri_tests[%d].\n", prop.value, received, i);
2258 received = -9999999;
2260 /* GetScheme() tests. */
2261 prop = test.dword_props[Uri_PROPERTY_SCHEME-Uri_PROPERTY_DWORD_START];
2262 hr = IUri_GetScheme(uri, &received);
2263 if(prop.todo) {
2264 todo_wine {
2265 ok(hr == prop.expected, "Error: GetScheme returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2266 hr, prop.expected, i);
2268 todo_wine {
2269 ok(received == prop.value, "Error: Expected %d but got %d on uri_tests[%d].\n", prop.value, received, i);
2271 } else {
2272 ok(hr == prop.expected, "Error: GetScheme returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2273 hr, prop.expected, i);
2274 ok(received == prop.value, "Error: Expected %d but got %d on uri_tests[%d].\n", prop.value, received, i);
2276 received = -9999999;
2278 /* GetZone() tests. */
2279 prop = test.dword_props[Uri_PROPERTY_ZONE-Uri_PROPERTY_DWORD_START];
2280 hr = IUri_GetZone(uri, &received);
2281 if(prop.todo) {
2282 todo_wine {
2283 ok(hr == prop.expected, "Error: GetZone returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2284 hr, prop.expected, i);
2286 todo_wine {
2287 ok(received == prop.value, "Error: Expected %d but got %d on uri_tests[%d].\n", prop.value, received, i);
2289 } else {
2290 ok(hr == prop.expected, "Error: GetZone returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2291 hr, prop.expected, i);
2292 ok(received == prop.value, "Error: Expected %d but got %d on uri_tests[%d].\n", prop.value, received, i);
2296 if(uri) IUri_Release(uri);
2298 heap_free(uriW);
2302 static void test_IUri_GetPropertyLength(void) {
2303 IUri *uri = NULL;
2304 HRESULT hr;
2305 DWORD i;
2307 /* Make sure it handles invalid args correctly. */
2308 hr = pCreateUri(http_urlW, 0, 0, &uri);
2309 ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
2310 if(SUCCEEDED(hr)) {
2311 DWORD received = 0xdeadbeef;
2313 hr = IUri_GetPropertyLength(uri, Uri_PROPERTY_STRING_START, NULL, 0);
2314 ok(hr == E_INVALIDARG, "Error: GetPropertyLength returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
2316 hr = IUri_GetPropertyLength(uri, Uri_PROPERTY_DWORD_START, &received, 0);
2317 ok(hr == E_INVALIDARG, "Error: GetPropertyLength return 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
2318 ok(received == 0xdeadbeef, "Error: Expected 0xdeadbeef but got 0x%08x.\n", received);
2320 if(uri) IUri_Release(uri);
2322 for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
2323 uri_properties test = uri_tests[i];
2324 LPWSTR uriW;
2325 uri = NULL;
2327 uriW = a2w(test.uri);
2328 hr = pCreateUri(uriW, test.create_flags, 0, &uri);
2329 if(test.create_todo) {
2330 todo_wine {
2331 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
2332 hr, test.create_expected, i);
2334 } else {
2335 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x on uri_test[%d].\n",
2336 hr, test.create_expected, i);
2339 if(SUCCEEDED(hr)) {
2340 DWORD j;
2342 for(j = Uri_PROPERTY_STRING_START; j <= Uri_PROPERTY_STRING_LAST; ++j) {
2343 DWORD expectedLen, receivedLen;
2344 uri_str_property prop = test.str_props[j];
2346 expectedLen = lstrlen(prop.value);
2348 /* This won't be necessary once GetPropertyLength is implemented. */
2349 receivedLen = -1;
2351 hr = IUri_GetPropertyLength(uri, j, &receivedLen, 0);
2352 if(prop.todo) {
2353 todo_wine {
2354 ok(hr == prop.expected, "Error: GetPropertyLength returned 0x%08x, expected 0x%08x on uri_tests[%d].str_props[%d].\n",
2355 hr, prop.expected, i, j);
2357 todo_wine {
2358 ok(receivedLen == expectedLen, "Error: Expected a length of %d but got %d on uri_tests[%d].str_props[%d].\n",
2359 expectedLen, receivedLen, i, j);
2361 } else {
2362 ok(hr == prop.expected, "Error: GetPropertyLength returned 0x%08x, expected 0x%08x on uri_tests[%d].str_props[%d].\n",
2363 hr, prop.expected, i, j);
2364 ok(receivedLen == expectedLen, "Error: Expected a length of %d but got %d on uri_tests[%d].str_props[%d].\n",
2365 expectedLen, receivedLen, i, j);
2370 if(uri) IUri_Release(uri);
2372 heap_free(uriW);
2376 static void test_IUri_GetProperties(void) {
2377 IUri *uri = NULL;
2378 HRESULT hr;
2379 DWORD i;
2381 hr = pCreateUri(http_urlW, 0, 0, &uri);
2382 ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
2383 if(SUCCEEDED(hr)) {
2384 hr = IUri_GetProperties(uri, NULL);
2385 ok(hr == E_INVALIDARG, "Error: GetProperties returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
2387 if(uri) IUri_Release(uri);
2389 for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
2390 uri_properties test = uri_tests[i];
2391 LPWSTR uriW;
2392 uri = NULL;
2394 uriW = a2w(test.uri);
2395 hr = pCreateUri(uriW, test.create_flags, 0, &uri);
2396 if(test.create_todo) {
2397 todo_wine {
2398 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, test.create_expected);
2400 } else {
2401 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, test.create_expected);
2404 if(SUCCEEDED(hr)) {
2405 DWORD received = 0;
2406 DWORD j;
2408 hr = IUri_GetProperties(uri, &received);
2409 if(test.props_todo) {
2410 todo_wine {
2411 ok(hr == S_OK, "Error: GetProperties returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
2413 } else {
2414 ok(hr == S_OK, "Error: GetProperties returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
2417 for(j = 0; j <= Uri_PROPERTY_DWORD_LAST; ++j) {
2418 /* (1 << j) converts a Uri_PROPERTY to its corresponding Uri_HAS_* flag mask. */
2419 if(test.props & (1 << j)) {
2420 if(test.props_todo) {
2421 todo_wine {
2422 ok(received & (1 << j), "Error: Expected flag for property %d on uri_tests[%d].\n", j, i);
2424 } else {
2425 ok(received & (1 << j), "Error: Expected flag for property %d on uri_tests[%d].\n", j, i);
2427 } else {
2428 /* NOTE: Since received is initialized to 0, this test will always pass while
2429 * GetProperties is unimplemented.
2431 ok(!(received & (1 << j)), "Error: Received flag for property %d when not expected on uri_tests[%d].\n", j, i);
2436 if(uri) IUri_Release(uri);
2438 heap_free(uriW);
2442 static void test_IUri_HasProperty(void) {
2443 IUri *uri = NULL;
2444 HRESULT hr;
2445 DWORD i;
2447 hr = pCreateUri(http_urlW, 0, 0, &uri);
2448 ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
2449 if(SUCCEEDED(hr)) {
2450 hr = IUri_HasProperty(uri, Uri_PROPERTY_RAW_URI, NULL);
2451 ok(hr == E_INVALIDARG, "Error: HasProperty returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
2453 if(uri) IUri_Release(uri);
2455 for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
2456 uri_properties test = uri_tests[i];
2457 LPWSTR uriW;
2458 uri = NULL;
2460 uriW = a2w(test.uri);
2462 hr = pCreateUri(uriW, test.create_flags, 0, &uri);
2463 if(test.create_todo) {
2464 todo_wine {
2465 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, test.create_expected);
2467 } else {
2468 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, test.create_expected);
2471 if(SUCCEEDED(hr)) {
2472 DWORD j;
2474 for(j = 0; j <= Uri_PROPERTY_DWORD_LAST; ++j) {
2475 /* Assign -1, then explicitly test for TRUE or FALSE later. */
2476 BOOL received = -1;
2478 hr = IUri_HasProperty(uri, j, &received);
2479 if(test.props_todo) {
2480 todo_wine {
2481 ok(hr == S_OK, "Error: HasProperty returned 0x%08x, expected 0x%08x for property %d on uri_tests[%d].\n",
2482 hr, S_OK, j, i);
2485 /* Check if the property should be true. */
2486 if(test.props & (1 << j)) {
2487 todo_wine {
2488 ok(received == TRUE, "Error: Expected to have property %d on uri_tests[%d].\n", j, i);
2490 } else {
2491 todo_wine {
2492 ok(received == FALSE, "Error: Wasn't expecting to have property %d on uri_tests[%d].\n", j, i);
2495 } else {
2496 ok(hr == S_OK, "Error: HasProperty returned 0x%08x, expected 0x%08x for property %d on uri_tests[%d].\n",
2497 hr, S_OK, j, i);
2499 if(test.props & (1 << j)) {
2500 ok(received == TRUE, "Error: Expected to have property %d on uri_tests[%d].\n", j, i);
2501 } else {
2502 ok(received == FALSE, "Error: Wasn't expecting to have property %d on uri_tests[%d].\n", j, i);
2508 if(uri) IUri_Release(uri);
2510 heap_free(uriW);
2514 static void test_IUri_IsEqual(void) {
2515 IUri *uriA, *uriB;
2516 HRESULT hrA, hrB;
2517 DWORD i;
2519 uriA = uriB = NULL;
2521 /* Make sure IsEqual handles invalid args correctly. */
2522 hrA = pCreateUri(http_urlW, 0, 0, &uriA);
2523 hrB = pCreateUri(http_urlW, 0, 0, &uriB);
2524 ok(hrA == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hrA, S_OK);
2525 ok(hrB == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hrB, S_OK);
2526 if(SUCCEEDED(hrA) && SUCCEEDED(hrB)) {
2527 BOOL equal = -1;
2528 hrA = IUri_IsEqual(uriA, NULL, &equal);
2529 ok(hrA == S_OK, "Error: IsEqual returned 0x%08x, expected 0x%08x.\n", hrA, S_OK);
2530 ok(equal == FALSE, "Error: Expected equal to be FALSE, but was %d instead.\n", equal);
2532 hrA = IUri_IsEqual(uriA, uriB, NULL);
2533 ok(hrA == E_POINTER, "Error: IsEqual returned 0x%08x, expected 0x%08x.\n", hrA, E_POINTER);
2535 if(uriA) IUri_Release(uriA);
2536 if(uriB) IUri_Release(uriB);
2538 for(i = 0; i < sizeof(equality_tests)/sizeof(equality_tests[0]); ++i) {
2539 uri_equality test = equality_tests[i];
2540 LPWSTR uriA_W, uriB_W;
2542 uriA = uriB = NULL;
2544 uriA_W = a2w(test.a);
2545 uriB_W = a2w(test.b);
2547 hrA = pCreateUri(uriA_W, test.create_flags_a, 0, &uriA);
2548 if(test.create_todo_a) {
2549 todo_wine {
2550 ok(hrA == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x on equality_tests[%d].a\n",
2551 hrA, S_OK, i);
2553 } else {
2554 ok(hrA == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x on equality_tests[%d].a\n",
2555 hrA, S_OK, i);
2558 hrB = pCreateUri(uriB_W, test.create_flags_b, 0, &uriB);
2559 if(test.create_todo_b) {
2560 todo_wine {
2561 ok(hrB == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x on equality_tests[%d].b\n",
2562 hrB, S_OK, i);
2564 } else {
2565 ok(hrB == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x on equality_tests[%d].b\n",
2566 hrB, S_OK, i);
2569 if(SUCCEEDED(hrA) && SUCCEEDED(hrB)) {
2570 BOOL equal = -1;
2572 hrA = IUri_IsEqual(uriA, uriB, &equal);
2573 if(test.todo) {
2574 todo_wine {
2575 ok(hrA == S_OK, "Error: IsEqual returned 0x%08x, expected 0x%08x on equality_tests[%d].\n",
2576 hrA, S_OK, i);
2578 todo_wine {
2579 ok(equal == test.equal, "Error: Expected the comparison to be %d on equality_tests[%d].\n", test.equal, i);
2581 } else {
2582 ok(hrA == S_OK, "Error: IsEqual returned 0x%08x, expected 0x%08x on equality_tests[%d].\n", hrA, S_OK, i);
2583 ok(equal == test.equal, "Error: Expected the comparison to be %d on equality_tests[%d].\n", test.equal, i);
2586 if(uriA) IUri_Release(uriA);
2587 if(uriB) IUri_Release(uriB);
2589 heap_free(uriA_W);
2590 heap_free(uriB_W);
2594 START_TEST(uri) {
2595 HMODULE hurlmon;
2597 hurlmon = GetModuleHandle("urlmon.dll");
2598 pCreateUri = (void*) GetProcAddress(hurlmon, "CreateUri");
2600 if(!pCreateUri) {
2601 win_skip("CreateUri is not present, skipping tests.\n");
2602 return;
2605 trace("test CreateUri invalid flags...\n");
2606 test_CreateUri_InvalidFlags();
2608 trace("test CreateUri invalid args...\n");
2609 test_CreateUri_InvalidArgs();
2611 trace("test IUri_GetPropertyBSTR...\n");
2612 test_IUri_GetPropertyBSTR();
2614 trace("test IUri_GetPropertyDWORD...\n");
2615 test_IUri_GetPropertyDWORD();
2617 trace("test IUri_GetStrProperties...\n");
2618 test_IUri_GetStrProperties();
2620 trace("test IUri_GetDwordProperties...\n");
2621 test_IUri_GetDwordProperties();
2623 trace("test IUri_GetPropertyLength...\n");
2624 test_IUri_GetPropertyLength();
2626 trace("test IUri_GetProperties...\n");
2627 test_IUri_GetProperties();
2629 trace("test IUri_HasProperty...\n");
2630 test_IUri_HasProperty();
2632 trace("test IUri_IsEqual...\n");
2633 test_IUri_IsEqual();