shlwapi/tests: Add more tests for UrlGetPart().

Signed-off-by: Zebediah Figura <zfigura@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2022-02-10 23:36:42 -06:00 committed by Alexandre Julliard
parent c2ab120cb0
commit 4410f102d5
1 changed files with 189 additions and 14 deletions

View File

@ -596,19 +596,99 @@ static void test_UrlGetPart(void)
DWORD flags;
HRESULT hr;
const char *expect;
BOOL todo_hr, todo_result;
}
tests[] =
{
{"hi", URL_PART_SCHEME, 0, S_FALSE, ""},
{"hi", URL_PART_USERNAME, 0, E_FAIL, .todo_hr = TRUE},
{"hi", URL_PART_PASSWORD, 0, E_FAIL, .todo_hr = TRUE},
{"hi", URL_PART_HOSTNAME, 0, E_FAIL},
{"hi", URL_PART_PORT, 0, E_FAIL, .todo_hr = TRUE},
{"hi", URL_PART_QUERY, 0, S_FALSE, ""},
{"http://foo:bar@localhost:21/internal.php?query=x&return=y", URL_PART_SCHEME, 0, S_OK, "http"},
{"http://foo:bar@localhost:21/internal.php?query=x&return=y", URL_PART_USERNAME, 0, S_OK, "foo"},
{"http://foo:bar@localhost:21/internal.php?query=x&return=y", URL_PART_PASSWORD, 0, S_OK, "bar"},
{"http://foo:bar@localhost:21/internal.php?query=x&return=y", URL_PART_HOSTNAME, 0, S_OK, "localhost"},
{"http://foo:bar@localhost:21/internal.php?query=x&return=y", URL_PART_PORT, 0, S_OK, "21"},
{"http://foo:bar@localhost:21/internal.php?query=x&return=y", URL_PART_QUERY, 0, S_OK, "query=x&return=y"},
{"http://foo:bar@localhost:21/internal.php?query=x&return=y", URL_PART_QUERY, 0, S_OK, "query=x&return=y", .todo_result = TRUE},
{"http://foo:bar@localhost:21/internal.php#anchor", URL_PART_QUERY, 0, S_FALSE, ""},
{"http://foo:bar@localhost:21/internal.php?query=x&return=y", URL_PART_SCHEME, URL_PARTFLAG_KEEPSCHEME, S_OK, "http", .todo_result = TRUE},
{"http://foo:bar@localhost:21/internal.php?query=x&return=y", URL_PART_USERNAME, URL_PARTFLAG_KEEPSCHEME, S_OK, "http:foo"},
{"http://foo:bar@localhost:21/internal.php?query=x&return=y", URL_PART_PASSWORD, URL_PARTFLAG_KEEPSCHEME, S_OK, "http:bar"},
{"http://foo:bar@localhost:21/internal.php?query=x&return=y", URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME, S_OK, "http:localhost"},
{"http://foo:bar@localhost:21/internal.php?query=x&return=y", URL_PART_PORT, URL_PARTFLAG_KEEPSCHEME, S_OK, "http:21"},
{"http://foo:bar@localhost:21/internal.php?query=x&return=y", URL_PART_QUERY, URL_PARTFLAG_KEEPSCHEME, S_OK, "query=x&return=y", .todo_result = TRUE},
{"http://localhost/", URL_PART_USERNAME, 0, E_INVALIDARG, .todo_hr = TRUE},
{"http://localhost/", URL_PART_PASSWORD, 0, E_INVALIDARG, .todo_hr = TRUE},
{"http://localhost/", URL_PART_HOSTNAME, 0, S_OK, "localhost"},
{"http://localhost/", URL_PART_PORT, 0, E_INVALIDARG, .todo_hr = TRUE},
{"http://localhost/", URL_PART_QUERY, 0, S_FALSE, ""},
{"http://localhost:port/", URL_PART_USERNAME, 0, E_INVALIDARG, .todo_hr = TRUE},
{"http://localhost:port/", URL_PART_PASSWORD, 0, E_INVALIDARG, .todo_hr = TRUE},
{"http://localhost:port/", URL_PART_HOSTNAME, 0, S_OK, "localhost"},
{"http://localhost:port/", URL_PART_PORT, 0, S_OK, "port", .todo_hr = TRUE},
{"http://:", URL_PART_HOSTNAME, 0, S_FALSE, ""},
{"http://:", URL_PART_PORT, 0, S_FALSE, ""},
{"http://user@localhost", URL_PART_USERNAME, 0, S_OK, "user"},
{"http://user@localhost", URL_PART_PASSWORD, 0, E_INVALIDARG, .todo_hr = TRUE},
{"http://user@localhost", URL_PART_HOSTNAME, 0, S_OK, "localhost"},
{"http://user@localhost", URL_PART_PORT, 0, E_INVALIDARG, .todo_hr = TRUE},
{"http://@", URL_PART_USERNAME, 0, S_FALSE, ""},
{"http://@", URL_PART_PASSWORD, 0, E_INVALIDARG, .todo_hr = TRUE},
{"http://@", URL_PART_HOSTNAME, 0, S_FALSE, ""},
{"http://user:pass@localhost", URL_PART_USERNAME, 0, S_OK, "user"},
{"http://user:pass@localhost", URL_PART_PASSWORD, 0, S_OK, "pass"},
{"http://user:pass@localhost", URL_PART_HOSTNAME, 0, S_OK, "localhost"},
{"http://user:pass@localhost", URL_PART_PORT, 0, E_INVALIDARG, .todo_hr = TRUE},
{"http://:@", URL_PART_USERNAME, 0, S_FALSE, ""},
{"http://:@", URL_PART_PASSWORD, 0, S_FALSE, ""},
{"http://:@", URL_PART_HOSTNAME, 0, S_FALSE, ""},
{"http://host:port:q", URL_PART_HOSTNAME, 0, S_OK, "host"},
{"http://host:port:q", URL_PART_PORT, 0, S_OK, "port:q", .todo_hr = TRUE},
{"http://user:pass:q@host", URL_PART_USERNAME, 0, S_OK, "user", .todo_hr = TRUE},
{"http://user:pass:q@host", URL_PART_PASSWORD, 0, S_OK, "pass:q", .todo_hr = TRUE},
{"http://user@host@q", URL_PART_USERNAME, 0, S_OK, "user"},
{"http://user@host@q", URL_PART_HOSTNAME, 0, S_OK, "host@q", .todo_result = TRUE},
{"http:localhost/index.html", URL_PART_HOSTNAME, 0, E_FAIL, .todo_hr = TRUE},
{"http:/localhost/index.html", URL_PART_HOSTNAME, 0, E_FAIL, .todo_hr = TRUE},
{"http://localhost\\index.html", URL_PART_HOSTNAME, 0, S_OK, "localhost", .todo_hr = TRUE},
{"http:/\\localhost/index.html", URL_PART_HOSTNAME, 0, S_OK, "localhost", .todo_hr = TRUE},
{"http:\\/localhost/index.html", URL_PART_HOSTNAME, 0, S_OK, "localhost", .todo_hr = TRUE},
{"ftp://localhost\\index.html", URL_PART_HOSTNAME, 0, S_OK, "localhost", .todo_hr = TRUE},
{"ftp:/\\localhost/index.html", URL_PART_HOSTNAME, 0, S_OK, "localhost", .todo_hr = TRUE},
{"ftp:\\/localhost/index.html", URL_PART_HOSTNAME, 0, S_OK, "localhost", .todo_hr = TRUE},
{"http://host?a:b@c:d", URL_PART_HOSTNAME, 0, S_OK, "host", .todo_result = TRUE},
{"http://host?a:b@c:d", URL_PART_QUERY, 0, S_OK, "a:b@c:d", .todo_hr = TRUE},
{"http://host#a:b@c:d", URL_PART_HOSTNAME, 0, S_OK, "host", .todo_hr = TRUE},
{"http://host#a:b@c:d", URL_PART_QUERY, 0, S_FALSE, ""},
/* All characters, other than those with special meaning, are allowed. */
{"http://foo:bar@google.*.com:21/internal.php?query=x&return=y", URL_PART_HOSTNAME, 0, S_OK, "google.*.com"},
{"http:// !\"$%&'()*+,-.;<=>[]^_`{|~}\x01\x7f\xff:pass@host", URL_PART_USERNAME, 0, S_OK, " !\"$%&'()*+,-.;<=>[]^_`{|~}\x01\x7f\xff", .todo_hr = TRUE},
{"http://user: !\"$%&'()*+,-.;<=>[]^_`{|~}\x01\x7f\xff@host", URL_PART_PASSWORD, 0, S_OK, " !\"$%&'()*+,-.;<=>[]^_`{|~}\x01\x7f\xff", .todo_hr = TRUE},
{"http:// !\"$%&'()*+,-.;<=>[]^_`{|~}\x01\x7f\xff", URL_PART_HOSTNAME, 0, S_OK, " !\"$%&'()*+,-.;<=>[]^_`{|~}\x01\x7f\xff", .todo_hr = TRUE},
{"http://host: !\"$%&'()*+,-.;<=>[]^_`{|~}\x01\x7f\xff", URL_PART_PORT, 0, S_OK, " !\"$%&'()*+,-.;<=>[]^_`{|~}\x01\x7f\xff", .todo_hr = TRUE},
{"http:///index.html", URL_PART_HOSTNAME, 0, S_FALSE, ""},
{"http:///index.html", URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME, S_OK, "http:", .todo_hr = TRUE},
{"file://h o s t/c:/windows/file", URL_PART_HOSTNAME, 0, S_OK, "h o s t"},
{"file://h o s t/c:/windows/file", URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME, S_OK, "h o s t", .todo_result = TRUE},
{"file://foo:bar@localhost:21/file?query=x", URL_PART_USERNAME, 0, E_FAIL, .todo_hr = TRUE},
{"file://foo:bar@localhost:21/file?query=x", URL_PART_PASSWORD, 0, E_FAIL, .todo_hr = TRUE},
{"file://foo:bar@localhost:21/file?query=x", URL_PART_HOSTNAME, 0, S_OK, "foo:bar@localhost:21", .todo_result = TRUE},
{"file://foo:bar@localhost:21/file?query=x", URL_PART_PORT, 0, E_FAIL, .todo_hr = TRUE},
{"file://foo:bar@localhost:21/file?query=x", URL_PART_QUERY, 0, S_OK, "query=x", .todo_result = TRUE},
{"http://user:pass 123@www.wine hq.org", URL_PART_HOSTNAME, 0, S_OK, "www.wine hq.org"},
{"http://user:pass 123@www.wine hq.org", URL_PART_PASSWORD, 0, S_OK, "pass 123"},
{"about:blank", URL_PART_SCHEME, 0, S_OK, "about"},
@ -623,11 +703,53 @@ static void test_UrlGetPart(void)
{"res://some.dll/find.dlg", URL_PART_SCHEME, 0, S_OK, "res"},
{"res://some.dll/find.dlg", URL_PART_QUERY, 0, S_FALSE, ""},
{"http://www.winehq.org", URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME, S_OK, "http:www.winehq.org"},
{"file:///index.html", URL_PART_HOSTNAME, 0, S_FALSE, ""},
{"file:///index.html", URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME, S_FALSE, ""},
{"file://c:\\index.htm", URL_PART_HOSTNAME, 0, S_FALSE, ""},
{"file://c:\\index.htm", URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME, S_FALSE, ""},
{"file:some text", URL_PART_HOSTNAME, 0, S_FALSE, ""},
{"index.htm", URL_PART_HOSTNAME, 0, E_FAIL},
{"sChEmE-.+:", URL_PART_SCHEME, 0, S_OK, "scheme-.+", .todo_hr = TRUE},
{"scheme_:", URL_PART_SCHEME, 0, S_FALSE, ""},
{"scheme :", URL_PART_SCHEME, 0, S_FALSE, ""},
{"sch eme:", URL_PART_SCHEME, 0, S_FALSE, ""},
{":", URL_PART_SCHEME, 0, S_FALSE, ""},
{"a:", URL_PART_SCHEME, 0, S_FALSE, "", .todo_hr = TRUE},
{"0:", URL_PART_SCHEME, 0, S_FALSE, "", .todo_hr = TRUE},
{"ab:", URL_PART_SCHEME, 0, S_OK, "ab"},
{"about://hostname/", URL_PART_HOSTNAME, 0, E_FAIL},
{"file://hostname/", URL_PART_HOSTNAME, 0, S_OK, "hostname"},
{"ftp://hostname/", URL_PART_HOSTNAME, 0, S_OK, "hostname"},
{"gopher://hostname/", URL_PART_HOSTNAME, 0, S_OK, "hostname"},
{"http://hostname/", URL_PART_HOSTNAME, 0, S_OK, "hostname"},
{"https://hostname/", URL_PART_HOSTNAME, 0, S_OK, "hostname"},
{"javascript://hostname/", URL_PART_HOSTNAME, 0, E_FAIL},
{"local://hostname/", URL_PART_HOSTNAME, 0, E_FAIL},
{"mailto://hostname/", URL_PART_HOSTNAME, 0, E_FAIL},
{"mk://hostname/", URL_PART_HOSTNAME, 0, E_FAIL},
{"news://hostname/", URL_PART_HOSTNAME, 0, S_OK, "hostname", .todo_hr = TRUE},
{"nntp://hostname/", URL_PART_HOSTNAME, 0, S_OK, "hostname", .todo_hr = TRUE},
{"res://hostname/", URL_PART_HOSTNAME, 0, E_FAIL},
{"shell://hostname/", URL_PART_HOSTNAME, 0, E_FAIL},
{"snews://hostname/", URL_PART_HOSTNAME, 0, S_OK, "hostname", .todo_hr = TRUE},
{"telnet://hostname/", URL_PART_HOSTNAME, 0, S_OK, "hostname"},
{"vbscript://hostname/", URL_PART_HOSTNAME, 0, E_FAIL},
{"wais://hostname/", URL_PART_HOSTNAME, 0, E_FAIL},
{"file://hostname/", URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME, S_OK, "hostname", .todo_result = TRUE},
{"ftp://hostname/", URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME, S_OK, "ftp:hostname"},
{"gopher://hostname/", URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME, S_OK, "gopher:hostname"},
{"http://hostname/", URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME, S_OK, "http:hostname"},
{"https://hostname/", URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME, S_OK, "https:hostname"},
{"news://hostname/", URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME, S_OK, "news:hostname", .todo_hr = TRUE},
{"nntp://hostname/", URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME, S_OK, "nntp:hostname", .todo_hr = TRUE},
{"snews://hostname/", URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME, S_OK, "snews:hostname", .todo_hr = TRUE},
{"telnet://hostname/", URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME, S_OK, "telnet:hostname"},
};
winetest_mute_threshold = 5;
hr = UrlGetPartA(NULL, NULL, NULL, URL_PART_SCHEME, 0);
ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
@ -660,10 +782,13 @@ static void test_UrlGetPart(void)
size = 1;
strcpy(buffer, "x");
hr = UrlGetPartA(url, buffer, &size, part, flags);
if (tests[i].hr == S_OK)
ok(hr == E_POINTER, "Got hr %#x.\n", hr);
else
ok(hr == tests[i].hr, "Got hr %#x.\n", hr);
todo_wine_if (tests[i].todo_hr || !strcmp(url, "http://host?a:b@c:d"))
{
if (tests[i].hr == S_OK)
ok(hr == E_POINTER, "Got hr %#x.\n", hr);
else
ok(hr == tests[i].hr, "Got hr %#x.\n", hr);
}
if (hr == S_FALSE)
{
@ -673,22 +798,35 @@ static void test_UrlGetPart(void)
else
{
if (hr == E_POINTER)
todo_wine_if (part == URL_PART_QUERY && expect[0])
ok(size == strlen(expect) + 1, "Got size %u.\n", size);
{
if (expect)
{
todo_wine_if (tests[i].todo_hr || tests[i].todo_result)
ok(size == strlen(expect) + 1, "Got size %u.\n", size);
}
}
else
ok(size == 1, "Got size %u.\n", size);
ok(!strcmp(buffer, "x"), "Got result %s.\n", debugstr_a(buffer));
{
todo_wine_if (hr == S_OK)
ok(size == 1, "Got size %u.\n", size);
}
todo_wine_if (hr == S_OK)
ok(!strcmp(buffer, "x"), "Got result %s.\n", debugstr_a(buffer));
}
size = sizeof(buffer);
strcpy(buffer, "x");
hr = UrlGetPartA(url, buffer, &size, part, flags);
ok(hr == tests[i].hr, "Got hr %#x.\n", hr);
todo_wine_if (tests[i].todo_hr)
ok(hr == tests[i].hr, "Got hr %#x.\n", hr);
if (SUCCEEDED(hr))
{
ok(size == strlen(buffer), "Got size %u.\n", size);
todo_wine_if (part == URL_PART_QUERY && expect[0])
ok(!strcmp(buffer, expect), "Got result %s.\n", debugstr_a(buffer));
if (expect)
{
todo_wine_if (tests[i].todo_hr || tests[i].todo_result)
ok(!strcmp(buffer, expect), "Got result %s.\n", debugstr_a(buffer));
}
}
else
{
@ -697,16 +835,51 @@ static void test_UrlGetPart(void)
}
MultiByteToWideChar(CP_ACP, 0, url, -1, urlW, ARRAY_SIZE(urlW));
size = 1;
wcscpy(bufferW, L"x");
hr = UrlGetPartW(urlW, bufferW, &size, part, flags);
todo_wine_if ((tests[i].todo_hr || tests[i].hr == S_FALSE) && !(strchr(url, '"') && part == URL_PART_USERNAME))
{
if (tests[i].hr == S_OK)
ok(hr == E_POINTER, "Got hr %#x.\n", hr);
else
ok(hr == (tests[i].hr == S_FALSE ? S_OK : tests[i].hr), "Got hr %#x.\n", hr);
}
if (hr == S_OK)
{
ok(!size, "Got size %u.\n", size);
ok(!buffer[0], "Got result %s.\n", debugstr_a(buffer));
}
else
{
if (hr == E_POINTER)
{
if (expect)
{
todo_wine_if (tests[i].todo_hr || tests[i].todo_result)
ok(size == strlen(expect) + 1, "Got size %u.\n", size);
}
}
else
{
todo_wine ok(size == 1, "Got size %u.\n", size);
}
todo_wine ok(!wcscmp(bufferW, L"x"), "Got result %s.\n", debugstr_w(bufferW));
}
size = ARRAY_SIZE(bufferW);
wcscpy(bufferW, L"x");
hr = UrlGetPartW(urlW, bufferW, &size, part, flags);
todo_wine_if (tests[i].hr == S_FALSE)
todo_wine_if ((tests[i].hr == S_FALSE || tests[i].todo_hr) && strcmp(url, "a:") && strcmp(url, "0:"))
ok(hr == (tests[i].hr == S_FALSE ? S_OK : tests[i].hr), "Got hr %#x.\n", hr);
if (SUCCEEDED(hr))
{
ok(size == wcslen(bufferW), "Got size %u.\n", size);
MultiByteToWideChar(CP_ACP, 0, buffer, -1, expectW, ARRAY_SIZE(expectW));
ok(!wcscmp(bufferW, expectW), "Got result %s.\n", debugstr_w(bufferW));
todo_wine_if (strstr(url, "news") || strstr(url, "nntp"))
ok(!wcscmp(bufferW, expectW), "Got result %s.\n", debugstr_w(bufferW));
}
else
{
@ -716,6 +889,8 @@ static void test_UrlGetPart(void)
winetest_pop_context();
}
winetest_mute_threshold = 42;
}
/* ########################### */