[PATCH v2 4/5] shlwapi/tests: Put the UrlGetPart() tests in a table.

Zebediah Figura zfigura at codeweavers.com
Thu Feb 10 11:02:19 CST 2022


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/shlwapi/tests/url.c | 285 +++++++++++++++++----------------------
 1 file changed, 120 insertions(+), 165 deletions(-)

diff --git a/dlls/shlwapi/tests/url.c b/dlls/shlwapi/tests/url.c
index b2a1bd609c4..29926ae736b 100644
--- a/dlls/shlwapi/tests/url.c
+++ b/dlls/shlwapi/tests/url.c
@@ -32,7 +32,6 @@
 static const char* TEST_URL_1 = "http://www.winehq.org/tests?date=10/10/1923";
 static const char* TEST_URL_2 = "http://localhost:8080/tests%2e.html?date=Mon%2010/10/1923";
 static const char* TEST_URL_3 = "http://foo:bar@localhost:21/internal.php?query=x&return=y";
-static const char* TEST_URL_4 = "http://foo:bar@google.*.com:21/internal.php?query=x&return=y";
 
 static const WCHAR winehqW[] = L"http://www.winehq.org/";
 static const char winehqA[] = "http://www.winehq.org/";
@@ -582,185 +581,141 @@ static void test_UrlHash(void)
   hash_url(TEST_URL_3);
 }
 
