1 /* Unit test suite for Path functions
3 * Copyright 2002 Matthew Mastracci
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 #include "wine/test.h"
28 #include "wine/unicode.h"
33 const char* TEST_URL_1
= "http://www.winehq.org/tests?date=10/10/1923";
34 const char* TEST_URL_2
= "http://localhost:8080/tests%2e.html?date=Mon%2010/10/1923";
35 const char* TEST_URL_3
= "http://foo:bar@localhost:21/internal.php?query=x&return=y";
37 typedef struct _TEST_URL_CANONICALIZE
{
42 } TEST_URL_CANONICALIZE
;
44 const TEST_URL_CANONICALIZE TEST_CANONICALIZE
[] = {
45 /*FIXME {"http://www.winehq.org/tests/../tests/../..", 0, S_OK, "http://www.winehq.org/"},*/
46 {"http://www.winehq.org/tests/../tests", 0, S_OK
, "http://www.winehq.org/tests"},
47 {"http://www.winehq.org/tests\n", URL_WININET_COMPATIBILITY
|URL_ESCAPE_SPACES_ONLY
|URL_ESCAPE_UNSAFE
, S_OK
, "http://www.winehq.org/tests"},
48 {"http://www.winehq.org/tests\r", URL_WININET_COMPATIBILITY
|URL_ESCAPE_SPACES_ONLY
|URL_ESCAPE_UNSAFE
, S_OK
, "http://www.winehq.org/tests"},
49 {"http://www.winehq.org/tests\r", 0, S_OK
, "http://www.winehq.org/tests"},
50 {"http://www.winehq.org/tests\r", URL_DONT_SIMPLIFY
, S_OK
, "http://www.winehq.org/tests"},
51 {"http://www.winehq.org/tests/../tests/", 0, S_OK
, "http://www.winehq.org/tests/"},
52 {"http://www.winehq.org/tests/../tests/..", 0, S_OK
, "http://www.winehq.org/"},
53 {"http://www.winehq.org/tests/../tests/../", 0, S_OK
, "http://www.winehq.org/"},
54 {"http://www.winehq.org/tests/..", 0, S_OK
, "http://www.winehq.org/"},
55 {"http://www.winehq.org/tests/../", 0, S_OK
, "http://www.winehq.org/"},
56 {"http://www.winehq.org/tests/..?query=x&return=y", 0, S_OK
, "http://www.winehq.org/?query=x&return=y"},
57 {"http://www.winehq.org/tests/../?query=x&return=y", 0, S_OK
, "http://www.winehq.org/?query=x&return=y"},
58 {"http://www.winehq.org/tests/..#example", 0, S_OK
, "http://www.winehq.org/#example"},
59 {"http://www.winehq.org/tests/../#example", 0, S_OK
, "http://www.winehq.org/#example"},
60 {"http://www.winehq.org/tests/../#example", URL_DONT_SIMPLIFY
, S_OK
, "http://www.winehq.org/tests/../#example"},
63 typedef struct _TEST_URL_ESCAPE
{
71 const TEST_URL_ESCAPE TEST_ESCAPE
[] = {
72 {"http://www.winehq.org/tests0", 0, 0, S_OK
, "http://www.winehq.org/tests0"},
73 {"http://www.winehq.org/tests1\n", 0, 0, S_OK
, "http://www.winehq.org/tests1%0A"},
74 {"http://www.winehq.org/tests2\r", 0, 0, S_OK
, "http://www.winehq.org/tests2%0D"},
75 {"http://www.winehq.org/tests3\r", URL_ESCAPE_SPACES_ONLY
|URL_ESCAPE_UNSAFE
, 0, S_OK
, "http://www.winehq.org/tests3\r"},
76 {"http://www.winehq.org/tests4\r", URL_ESCAPE_SPACES_ONLY
, 0, S_OK
, "http://www.winehq.org/tests4\r"},
77 {"http://www.winehq.org/tests5\r", URL_WININET_COMPATIBILITY
|URL_ESCAPE_SPACES_ONLY
, 0, S_OK
, "http://www.winehq.org/tests5\r"},
78 {"/direct/swhelp/series6/6.2i_latestservicepack.dat\r", URL_ESCAPE_SPACES_ONLY
, 0, S_OK
, "/direct/swhelp/series6/6.2i_latestservicepack.dat\r"},
80 {"file://////foo/bar\\baz", 0, 0, S_OK
, "file://foo/bar/baz"},
81 {"file://///foo/bar\\baz", 0, 0, S_OK
, "file://foo/bar/baz"},
82 {"file:////foo/bar\\baz", 0, 0, S_OK
, "file://foo/bar/baz"},
83 {"file:///localhost/foo/bar\\baz", 0, 0, S_OK
, "file:///localhost/foo/bar/baz"},
84 {"file:///foo/bar\\baz", 0, 0, S_OK
, "file:///foo/bar/baz"},
85 {"file://loCalHost/foo/bar\\baz", 0, 0, S_OK
, "file:///foo/bar/baz"},
86 {"file://foo/bar\\baz", 0, 0, S_OK
, "file://foo/bar/baz"},
87 {"file:/localhost/foo/bar\\baz", 0, 0, S_OK
, "file:///localhost/foo/bar/baz"},
88 {"file:/foo/bar\\baz", 0, 0, S_OK
, "file:///foo/bar/baz"},
89 {"file:foo/bar\\baz", 0, 0, S_OK
, "file:foo/bar/baz"},
90 {"file:\\foo/bar\\baz", 0, 0, S_OK
, "file:///foo/bar/baz"},
91 {"file:\\\\foo/bar\\baz", 0, 0, S_OK
, "file://foo/bar/baz"},
92 {"file:\\\\\\foo/bar\\baz", 0, 0, S_OK
, "file:///foo/bar/baz"},
93 {"file:\\\\localhost\\foo/bar\\baz", 0, 0, S_OK
, "file:///foo/bar/baz"},
94 {"file:///f oo/b?a r\\baz", 0, 0, S_OK
, "file:///f%20oo/b?a r\\baz"},
95 {"file:///foo/b#a r\\baz", 0, 0, S_OK
, "file:///foo/b%23a%20r/baz"},
96 {"file:///f o^&`{}|][\"<>\\%o/b#a r\\baz", 0, 0, S_OK
, "file:///f%20o%5E%26%60%7B%7D%7C%5D%5B%22%3C%3E/%o/b%23a%20r/baz"},
97 {"file:///f o%o/b?a r\\b%az", URL_ESCAPE_PERCENT
, 0, S_OK
, "file:///f%20o%25o/b?a r\\b%az"},
98 {"file:/foo/bar\\baz", URL_ESCAPE_SEGMENT_ONLY
, 0, S_OK
, "file:%2Ffoo%2Fbar%5Cbaz"},
100 {"foo/b%ar\\ba?z\\", URL_ESCAPE_SEGMENT_ONLY
, 0, S_OK
, "foo%2Fb%ar%5Cba%3Fz%5C"},
101 {"foo/b%ar\\ba?z\\", URL_ESCAPE_PERCENT
| URL_ESCAPE_SEGMENT_ONLY
, 0, S_OK
, "foo%2Fb%25ar%5Cba%3Fz%5C"},
102 {"foo/bar\\ba?z\\", 0, 0, S_OK
, "foo/bar%5Cba?z\\"},
103 {"/foo/bar\\ba?z\\", 0, 0, S_OK
, "/foo/bar%5Cba?z\\"},
104 {"/foo/bar\\ba#z\\", 0, 0, S_OK
, "/foo/bar%5Cba#z\\"},
105 {"/foo/%5C", 0, 0, S_OK
, "/foo/%5C"},
106 {"/foo/%5C", URL_ESCAPE_PERCENT
, 0, S_OK
, "/foo/%255C"},
108 {"http://////foo/bar\\baz", 0, 0, S_OK
, "http://////foo/bar/baz"},
109 {"http://///foo/bar\\baz", 0, 0, S_OK
, "http://///foo/bar/baz"},
110 {"http:////foo/bar\\baz", 0, 0, S_OK
, "http:////foo/bar/baz"},
111 {"http:///foo/bar\\baz", 0, 0, S_OK
, "http:///foo/bar/baz"},
112 {"http://localhost/foo/bar\\baz", 0, 0, S_OK
, "http://localhost/foo/bar/baz"},
113 {"http://foo/bar\\baz", 0, 0, S_OK
, "http://foo/bar/baz"},
114 {"http:/foo/bar\\baz", 0, 0, S_OK
, "http:/foo/bar/baz"},
115 {"http:foo/bar\\ba?z\\", 0, 0, S_OK
, "http:foo%2Fbar%2Fba?z\\"},
116 {"http:foo/bar\\ba#z\\", 0, 0, S_OK
, "http:foo%2Fbar%2Fba#z\\"},
117 {"http:\\foo/bar\\baz", 0, 0, S_OK
, "http:/foo/bar/baz"},
118 {"http:\\\\foo/bar\\baz", 0, 0, S_OK
, "http://foo/bar/baz"},
119 {"http:\\\\\\foo/bar\\baz", 0, 0, S_OK
, "http:///foo/bar/baz"},
120 {"http:\\\\\\\\foo/bar\\baz", 0, 0, S_OK
, "http:////foo/bar/baz"},
121 {"http:/fo ?o/b ar\\baz", 0, 0, S_OK
, "http:/fo%20?o/b ar\\baz"},
122 {"http:fo ?o/b ar\\baz", 0, 0, S_OK
, "http:fo%20?o/b ar\\baz"},
123 {"http:/foo/bar\\baz", URL_ESCAPE_SEGMENT_ONLY
, 0, S_OK
, "http:%2Ffoo%2Fbar%5Cbaz"},
125 {"https://foo/bar\\baz", 0, 0, S_OK
, "https://foo/bar/baz"},
126 {"https:/foo/bar\\baz", 0, 0, S_OK
, "https:/foo/bar/baz"},
127 {"https:\\foo/bar\\baz", 0, 0, S_OK
, "https:/foo/bar/baz"},
129 {"foo:////foo/bar\\baz", 0, 0, S_OK
, "foo:////foo/bar%5Cbaz"},
130 {"foo:///foo/bar\\baz", 0, 0, S_OK
, "foo:///foo/bar%5Cbaz"},
131 {"foo://localhost/foo/bar\\baz", 0, 0, S_OK
, "foo://localhost/foo/bar%5Cbaz"},
132 {"foo://foo/bar\\baz", 0, 0, S_OK
, "foo://foo/bar%5Cbaz"},
133 {"foo:/foo/bar\\baz", 0, 0, S_OK
, "foo:/foo/bar%5Cbaz"},
134 {"foo:foo/bar\\baz", 0, 0, S_OK
, "foo:foo%2Fbar%5Cbaz"},
135 {"foo:\\foo/bar\\baz", 0, 0, S_OK
, "foo:%5Cfoo%2Fbar%5Cbaz"},
136 {"foo:/foo/bar\\ba?\\z", 0, 0, S_OK
, "foo:/foo/bar%5Cba?\\z"},
137 {"foo:/foo/bar\\ba#\\z", 0, 0, S_OK
, "foo:/foo/bar%5Cba#\\z"},
139 {"mailto:/fo/o@b\\%a?\\r.b#\\az", 0, 0, S_OK
, "mailto:%2Ffo%2Fo@b%5C%a%3F%5Cr.b%23%5Caz"},
140 {"mailto:fo/o@b\\%a?\\r.b#\\az", 0, 0, S_OK
, "mailto:fo%2Fo@b%5C%a%3F%5Cr.b%23%5Caz"},
141 {"mailto:fo/o@b\\%a?\\r.b#\\az", URL_ESCAPE_PERCENT
, 0, S_OK
, "mailto:fo%2Fo@b%5C%25a%3F%5Cr.b%23%5Caz"},
143 {"ftp:fo/o@bar.baz/foo/bar", 0, 0, S_OK
, "ftp:fo%2Fo@bar.baz%2Ffoo%2Fbar"},
144 {"ftp:/fo/o@bar.baz/foo/bar", 0, 0, S_OK
, "ftp:/fo/o@bar.baz/foo/bar"},
145 {"ftp://fo/o@bar.baz/fo?o\\bar", 0, 0, S_OK
, "ftp://fo/o@bar.baz/fo?o\\bar"},
146 {"ftp://fo/o@bar.baz/fo#o\\bar", 0, 0, S_OK
, "ftp://fo/o@bar.baz/fo#o\\bar"},
147 {"ftp://localhost/o@bar.baz/fo#o\\bar", 0, 0, S_OK
, "ftp://localhost/o@bar.baz/fo#o\\bar"},
148 {"ftp:///fo/o@bar.baz/foo/bar", 0, 0, S_OK
, "ftp:///fo/o@bar.baz/foo/bar"},
149 {"ftp:////fo/o@bar.baz/foo/bar", 0, 0, S_OK
, "ftp:////fo/o@bar.baz/foo/bar"}
152 typedef struct _TEST_URL_COMBINE
{
160 const TEST_URL_COMBINE TEST_COMBINE
[] = {
161 {"http://www.winehq.org/tests", "tests1", 0, S_OK
, "http://www.winehq.org/tests1"},
162 /*FIXME {"http://www.winehq.org/tests", "../tests2", 0, S_OK, "http://www.winehq.org/tests2"},*/
163 {"http://www.winehq.org/tests/", "../tests3", 0, S_OK
, "http://www.winehq.org/tests3"},
164 {"http://www.winehq.org/tests/../tests", "tests4", 0, S_OK
, "http://www.winehq.org/tests4"},
165 {"http://www.winehq.org/tests/../tests/", "tests5", 0, S_OK
, "http://www.winehq.org/tests/tests5"},
166 {"http://www.winehq.org/tests/../tests/", "/tests6/..", 0, S_OK
, "http://www.winehq.org/"},
167 {"http://www.winehq.org/tests/../tests/..", "tests7/..", 0, S_OK
, "http://www.winehq.org/"},
168 {"http://www.winehq.org/tests/?query=x&return=y", "tests8", 0, S_OK
, "http://www.winehq.org/tests/tests8"},
169 {"http://www.winehq.org/tests/#example", "tests9", 0, S_OK
, "http://www.winehq.org/tests/tests9"},
170 {"http://www.winehq.org/tests/../tests/", "/tests10/..", URL_DONT_SIMPLIFY
, S_OK
, "http://www.winehq.org/tests10/.."},
171 {"http://www.winehq.org/tests/../", "tests11", URL_DONT_SIMPLIFY
, S_OK
, "http://www.winehq.org/tests/../tests11"},
178 } TEST_URLFROMPATH
[] = {
179 {"foo", "file:foo", S_OK
},
180 {"foo\\bar", "file:foo/bar", S_OK
},
181 {"\\foo\\bar", "file:///foo/bar", S_OK
},
182 {"c:\\foo\\bar", "file:///c:/foo/bar", S_OK
},
183 {"c:foo\\bar", "file:///c:foo/bar", S_OK
},
184 {"c:\\foo/b a%r", "file:///c:/foo/b%20a%25r", S_OK
},
186 {"xx:c:\\foo\\bar", "xx:c:\\foo\\bar", S_FALSE
}
193 } TEST_PATHFROMURL
[] = {
194 {"file:///c:/foo/ba%5Cr", "c:\\foo\\ba\\r", S_OK
},
195 {"file:///c:/foo/../ba%5Cr", "c:\\foo\\..\\ba\\r", S_OK
},
196 {"file:///host/c:/foo/bar", "\\host\\c:\\foo\\bar", S_OK
},
197 {"file://host/c:/foo/bar", "\\\\hostc:\\foo\\bar", S_OK
},
198 {"file://host/c:/foo/bar", "\\\\hostc:\\foo\\bar", S_OK
},
199 {"file:\\\\host\\c:\\foo\\bar", "\\\\hostc:\\foo\\bar", S_OK
},
200 {"file:\\\\host\\ca\\foo\\bar", "\\\\host\\ca\\foo\\bar", S_OK
},
201 {"file:\\\\host\\c|\\foo\\bar", "\\\\hostc|\\foo\\bar", S_OK
},
202 {"file:\\%5Chost\\c:\\foo\\bar", "\\\\host\\c:\\foo\\bar", S_OK
},
203 {"file:\\\\host\\cx:\\foo\\bar", "\\\\host\\cx:\\foo\\bar", S_OK
},
204 {"file://c:/foo/bar", "c:\\foo\\bar", S_OK
},
205 {"file://c:/d:/foo/bar", "c:\\d:\\foo\\bar", S_OK
},
206 {"file://c|/d|/foo/bar", "c:\\d|\\foo\\bar", S_OK
},
207 {"file://host/foo/bar", "\\\\host\\foo\\bar", S_OK
},
208 {"file:/foo/bar", "\\foo\\bar", S_OK
},
209 {"file:/foo/bar/", "\\foo\\bar\\", S_OK
},
210 {"file:foo/bar", "foo\\bar", S_OK
},
211 {"file:c:/foo/bar", "c:\\foo\\bar", S_OK
},
212 {"file:c|/foo/bar", "c:\\foo\\bar", S_OK
},
213 {"file:cx|/foo/bar", "cx|\\foo\\bar", S_OK
},
214 {"file:////c:/foo/bar", "c:\\foo\\bar", S_OK
},
216 {"c:\\foo\\bar", NULL
, E_INVALIDARG
},
217 {"foo/bar", NULL
, E_INVALIDARG
},
218 {"http://foo/bar", NULL
, E_INVALIDARG
},
225 } TEST_URL_UNESCAPE
[] = {
226 {"file://foo/bar", "file://foo/bar"},
227 {"file://fo%20o%5Ca/bar", "file://fo o\\a/bar"}
234 } TEST_PATH_IS_URL
[] = {
235 {"http://foo/bar", TRUE
},
236 {"c:\\foo\\bar", FALSE
},
237 {"foo://foo/bar", TRUE
},
241 static LPWSTR
GetWideString(const char* szString
)
243 LPWSTR wszString
= (LPWSTR
) HeapAlloc(GetProcessHeap(), 0,
244 (2*INTERNET_MAX_URL_LENGTH
) * sizeof(WCHAR
));
246 MultiByteToWideChar(0, 0, szString
, -1, wszString
, INTERNET_MAX_URL_LENGTH
);
251 static void FreeWideString(LPWSTR wszString
)
253 HeapFree(GetProcessHeap(), 0, wszString
);
256 static void hash_url(const char* szUrl
)
258 LPCSTR szTestUrl
= szUrl
;
259 LPWSTR wszTestUrl
= GetWideString(szTestUrl
);
261 DWORD cbSize
= sizeof(DWORD
);
262 DWORD dwHash1
, dwHash2
;
263 ok(UrlHashA(szTestUrl
, (LPBYTE
)&dwHash1
, cbSize
) == S_OK
, "UrlHashA didn't return S_OK\n");
264 ok(UrlHashW(wszTestUrl
, (LPBYTE
)&dwHash2
, cbSize
) == S_OK
, "UrlHashW didn't return S_OK\n");
266 FreeWideString(wszTestUrl
);
268 ok(dwHash1
== dwHash2
, "Hashes didn't compare\n");
271 static void test_UrlHash(void)
273 hash_url(TEST_URL_1
);
274 hash_url(TEST_URL_2
);
275 hash_url(TEST_URL_3
);
278 static void test_url_part(const char* szUrl
, DWORD dwPart
, DWORD dwFlags
, const char* szExpected
)
280 CHAR szPart
[INTERNET_MAX_URL_LENGTH
];
281 WCHAR wszPart
[INTERNET_MAX_URL_LENGTH
];
282 LPWSTR wszUrl
= GetWideString(szUrl
);
283 LPWSTR wszConvertedPart
;
287 dwSize
= INTERNET_MAX_URL_LENGTH
;
288 ok( UrlGetPartA(szUrl
, szPart
, &dwSize
, dwPart
, dwFlags
) == S_OK
, "UrlGetPartA for \"%s\" part 0x%08lx didn't return S_OK but \"%s\"\n", szUrl
, dwPart
, szPart
);
289 dwSize
= INTERNET_MAX_URL_LENGTH
;
290 ok( UrlGetPartW(wszUrl
, wszPart
, &dwSize
, dwPart
, dwFlags
) == S_OK
, "UrlGetPartW didn't return S_OK\n" );
292 wszConvertedPart
= GetWideString(szPart
);
294 ok(strcmpW(wszPart
,wszConvertedPart
)==0, "Strings didn't match between ascii and unicode UrlGetPart!\n");
296 FreeWideString(wszUrl
);
297 FreeWideString(wszConvertedPart
);
299 /* Note that v6.0 and later don't return '?' with the query */
300 ok(strcmp(szPart
,szExpected
)==0 ||
301 (*szExpected
=='?' && !strcmp(szPart
,szExpected
+1)),
302 "Expected %s, but got %s\n", szExpected
, szPart
);
305 static void test_UrlGetPart(void)
307 test_url_part(TEST_URL_3
, URL_PART_HOSTNAME
, 0, "localhost");
308 test_url_part(TEST_URL_3
, URL_PART_PORT
, 0, "21");
309 test_url_part(TEST_URL_3
, URL_PART_USERNAME
, 0, "foo");
310 test_url_part(TEST_URL_3
, URL_PART_PASSWORD
, 0, "bar");
311 test_url_part(TEST_URL_3
, URL_PART_SCHEME
, 0, "http");
312 test_url_part(TEST_URL_3
, URL_PART_QUERY
, 0, "?query=x&return=y");
315 static void test_url_escape(const char *szUrl
, DWORD dwFlags
, HRESULT dwExpectReturn
, const char *szExpectUrl
)
317 CHAR szReturnUrl
[INTERNET_MAX_URL_LENGTH
];
319 WCHAR ret_urlW
[INTERNET_MAX_URL_LENGTH
];
320 WCHAR
*urlW
, *expected_urlW
;
321 dwEscaped
=INTERNET_MAX_URL_LENGTH
;
323 ok(UrlEscapeA(szUrl
, szReturnUrl
, &dwEscaped
, dwFlags
) == dwExpectReturn
, "UrlEscapeA didn't return 0x%08lx from \"%s\"\n", dwExpectReturn
, szUrl
);
324 ok(strcmp(szReturnUrl
,szExpectUrl
)==0, "Expected \"%s\", but got \"%s\" from \"%s\"\n", szExpectUrl
, szReturnUrl
, szUrl
);
326 dwEscaped
= INTERNET_MAX_URL_LENGTH
;
327 urlW
= GetWideString(szUrl
);
328 expected_urlW
= GetWideString(szExpectUrl
);
329 ok(UrlEscapeW(urlW
, ret_urlW
, &dwEscaped
, dwFlags
) == dwExpectReturn
, "UrlEscapeW didn't return 0x%08lx from \"%s\"\n", dwExpectReturn
, szUrl
);
330 WideCharToMultiByte(CP_ACP
,0,ret_urlW
,-1,szReturnUrl
,INTERNET_MAX_URL_LENGTH
,0,0);
331 ok(strcmpW(ret_urlW
, expected_urlW
)==0, "Expected \"%s\", but got \"%s\" from \"%s\" flags %08lx\n", szExpectUrl
, szReturnUrl
, szUrl
, dwFlags
);
332 FreeWideString(urlW
);
333 FreeWideString(expected_urlW
);
337 static void test_url_canonicalize(const char *szUrl
, DWORD dwFlags
, HRESULT dwExpectReturn
, const char *szExpectUrl
)
339 CHAR szReturnUrl
[INTERNET_MAX_URL_LENGTH
];
340 WCHAR wszReturnUrl
[INTERNET_MAX_URL_LENGTH
];
341 LPWSTR wszUrl
= GetWideString(szUrl
);
342 LPWSTR wszExpectUrl
= GetWideString(szExpectUrl
);
343 LPWSTR wszConvertedUrl
;
347 dwSize
= INTERNET_MAX_URL_LENGTH
;
348 ok(UrlCanonicalizeA(szUrl
, szReturnUrl
, &dwSize
, dwFlags
) == dwExpectReturn
, "UrlCanonicalizeA didn't return 0x%08lx\n", dwExpectReturn
);
349 ok(strcmp(szReturnUrl
,szExpectUrl
)==0, "Expected %s, but got %s\n", szExpectUrl
, szReturnUrl
);
351 dwSize
= INTERNET_MAX_URL_LENGTH
;
352 ok(UrlCanonicalizeW(wszUrl
, wszReturnUrl
, &dwSize
, dwFlags
) == dwExpectReturn
, "UrlCanonicalizeW didn't return 0x%08lx\n", dwExpectReturn
);
353 wszConvertedUrl
= GetWideString(szReturnUrl
);
354 ok(strcmpW(wszReturnUrl
, wszConvertedUrl
)==0, "Strings didn't match between ascii and unicode UrlCanonicalize!\n");
355 FreeWideString(wszConvertedUrl
);
358 FreeWideString(wszUrl
);
359 FreeWideString(wszExpectUrl
);
363 static void test_UrlEscape(void)
366 for(i
=0; i
<sizeof(TEST_ESCAPE
)/sizeof(TEST_ESCAPE
[0]); i
++) {
367 test_url_escape(TEST_ESCAPE
[i
].url
, TEST_ESCAPE
[i
].flags
,
368 TEST_ESCAPE
[i
].expectret
, TEST_ESCAPE
[i
].expecturl
);
372 static void test_UrlCanonicalize(void)
375 for(i
=0; i
<sizeof(TEST_CANONICALIZE
)/sizeof(TEST_CANONICALIZE
[0]); i
++) {
376 test_url_canonicalize(TEST_CANONICALIZE
[i
].url
, TEST_CANONICALIZE
[i
].flags
,
377 TEST_CANONICALIZE
[i
].expectret
, TEST_CANONICALIZE
[i
].expecturl
);
381 static void test_url_combine(const char *szUrl1
, const char *szUrl2
, DWORD dwFlags
, HRESULT dwExpectReturn
, const char *szExpectUrl
)
384 CHAR szReturnUrl
[INTERNET_MAX_URL_LENGTH
];
385 WCHAR wszReturnUrl
[INTERNET_MAX_URL_LENGTH
];
386 LPWSTR wszUrl1
= GetWideString(szUrl1
);
387 LPWSTR wszUrl2
= GetWideString(szUrl2
);
388 LPWSTR wszExpectUrl
= GetWideString(szExpectUrl
);
389 LPWSTR wszConvertedUrl
;
392 DWORD dwExpectLen
= lstrlen(szExpectUrl
);
394 hr
= UrlCombineA(szUrl1
, szUrl2
, NULL
, NULL
, dwFlags
);
395 ok(hr
== E_INVALIDARG
, "UrlCombineA returned 0x%08lx, expected 0x%08lx\n", hr
, E_INVALIDARG
);
398 hr
= UrlCombineA(szUrl1
, szUrl2
, NULL
, &dwSize
, dwFlags
);
399 ok(hr
== E_POINTER
, "Checking length of string, return was 0x%08lx, expected 0x%08lx\n", hr
, E_POINTER
);
400 ok(dwSize
== dwExpectLen
+1, "Got length %ld, expected %ld\n", dwSize
, dwExpectLen
+1);
403 hr
= UrlCombineA(szUrl1
, szUrl2
, szReturnUrl
, &dwSize
, dwFlags
);
404 ok(hr
== E_POINTER
, "UrlCombineA returned 0x%08lx, expected 0x%08lx\n", hr
, E_POINTER
);
405 ok(dwSize
== dwExpectLen
+1, "Got length %ld, expected %ld\n", dwSize
, dwExpectLen
+1);
407 hr
= UrlCombineA(szUrl1
, szUrl2
, szReturnUrl
, &dwSize
, dwFlags
);
408 ok(hr
== dwExpectReturn
, "UrlCombineA returned 0x%08lx, expected 0x%08lx\n", hr
, dwExpectReturn
);
409 ok(dwSize
== dwExpectLen
, "Got length %ld, expected %ld\n", dwSize
, dwExpectLen
);
411 ok(strcmp(szReturnUrl
,szExpectUrl
)==0, "Expected %s, but got %s\n", szExpectUrl
, szReturnUrl
);
415 hr
= UrlCombineW(wszUrl1
, wszUrl2
, NULL
, &dwSize
, dwFlags
);
416 ok(hr
== E_POINTER
, "Checking length of string, return was 0x%08lx, expected 0x%08lx\n", hr
, E_POINTER
);
417 ok(dwSize
== dwExpectLen
+1, "Got length %ld, expected %ld\n", dwSize
, dwExpectLen
+1);
420 hr
= UrlCombineW(wszUrl1
, wszUrl2
, wszReturnUrl
, &dwSize
, dwFlags
);
421 ok(hr
== E_POINTER
, "UrlCombineA returned 0x%08lx, expected 0x%08lx\n", hr
, E_POINTER
);
422 ok(dwSize
== dwExpectLen
+1, "Got length %ld, expected %ld\n", dwSize
, dwExpectLen
+1);
424 hr
= UrlCombineW(wszUrl1
, wszUrl2
, wszReturnUrl
, &dwSize
, dwFlags
);
425 ok(hr
== dwExpectReturn
, "UrlCombineW returned 0x%08lx, expected 0x%08lx\n", hr
, dwExpectReturn
);
426 ok(dwSize
== dwExpectLen
, "Got length %ld, expected %ld\n", dwSize
, dwExpectLen
);
428 wszConvertedUrl
= GetWideString(szReturnUrl
);
429 ok(strcmpW(wszReturnUrl
, wszConvertedUrl
)==0, "Strings didn't match between ascii and unicode UrlCombine!\n");
430 FreeWideString(wszConvertedUrl
);
433 FreeWideString(wszUrl1
);
434 FreeWideString(wszUrl2
);
435 FreeWideString(wszExpectUrl
);
438 static void test_UrlCombine(void)
441 for(i
=0; i
<sizeof(TEST_COMBINE
)/sizeof(TEST_COMBINE
[0]); i
++) {
442 test_url_combine(TEST_COMBINE
[i
].url1
, TEST_COMBINE
[i
].url2
, TEST_COMBINE
[i
].flags
,
443 TEST_COMBINE
[i
].expectret
, TEST_COMBINE
[i
].expecturl
);
447 static void test_UrlCreateFromPath(void)
450 char ret_url
[INTERNET_MAX_URL_LENGTH
];
452 WCHAR ret_urlW
[INTERNET_MAX_URL_LENGTH
];
455 for(i
= 0; i
< sizeof(TEST_URLFROMPATH
) / sizeof(TEST_URLFROMPATH
[0]); i
++) {
456 len
= INTERNET_MAX_URL_LENGTH
;
457 ret
= UrlCreateFromPathA(TEST_URLFROMPATH
[i
].path
, ret_url
, &len
, 0);
458 ok(ret
== TEST_URLFROMPATH
[i
].ret
, "ret %08lx from path %s\n", ret
, TEST_URLFROMPATH
[i
].path
);
459 ok(!lstrcmpi(ret_url
, TEST_URLFROMPATH
[i
].url
), "url %s from path %s\n", ret_url
, TEST_URLFROMPATH
[i
].path
);
460 ok(len
== strlen(ret_url
), "ret len %ld from path %s\n", len
, TEST_URLFROMPATH
[i
].path
);
462 len
= INTERNET_MAX_URL_LENGTH
;
463 pathW
= GetWideString(TEST_URLFROMPATH
[i
].path
);
464 urlW
= GetWideString(TEST_URLFROMPATH
[i
].url
);
465 ret
= UrlCreateFromPathW(pathW
, ret_urlW
, &len
, 0);
466 WideCharToMultiByte(CP_ACP
, 0, ret_urlW
, -1, ret_url
, sizeof(ret_url
),0,0);
467 ok(ret
== TEST_URLFROMPATH
[i
].ret
, "ret %08lx from path L\"%s\"\n", ret
, TEST_URLFROMPATH
[i
].path
);
468 ok(!lstrcmpiW(ret_urlW
, urlW
), "got %s expected %s from path L\"%s\"\n", ret_url
, TEST_URLFROMPATH
[i
].url
, TEST_URLFROMPATH
[i
].path
);
469 ok(len
== strlenW(ret_urlW
), "ret len %ld from path L\"%s\"\n", len
, TEST_URLFROMPATH
[i
].path
);
470 FreeWideString(urlW
);
471 FreeWideString(pathW
);
475 static void test_UrlUnescape(void)
477 CHAR szReturnUrl
[INTERNET_MAX_URL_LENGTH
];
478 WCHAR ret_urlW
[INTERNET_MAX_URL_LENGTH
];
479 WCHAR
*urlW
, *expected_urlW
;
483 for(i
=0; i
<sizeof(TEST_URL_UNESCAPE
)/sizeof(TEST_URL_UNESCAPE
[0]); i
++) {
484 dwEscaped
=INTERNET_MAX_URL_LENGTH
;
485 ok(UrlUnescapeA(TEST_URL_UNESCAPE
[i
].url
, szReturnUrl
, &dwEscaped
, 0) == S_OK
, "UrlEscapeA didn't return 0x%08lx from \"%s\"\n", S_OK
, TEST_URL_UNESCAPE
[i
].url
);
486 ok(strcmp(szReturnUrl
,TEST_URL_UNESCAPE
[i
].expect
)==0, "Expected \"%s\", but got \"%s\" from \"%s\"\n", TEST_URL_UNESCAPE
[i
].expect
, szReturnUrl
, TEST_URL_UNESCAPE
[i
].url
);
488 dwEscaped
= INTERNET_MAX_URL_LENGTH
;
489 urlW
= GetWideString(TEST_URL_UNESCAPE
[i
].url
);
490 expected_urlW
= GetWideString(TEST_URL_UNESCAPE
[i
].expect
);
491 ok(UrlUnescapeW(urlW
, ret_urlW
, &dwEscaped
, 0) == S_OK
, "UrlEscapeW didn't return 0x%08lx from \"%s\"\n", S_OK
, TEST_URL_UNESCAPE
[i
].url
);
492 WideCharToMultiByte(CP_ACP
,0,ret_urlW
,-1,szReturnUrl
,INTERNET_MAX_URL_LENGTH
,0,0);
493 ok(strcmpW(ret_urlW
, expected_urlW
)==0, "Expected \"%s\", but got \"%s\" from \"%s\" flags %08lx\n", TEST_URL_UNESCAPE
[i
].expect
, szReturnUrl
, TEST_URL_UNESCAPE
[i
].url
, 0L);
494 FreeWideString(urlW
);
495 FreeWideString(expected_urlW
);
500 static void test_PathSearchAndQualify(void)
502 WCHAR path1
[] = {'c',':','\\','f','o','o',0};
503 WCHAR expect1
[] = {'c',':','\\','f','o','o',0};
504 WCHAR path2
[] = {'c',':','f','o','o',0};
505 WCHAR c_drive
[] = {'c',':',0};
506 WCHAR foo
[] = {'f','o','o',0};
507 WCHAR path3
[] = {'\\','f','o','o',0};
508 WCHAR winini
[] = {'w','i','n','.','i','n','i',0};
510 WCHAR cur_dir
[MAX_PATH
];
511 WCHAR dot
[] = {'.',0};
514 ok(PathSearchAndQualifyW(path1
, out
, MAX_PATH
) != 0,
515 "PathSearchAndQualify rets 0\n");
516 ok(!lstrcmpiW(out
, expect1
), "strings don't match\n");
519 ok(PathSearchAndQualifyW(path2
, out
, MAX_PATH
) != 0,
520 "PathSearchAndQualify rets 0\n");
521 GetFullPathNameW(c_drive
, MAX_PATH
, cur_dir
, NULL
);
522 PathAddBackslashW(cur_dir
);
523 strcatW(cur_dir
, foo
);
524 ok(!lstrcmpiW(out
, cur_dir
), "strings don't match\n");
527 ok(PathSearchAndQualifyW(foo
, out
, MAX_PATH
) != 0,
528 "PathSearchAndQualify rets 0\n");
529 GetFullPathNameW(dot
, MAX_PATH
, cur_dir
, NULL
);
530 PathAddBackslashW(cur_dir
);
531 strcatW(cur_dir
, foo
);
532 ok(!lstrcmpiW(out
, cur_dir
), "strings don't match\n");
535 ok(PathSearchAndQualifyW(path3
, out
, MAX_PATH
) != 0,
536 "PathSearchAndQualify rets 0\n");
537 GetFullPathNameW(dot
, MAX_PATH
, cur_dir
, NULL
);
538 strcpyW(cur_dir
+ 2, path3
);
539 ok(!lstrcmpiW(out
, cur_dir
), "strings don't match\n");
542 ok(PathSearchAndQualifyW(winini
, out
, MAX_PATH
) != 0,
543 "PathSearchAndQualify rets 0\n");
544 if(!SearchPathW(NULL
, winini
, NULL
, MAX_PATH
, cur_dir
, NULL
))
545 GetFullPathNameW(winini
, MAX_PATH
, cur_dir
, NULL
);
546 ok(!lstrcmpiW(out
, cur_dir
), "strings don't match\n");
550 static void test_PathCreateFromUrl(void)
553 char ret_path
[INTERNET_MAX_URL_LENGTH
];
555 WCHAR ret_pathW
[INTERNET_MAX_URL_LENGTH
];
558 for(i
= 0; i
< sizeof(TEST_PATHFROMURL
) / sizeof(TEST_PATHFROMURL
[0]); i
++) {
559 len
= INTERNET_MAX_URL_LENGTH
;
560 ret
= PathCreateFromUrlA(TEST_PATHFROMURL
[i
].url
, ret_path
, &len
, 0);
561 ok(ret
== TEST_PATHFROMURL
[i
].ret
, "ret %08lx from url %s\n", ret
, TEST_PATHFROMURL
[i
].url
);
562 if(TEST_PATHFROMURL
[i
].path
) {
563 ok(!lstrcmpi(ret_path
, TEST_PATHFROMURL
[i
].path
), "got %s expected %s from url %s\n", ret_path
, TEST_PATHFROMURL
[i
].path
, TEST_PATHFROMURL
[i
].url
);
564 ok(len
== strlen(ret_path
), "ret len %ld from url %s\n", len
, TEST_PATHFROMURL
[i
].url
);
566 len
= INTERNET_MAX_URL_LENGTH
;
567 pathW
= GetWideString(TEST_PATHFROMURL
[i
].path
);
568 urlW
= GetWideString(TEST_PATHFROMURL
[i
].url
);
569 ret
= PathCreateFromUrlW(urlW
, ret_pathW
, &len
, 0);
570 WideCharToMultiByte(CP_ACP
, 0, ret_pathW
, -1, ret_path
, sizeof(ret_path
),0,0);
571 ok(ret
== TEST_PATHFROMURL
[i
].ret
, "ret %08lx from url L\"%s\"\n", ret
, TEST_PATHFROMURL
[i
].url
);
572 if(TEST_PATHFROMURL
[i
].path
) {
573 ok(!lstrcmpiW(ret_pathW
, pathW
), "got %s expected %s from url L\"%s\"\n", ret_path
, TEST_PATHFROMURL
[i
].path
, TEST_PATHFROMURL
[i
].url
);
574 ok(len
== strlenW(ret_pathW
), "ret len %ld from url L\"%s\"\n", len
, TEST_PATHFROMURL
[i
].url
);
576 FreeWideString(urlW
);
577 FreeWideString(pathW
);
582 static void test_PathIsUrl(void)
587 for(i
= 0; i
< sizeof(TEST_PATH_IS_URL
)/sizeof(TEST_PATH_IS_URL
[0]); i
++) {
588 ret
= PathIsURLA(TEST_PATH_IS_URL
[i
].path
);
589 ok(ret
== TEST_PATH_IS_URL
[i
].expect
,
590 "returned %d from path %s, expected %d\n", ret
, TEST_PATH_IS_URL
[i
].path
,
591 TEST_PATH_IS_URL
[i
].expect
);
599 test_UrlCanonicalize();
602 test_UrlCreateFromPath();
605 test_PathSearchAndQualify();
606 test_PathCreateFromUrl();