Zebediah Figura : ws2_32/tests: Add tests for WSAStartup().

Alexandre Julliard julliard at winehq.org
Tue Feb 1 15:21:33 CST 2022


Module: wine
Branch: master
Commit: 155449c5d1d8c12114b2cdda2855e28c158e271f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=155449c5d1d8c12114b2cdda2855e28c158e271f

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Tue Feb  1 00:20:46 2022 -0600

ws2_32/tests: Add tests for WSAStartup().

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ws2_32/tests/protocol.c | 99 ++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 95 insertions(+), 4 deletions(-)

diff --git a/dlls/ws2_32/tests/protocol.c b/dlls/ws2_32/tests/protocol.c
index 5597e3df854..a23cf51a8bd 100644
--- a/dlls/ws2_32/tests/protocol.c
+++ b/dlls/ws2_32/tests/protocol.c
@@ -2815,10 +2815,86 @@ static void test_WSCGetProviderPath(void)
     ok(len == 256, "Got unexpected len %d.\n", len);
 }
 
+static void test_startup(void)
+{
+    unsigned int i;
+    WSADATA data;
+    int ret;
+
+    static const struct
+    {
+        WORD version;
+        WORD ret_version;
+    }
+    tests[] =
+    {
+        {MAKEWORD(0, 0), MAKEWORD(2, 2)},
+        {MAKEWORD(0, 1), MAKEWORD(2, 2)},
+        {MAKEWORD(1, 0), MAKEWORD(1, 0)},
+        {MAKEWORD(1, 1), MAKEWORD(1, 1)},
+        {MAKEWORD(1, 2), MAKEWORD(1, 1)},
+        {MAKEWORD(1, 0xff), MAKEWORD(1, 1)},
+        {MAKEWORD(2, 0), MAKEWORD(2, 0)},
+        {MAKEWORD(2, 1), MAKEWORD(2, 1)},
+        {MAKEWORD(2, 2), MAKEWORD(2, 2)},
+        {MAKEWORD(2, 3), MAKEWORD(2, 2)},
+        {MAKEWORD(2, 0xff), MAKEWORD(2, 2)},
+        {MAKEWORD(3, 0), MAKEWORD(2, 2)},
+        {MAKEWORD(0xff, 0), MAKEWORD(2, 2)},
+    };
+
+    for (i = 0; i < ARRAY_SIZE(tests); ++i)
+    {
+        winetest_push_context("Version %#x", tests[i].version);
+
+        memset(&data, 0xcc, sizeof(data));
+        data.lpVendorInfo = (void *)0xdeadbeef;
+        ret = WSAStartup(tests[i].version, &data);
+        ok(ret == (LOBYTE(tests[i].version) ? 0 : WSAVERNOTSUPPORTED), "got %d\n", ret);
+        todo_wine_if (tests[i].version != tests[i].ret_version)
+            ok(data.wVersion == tests[i].ret_version, "got version %#x\n", data.wVersion);
+        if (!ret)
+        {
+            ret = WSAStartup(tests[i].version, &data);
+            ok(!ret, "got %d\n", ret);
+
+            WSASetLastError(0xdeadbeef);
+            ret = WSACleanup();
+            ok(!ret, "got %d\n", ret);
+            todo_wine ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
+
+            WSASetLastError(0xdeadbeef);
+            ret = WSACleanup();
+            ok(!ret, "got %d\n", ret);
+            todo_wine ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
+        }
+        ok(data.lpVendorInfo == (void *)0xdeadbeef, "got vendor info %p\n", data.lpVendorInfo);
+        todo_wine_if (ret)
+        {
+            ok(data.wHighVersion == 0x202, "got maximum version %#x\n", data.wHighVersion);
+            ok(!strcmp(data.szDescription, "WinSock 2.0"), "got description %s\n", debugstr_a(data.szDescription));
+            ok(!strcmp(data.szSystemStatus, "Running"), "got status %s\n", debugstr_a(data.szSystemStatus));
+        }
+        todo_wine ok(data.iMaxSockets == (LOBYTE(tests[i].version) == 1 ? 32767 : 0), "got maximum sockets %u\n", data.iMaxSockets);
+        todo_wine ok(data.iMaxUdpDg == (LOBYTE(tests[i].version) == 1 ? 65467 : 0), "got maximum datagram size %u\n", data.iMaxUdpDg);
+
+        WSASetLastError(0xdeadbeef);
+        ret = WSACleanup();
+        ok(ret == -1, "got %d\n", ret);
+        ok(WSAGetLastError() == WSANOTINITIALISED, "got error %u\n", WSAGetLastError());
+
+        ret = WSAStartup(tests[i].version, NULL);
+        todo_wine_if (LOBYTE(tests[i].version))
+            ok(ret == (LOBYTE(tests[i].version) ? WSAEFAULT : WSAVERNOTSUPPORTED), "got %d\n", ret);
+
+        winetest_pop_context();
+    }
+}
+
 START_TEST( protocol )
 {
     WSADATA data;
-    WORD version = MAKEWORD( 2, 2 );
+    int ret;
 
     pFreeAddrInfoExW = (void *)GetProcAddress(GetModuleHandleA("ws2_32"), "FreeAddrInfoExW");
     pGetAddrInfoExOverlappedResult = (void *)GetProcAddress(GetModuleHandleA("ws2_32"), "GetAddrInfoExOverlappedResult");
@@ -2830,7 +2906,8 @@ START_TEST( protocol )
     pInetPtonW = (void *)GetProcAddress(GetModuleHandleA("ws2_32"), "InetPtonW");
     pWSCGetProviderInfo = (void *)GetProcAddress(GetModuleHandleA("ws2_32"), "WSCGetProviderInfo");
 
-    if (WSAStartup( version, &data )) return;
+    ret = WSAStartup(0x202, &data);
+    ok(!ret, "got %d\n", ret);
 
     test_WSAEnumProtocolsA();
     test_WSAEnumProtocolsW();
@@ -2839,8 +2916,6 @@ START_TEST( protocol )
 
     test_getservbyname();
     test_WSALookupService();
-    test_WSAAsyncGetServByPort();
-    test_WSAAsyncGetServByName();
 
     test_inet_ntoa();
     test_inet_pton();
@@ -2862,4 +2937,20 @@ START_TEST( protocol )
     test_WSAEnumNameSpaceProvidersW();
     test_WSCGetProviderInfo();
     test_WSCGetProviderPath();
+
+    WSACleanup();
+
+    /* These tests are finnicky. If WSAStartup() is ever called with a
+     * version below 2.2, it causes getaddrinfo() to behave differently. */
+
+    test_startup();
+
+    /* And if WSAAsyncGetServBy*() is ever called, it somehow causes
+     * WSAStartup() to succeed with 0.1 instead of failing. */
+
+    ret = WSAStartup(0x202, &data);
+    ok(!ret, "got %d\n", ret);
+
+    test_WSAAsyncGetServByPort();
+    test_WSAAsyncGetServByName();
 }




More information about the wine-cvs mailing list