-/* ########################### */
-
-static void test_url_part(const char* szUrl, DWORD dwPart, DWORD dwFlags, const char* szExpected)
-{
-  CHAR szPart[INTERNET_MAX_URL_LENGTH];
-  WCHAR wszPart[INTERNET_MAX_URL_LENGTH];
-  LPWSTR wszUrl = GetWideString(szUrl);
-  LPWSTR wszConvertedPart;
-  HRESULT res;
-  DWORD dwSize;
-
-  dwSize = 1;
-  res = UrlGetPartA(szUrl, szPart, &dwSize, dwPart, dwFlags);
-  ok(res == E_POINTER, "UrlGetPart for \"%s\" gave: 0x%08x\n", szUrl, res);
-  todo_wine_if (dwPart == URL_PART_QUERY)
-  ok(dwSize == strlen(szExpected) + 1,
-          "UrlGetPart for \"%s\" gave size: %u\n", szUrl, dwSize);
-
-  dwSize = INTERNET_MAX_URL_LENGTH;
-  res = UrlGetPartA(szUrl, szPart, &dwSize, dwPart, dwFlags);
-  ok(res == S_OK,
-    "UrlGetPartA for \"%s\" part 0x%08x returned 0x%x and \"%s\"\n",
-    szUrl, dwPart, res, szPart);
-
-  dwSize = INTERNET_MAX_URL_LENGTH;
-  res = UrlGetPartW(wszUrl, wszPart, &dwSize, dwPart, dwFlags);
-  ok(res == S_OK,
-    "UrlGetPartW for \"%s\" part 0x%08x returned 0x%x\n",
-    szUrl, dwPart, res);
-
-  wszConvertedPart = GetWideString(szPart);
-
-  ok(lstrcmpW(wszPart,wszConvertedPart)==0,
-      "Strings didn't match between ansi and unicode UrlGetPart!\n");
-
-  FreeWideString(wszConvertedPart);
-  FreeWideString(wszUrl);
-
-  todo_wine_if (dwPart == URL_PART_QUERY)
-  ok(!strcmp(szPart,szExpected),
-	 "Expected %s, but got %s\n", szExpected, szPart);
-}
-
-/* ########################### */
-
 static void test_UrlGetPart(void)
 {
-  const char* file_url = "file://h o s t/c:/windows/file";
-  const char* http_url = "http://user:pass 123 at www.wine hq.org";
-  const char* res_url = "res://some.dll/find.dlg";
-  const char* about_url = "about:blank";
-  const char* excid_url = "x-excid://36C00000/guid:{048B4E89-2E92-496F-A837-33BA02FF6D32}/Message.htm";
-  const char* foo_url = "foo://bar-url/test";
-  const char* short_url = "ascheme:";
+    WCHAR bufferW[200];
+    char buffer[200];
+    unsigned int i;
+    HRESULT hr;
+    DWORD size;
 
-  CHAR szPart[INTERNET_MAX_URL_LENGTH];
-  WCHAR bufW[5];
-  DWORD dwSize;
-  HRESULT res;
+    static const struct
+    {
+        const char *url;
+        DWORD part;
+        DWORD flags;
+        HRESULT hr;
+        const char *expect;
+    }
+    tests[] =
+    {
+        {"hi", URL_PART_SCHEME, 0, S_FALSE, ""},
+        {"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@google.*.com:21/internal.php?query=x&return=y", URL_PART_HOSTNAME, 0, S_OK, "google.*.com"},
+        {"file://h o s t/c:/windows/file", URL_PART_HOSTNAME, 0, S_OK, "h o s t"},
+        {"http://user:pass 123 at www.wine hq.org", URL_PART_HOSTNAME, 0, S_OK, "www.wine hq.org"},
+        {"http://user:pass 123 at www.wine hq.org", URL_PART_PASSWORD, 0, S_OK, "pass 123"},
+        {"about:blank", URL_PART_SCHEME, 0, S_OK, "about"},
+        {"about:blank", URL_PART_HOSTNAME, 0, E_FAIL},
+        {"x-excid://36C00000/guid:{048B4E89-2E92-496F-A837-33BA02FF6D32}/Message.htm", URL_PART_SCHEME, 0, S_OK, "x-excid"},
+        {"x-excid://36C00000/guid:{048B4E89-2E92-496F-A837-33BA02FF6D32}/Message.htm", URL_PART_HOSTNAME, 0, E_FAIL},
+        {"x-excid://36C00000/guid:{048B4E89-2E92-496F-A837-33BA02FF6D32}/Message.htm", URL_PART_QUERY, 0, S_FALSE, ""},
+        {"foo://bar-url/test", URL_PART_SCHEME, 0, S_OK, "foo"},
+        {"foo://bar-url/test", URL_PART_HOSTNAME, 0, E_FAIL},
+        {"foo://bar-url/test", URL_PART_QUERY, 0, S_FALSE, ""},
+        {"ascheme:", URL_PART_SCHEME, 0, S_OK, "ascheme"},
+        {"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://c:\\index.htm", URL_PART_HOSTNAME, 0, S_FALSE, ""},
+        {"file:some text", URL_PART_HOSTNAME, 0, S_FALSE, ""},
+        {"index.htm", URL_PART_HOSTNAME, 0, E_FAIL},
+    };
 
-  res = UrlGetPartA(NULL, NULL, NULL, URL_PART_SCHEME, 0);
-  ok(res == E_INVALIDARG, "null params gave: 0x%08x\n", res);
+    hr = UrlGetPartA(NULL, NULL, NULL, URL_PART_SCHEME, 0);
+    ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
 
-  res = UrlGetPartA(NULL, szPart, &dwSize, URL_PART_SCHEME, 0);
-  ok(res == E_INVALIDARG, "null URL gave: 0x%08x\n", res);
+    hr = UrlGetPartA(NULL, buffer, &size, URL_PART_SCHEME, 0);
+    ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
 
-  res = UrlGetPartA(res_url, NULL, &dwSize, URL_PART_SCHEME, 0);
-  ok(res == E_INVALIDARG, "null szPart gave: 0x%08x\n", res);
+    hr = UrlGetPartA("res://some.dll/find.dlg", NULL, &size, URL_PART_SCHEME, 0);
+    ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
 
-  res = UrlGetPartA(res_url, szPart, NULL, URL_PART_SCHEME, 0);
-  ok(res == E_INVALIDARG, "null URL gave: 0x%08x\n", res);
+    hr = UrlGetPartA("res://some.dll/find.dlg", buffer, NULL, URL_PART_SCHEME, 0);
+    ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
 
-  dwSize = 0;
-  szPart[0]='x'; szPart[1]=0;
-  res = UrlGetPartA("hi", szPart, &dwSize, URL_PART_SCHEME, 0);
-  ok(res == E_INVALIDARG, "UrlGetPartA(*pcchOut = 0) returned %08X\n", res);
-  ok(szPart[0] == 'x' && szPart[1] == 0, "UrlGetPartA(*pcchOut = 0) modified szPart: \"%s\"\n", szPart);
-  ok(dwSize == 0, "dwSize = %d\n", dwSize);
+    size = 0;
+    strcpy(buffer, "x");
+    hr = UrlGetPartA("hi", buffer, &size, URL_PART_SCHEME, 0);
+    ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+    ok(!strcmp(buffer, "x"), "Got result %s.\n", debugstr_a(buffer));
+    ok(!size, "Got size %u.\n", size);
 
-  dwSize = sizeof szPart;
-  szPart[0]='x'; szPart[1]=0;
-  res = UrlGetPartA("hi", szPart, &dwSize, URL_PART_SCHEME, 0);
-  ok (res==S_FALSE, "UrlGetPartA(\"hi\") returned %08X\n", res);
-  ok(szPart[0]==0, "UrlGetPartA(\"hi\") return \"%s\" instead of \"\"\n", szPart);
-  ok(dwSize == 0, "dwSize = %d\n", dwSize);
+    for (i = 0; i < ARRAY_SIZE(tests); ++i)
+    {
+        WCHAR urlW[200], expectW[200];
+        const char *expect = tests[i].expect;
+        const char *url = tests[i].url;
+        DWORD flags = tests[i].flags;
+        DWORD part = tests[i].part;
 
-  /* UrlGetPartW returns S_OK instead of S_FALSE */
-  dwSize = sizeof szPart;
-  bufW[0]='x'; bufW[1]=0;
-  res = UrlGetPartW(L"hi", bufW, &dwSize, URL_PART_SCHEME, 0);
-  todo_wine ok(res==S_OK, "UrlGetPartW(\"hi\") returned %08X\n", res);
-  ok(bufW[0] == 0, "UrlGetPartW(\"hi\") return \"%c\"\n", bufW[0]);
-  ok(dwSize == 0, "dwSize = %d\n", dwSize);
+        winetest_push_context("URL %s, part %#x, flags %#x", debugstr_a(url), part, flags);
 
-  dwSize = sizeof szPart;
-  szPart[0]='x'; szPart[1]=0;
-  res = UrlGetPartA("hi", szPart, &dwSize, URL_PART_QUERY, 0);
-  ok (res==S_FALSE, "UrlGetPartA(\"hi\") returned %08X\n", res);
-  ok(szPart[0]==0, "UrlGetPartA(\"hi\") return \"%s\" instead of \"\"\n", szPart);
-  ok(dwSize == 0, "dwSize = %d\n", dwSize);
+        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);
 
-  test_url_part(TEST_URL_3, URL_PART_HOSTNAME, 0, "localhost");
-  test_url_part(TEST_URL_3, URL_PART_PORT, 0, "21");
-  test_url_part(TEST_URL_3, URL_PART_USERNAME, 0, "foo");
-  test_url_part(TEST_URL_3, URL_PART_PASSWORD, 0, "bar");
-  test_url_part(TEST_URL_3, URL_PART_SCHEME, 0, "http");
-  test_url_part(TEST_URL_3, URL_PART_QUERY, 0, "query=x&return=y");
+        if (hr == S_FALSE)
+        {
+            ok(!size, "Got size %u.\n", size);
+            ok(!buffer[0], "Got result %s.\n", debugstr_a(buffer));
+        }
+        else
+        {
+            if (hr == E_POINTER)
+                todo_wine_if (part == URL_PART_QUERY && expect[0])
+                    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));
+        }
 
-  test_url_part(TEST_URL_4, URL_PART_HOSTNAME, 0, "google.*.com");
+        size = sizeof(buffer);
+        strcpy(buffer, "x");
+        hr = UrlGetPartA(url, buffer, &size, part, flags);
+        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));
+        }
+        else
+        {
+            ok(size == sizeof(buffer), "Got size %u.\n", size);
+            ok(!strcmp(buffer, "x"), "Got result %s.\n", debugstr_a(buffer));
+        }
 
-  test_url_part(file_url, URL_PART_HOSTNAME, 0, "h o s t");
+        MultiByteToWideChar(CP_ACP, 0, url, -1, urlW, ARRAY_SIZE(urlW));
+        size = ARRAY_SIZE(bufferW);
+        wcscpy(bufferW, L"x");
+        hr = UrlGetPartW(urlW, bufferW, &size, part, flags);
+        todo_wine_if (tests[i].hr == S_FALSE)
+            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));
+        }
+        else
+        {
+            todo_wine ok(size == ARRAY_SIZE(bufferW), "Got size %u.\n", size);
+            todo_wine ok(!wcscmp(bufferW, L"x"), "Got result %s.\n", debugstr_w(bufferW));
+        }
 
-  test_url_part(http_url, URL_PART_HOSTNAME, 0, "www.wine hq.org");
-  test_url_part(http_url, URL_PART_PASSWORD, 0, "pass 123");
-
-  test_url_part(about_url, URL_PART_SCHEME, 0, "about");
-
-  test_url_part(excid_url, URL_PART_SCHEME, 0, "x-excid");
-  test_url_part(foo_url, URL_PART_SCHEME, 0, "foo");
-  test_url_part(short_url, URL_PART_SCHEME, 0, "ascheme");
-
-  dwSize = sizeof(szPart);
-  res = UrlGetPartA(about_url, szPart, &dwSize, URL_PART_HOSTNAME, 0);
-  ok(res==E_FAIL, "returned %08x\n", res);
-
-  test_url_part(res_url, URL_PART_SCHEME, 0, "res");
-  test_url_part("http://www.winehq.org", URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME, "http:www.winehq.org");
-
-  dwSize = sizeof szPart;
-  szPart[0]='x'; szPart[1]=0;
-  res = UrlGetPartA(res_url, szPart, &dwSize, URL_PART_QUERY, 0);
-  ok(res==S_FALSE, "UrlGetPartA returned %08X\n", res);
-  ok(szPart[0]==0, "UrlGetPartA gave \"%s\" instead of \"\"\n", szPart);
-  ok(dwSize == 0, "dwSize = %d\n", dwSize);
-
-  dwSize = sizeof(szPart);
-  res = UrlGetPartA("file://c:\\index.htm", szPart, &dwSize, URL_PART_HOSTNAME, 0);
-  ok(res==S_FALSE, "returned %08x\n", res);
-  ok(dwSize == 0, "dwSize = %d\n", dwSize);
-
-  dwSize = sizeof(szPart);
-  szPart[0] = 'x'; szPart[1] = '\0';
-  res = UrlGetPartA("file:some text", szPart, &dwSize, URL_PART_HOSTNAME, 0);
-  ok(res==S_FALSE, "returned %08x\n", res);
-  ok(szPart[0] == '\0', "szPart[0] = %c\n", szPart[0]);
-  ok(dwSize == 0, "dwSize = %d\n", dwSize);
-
-  dwSize = sizeof(szPart);
-  szPart[0] = 'x'; szPart[1] = '\0';
-  res = UrlGetPartA("index.htm", szPart, &dwSize, URL_PART_HOSTNAME, 0);
-  ok(res==E_FAIL, "returned %08x\n", res);
-
-  dwSize = sizeof(szPart);
-  szPart[0] = 'x'; szPart[1] = '\0';
-  res = UrlGetPartA(excid_url, szPart, &dwSize, URL_PART_HOSTNAME, 0);
-  ok(res==E_FAIL, "returned %08x\n", res);
-  ok(szPart[0] == 'x', "szPart[0] = %c\n", szPart[0]);
-  ok(dwSize == sizeof(szPart), "dwSize = %d\n", dwSize);
-
-  dwSize = sizeof(szPart);
-  szPart[0] = 'x'; szPart[1] = '\0';
-  res = UrlGetPartA(excid_url, szPart, &dwSize, URL_PART_QUERY, 0);
-  ok(res==S_FALSE, "returned %08x\n", res);
-  ok(szPart[0] == 0, "szPart[0] = %c\n", szPart[0]);
-  ok(dwSize == 0, "dwSize = %d\n", dwSize);
-
-  dwSize = sizeof(szPart);
-  szPart[0] = 'x'; szPart[1] = '\0';
-  res = UrlGetPartA(foo_url, szPart, &dwSize, URL_PART_HOSTNAME, 0);
-  ok(res==E_FAIL, "returned %08x\n", res);
-  ok(szPart[0] == 'x', "szPart[0] = %c\n", szPart[0]);
-  ok(dwSize == sizeof(szPart), "dwSize = %d\n", dwSize);
-
-  dwSize = sizeof(szPart);
-  szPart[0] = 'x'; szPart[1] = '\0';
-  res = UrlGetPartA(foo_url, szPart, &dwSize, URL_PART_QUERY, 0);
-  ok(res==S_FALSE, "returned %08x\n", res);
-  ok(szPart[0] == 0, "szPart[0] = %c\n", szPart[0]);
-  ok(dwSize == 0, "dwSize = %d\n", dwSize);
+        winetest_pop_context();
+    }
 }
 
 /* ########################### */
-- 
2.34.1




More information about the wine-devel mailing list