[PATCH 1/5] ws2_32/tests: Move address lookup tests to protocol.c.

Zebediah Figura z.figura12 at gmail.com
Wed Apr 28 16:26:30 CDT 2021


sock.c is huge. This doesn't bother some people, but I find that it can be
harder to navigate and slower to compile. Splitting it is tricky, but I think
there's a pretty natural divide between functions that operate on sockets
(e.g. bind, listen, recv, getsockname) and functions that don't (e.g.
get*info, inet_*, get*by*, WSC*).

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/ws2_32/tests/protocol.c | 809 ++++++++++++++++++++++++++++++++++-
 dlls/ws2_32/tests/sock.c     | 805 ----------------------------------
 2 files changed, 808 insertions(+), 806 deletions(-)

diff --git a/dlls/ws2_32/tests/protocol.c b/dlls/ws2_32/tests/protocol.c
index d6e454a5fbd..21b26d12aec 100644
--- a/dlls/ws2_32/tests/protocol.c
+++ b/dlls/ws2_32/tests/protocol.c
@@ -23,9 +23,18 @@
 #include <windef.h>
 #include <winbase.h>
 #include <winsock2.h>
+#include <ws2tcpip.h>
 
 #include "wine/test.h"
 
+static void (WINAPI *pFreeAddrInfoExW)(ADDRINFOEXW *ai);
+static int (WINAPI *pGetAddrInfoExW)(const WCHAR *name, const WCHAR *servname, DWORD namespace,
+        GUID *namespace_id, const ADDRINFOEXW *hints, ADDRINFOEXW **result,
+        struct timeval *timeout, OVERLAPPED *overlapped,
+        LPLOOKUPSERVICE_COMPLETION_ROUTINE completion_routine, HANDLE *handle);
+static int   (WINAPI *pGetAddrInfoExOverlappedResult)(OVERLAPPED *overlapped);
+static const char *(WINAPI *p_inet_ntop)(int family, void *addr, char *string, ULONG size);
+
 /* TCP and UDP over IP fixed set of service flags */
 #define TCPIP_SERVICE_FLAGS (XP1_GUARANTEED_DELIVERY \
                            | XP1_GUARANTEED_ORDER    \
@@ -290,15 +299,813 @@ static void test_getprotobynumber(void)
     }
 }
 
+/* Tests used in both getaddrinfo and GetAddrInfoW */
+static const struct addr_hint_tests
+{
+    int family, socktype, protocol;
+    DWORD error;
+}
+hinttests[] =
+{
+    {AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, 0},
+    {AF_UNSPEC, SOCK_STREAM, IPPROTO_UDP, 0},
+    {AF_UNSPEC, SOCK_STREAM, IPPROTO_IPV6,0},
+    {AF_UNSPEC, SOCK_DGRAM,  IPPROTO_TCP, 0},
+    {AF_UNSPEC, SOCK_DGRAM,  IPPROTO_UDP, 0},
+    {AF_UNSPEC, SOCK_DGRAM,  IPPROTO_IPV6,0},
+    {AF_INET,   SOCK_STREAM, IPPROTO_TCP, 0},
+    {AF_INET,   SOCK_STREAM, IPPROTO_UDP, 0},
+    {AF_INET,   SOCK_STREAM, IPPROTO_IPV6,0},
+    {AF_INET,   SOCK_DGRAM,  IPPROTO_TCP, 0},
+    {AF_INET,   SOCK_DGRAM,  IPPROTO_UDP, 0},
+    {AF_INET,   SOCK_DGRAM,  IPPROTO_IPV6,0},
+    {AF_UNSPEC, 0,           IPPROTO_TCP, 0},
+    {AF_UNSPEC, 0,           IPPROTO_UDP, 0},
+    {AF_UNSPEC, 0,           IPPROTO_IPV6,0},
+    {AF_UNSPEC, SOCK_STREAM, 0,           0},
+    {AF_UNSPEC, SOCK_DGRAM,  0,           0},
+    {AF_INET,   0,           IPPROTO_TCP, 0},
+    {AF_INET,   0,           IPPROTO_UDP, 0},
+    {AF_INET,   0,           IPPROTO_IPV6,0},
+    {AF_INET,   SOCK_STREAM, 0,           0},
+    {AF_INET,   SOCK_DGRAM,  0,           0},
+    {AF_UNSPEC, 999,         IPPROTO_TCP, WSAESOCKTNOSUPPORT},
+    {AF_UNSPEC, 999,         IPPROTO_UDP, WSAESOCKTNOSUPPORT},
+    {AF_UNSPEC, 999,         IPPROTO_IPV6,WSAESOCKTNOSUPPORT},
+    {AF_INET,   999,         IPPROTO_TCP, WSAESOCKTNOSUPPORT},
+    {AF_INET,   999,         IPPROTO_UDP, WSAESOCKTNOSUPPORT},
+    {AF_INET,   999,         IPPROTO_IPV6,WSAESOCKTNOSUPPORT},
+    {AF_UNSPEC, SOCK_STREAM, 999,         0},
+    {AF_UNSPEC, SOCK_STREAM, 999,         0},
+    {AF_INET,   SOCK_DGRAM,  999,         0},
+    {AF_INET,   SOCK_DGRAM,  999,         0},
+};
+
+static void compare_addrinfow(ADDRINFOW *a, ADDRINFOW *b)
+{
+    for (; a && b; a = a->ai_next, b = b->ai_next)
+    {
+        ok(a->ai_flags == b->ai_flags,
+           "Wrong flags %d != %d\n", a->ai_flags, b->ai_flags);
+        ok(a->ai_family == b->ai_family,
+           "Wrong family %d != %d\n", a->ai_family, b->ai_family);
+        ok(a->ai_socktype == b->ai_socktype,
+           "Wrong socktype %d != %d\n", a->ai_socktype, b->ai_socktype);
+        ok(a->ai_protocol == b->ai_protocol,
+           "Wrong protocol %d != %d\n", a->ai_protocol, b->ai_protocol);
+        ok(a->ai_addrlen == b->ai_addrlen,
+           "Wrong addrlen %lu != %lu\n", a->ai_addrlen, b->ai_addrlen);
+        ok(!memcmp(a->ai_addr, b->ai_addr, min(a->ai_addrlen, b->ai_addrlen)),
+           "Wrong address data\n");
+        if (a->ai_canonname && b->ai_canonname)
+        {
+            ok(!lstrcmpW(a->ai_canonname, b->ai_canonname), "Wrong canonical name '%s' != '%s'\n",
+               wine_dbgstr_w(a->ai_canonname), wine_dbgstr_w(b->ai_canonname));
+        }
+        else
+            ok(!a->ai_canonname && !b->ai_canonname, "Expected both names absent (%p != %p)\n",
+               a->ai_canonname, b->ai_canonname);
+    }
+    ok(!a && !b, "Expected both addresses null (%p != %p)\n", a, b);
+}
+
+static void test_GetAddrInfoW(void)
+{
+    static const WCHAR port[] = {'8','0',0};
+    static const WCHAR empty[] = {0};
+    static const WCHAR localhost[] = {'l','o','c','a','l','h','o','s','t',0};
+    static const WCHAR nxdomain[] =
+        {'n','x','d','o','m','a','i','n','.','c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0};
+    static const WCHAR zero[] = {'0',0};
+    int i, ret;
+    ADDRINFOW *result, *result2, *p, hint;
+    WCHAR name[256];
+    DWORD size = ARRAY_SIZE(name);
+    /* te su to.winehq.org written in katakana */
+    static const WCHAR idn_domain[] =
+        {0x30C6,0x30B9,0x30C8,'.','w','i','n','e','h','q','.','o','r','g',0};
+    static const WCHAR idn_punycode[] =
+        {'x','n','-','-','z','c','k','z','a','h','.','w','i','n','e','h','q','.','o','r','g',0};
+
+    memset(&hint, 0, sizeof(ADDRINFOW));
+    name[0] = 0;
+    GetComputerNameExW( ComputerNamePhysicalDnsHostname, name, &size );
+
+    result = (ADDRINFOW *)0xdeadbeef;
+    WSASetLastError(0xdeadbeef);
+    ret = GetAddrInfoW(NULL, NULL, NULL, &result);
+    ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
+    ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
+    ok(result == NULL, "got %p\n", result);
+
+    result = NULL;
+    WSASetLastError(0xdeadbeef);
+    ret = GetAddrInfoW(empty, NULL, NULL, &result);
+    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
+    ok(result != NULL, "GetAddrInfoW failed\n");
+    ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
+    FreeAddrInfoW(result);
+
+    result = NULL;
+    ret = GetAddrInfoW(NULL, zero, NULL, &result);
+    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
+    ok(result != NULL, "GetAddrInfoW failed\n");
+
+    result2 = NULL;
+    ret = GetAddrInfoW(NULL, empty, NULL, &result2);
+    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
+    ok(result2 != NULL, "GetAddrInfoW failed\n");
+    compare_addrinfow(result, result2);
+    FreeAddrInfoW(result);
+    FreeAddrInfoW(result2);
+
+    result = NULL;
+    ret = GetAddrInfoW(empty, zero, NULL, &result);
+    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
+    ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
+    ok(result != NULL, "GetAddrInfoW failed\n");
+
+    result2 = NULL;
+    ret = GetAddrInfoW(empty, empty, NULL, &result2);
+    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
+    ok(result2 != NULL, "GetAddrInfoW failed\n");
+    compare_addrinfow(result, result2);
+    FreeAddrInfoW(result);
+    FreeAddrInfoW(result2);
+
+    result = NULL;
+    ret = GetAddrInfoW(localhost, NULL, NULL, &result);
+    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
+    FreeAddrInfoW(result);
+
+    result = NULL;
+    ret = GetAddrInfoW(localhost, empty, NULL, &result);
+    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
+    FreeAddrInfoW(result);
+
+    result = NULL;
+    ret = GetAddrInfoW(localhost, zero, NULL, &result);
+    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
+    FreeAddrInfoW(result);
+
+    result = NULL;
+    ret = GetAddrInfoW(localhost, port, NULL, &result);
+    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
+    FreeAddrInfoW(result);
+
+    result = NULL;
+    ret = GetAddrInfoW(localhost, NULL, &hint, &result);
+    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
+    FreeAddrInfoW(result);
+
+    result = NULL;
+    SetLastError(0xdeadbeef);
+    ret = GetAddrInfoW(localhost, port, &hint, &result);
+    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
+    ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
+    FreeAddrInfoW(result);
+
+    /* try to get information from the computer name, result is the same
+     * as if requesting with an empty host name. */
+    ret = GetAddrInfoW(name, NULL, NULL, &result);
+    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
+    ok(result != NULL, "GetAddrInfoW failed\n");
+
+    ret = GetAddrInfoW(empty, NULL, NULL, &result2);
+    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
+    ok(result != NULL, "GetAddrInfoW failed\n");
+    compare_addrinfow(result, result2);
+    FreeAddrInfoW(result);
+    FreeAddrInfoW(result2);
+
+    ret = GetAddrInfoW(name, empty, NULL, &result);
+    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
+    ok(result != NULL, "GetAddrInfoW failed\n");
+
+    ret = GetAddrInfoW(empty, empty, NULL, &result2);
+    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
+    ok(result != NULL, "GetAddrInfoW failed\n");
+    compare_addrinfow(result, result2);
+    FreeAddrInfoW(result);
+    FreeAddrInfoW(result2);
+
+    result = (ADDRINFOW *)0xdeadbeef;
+    WSASetLastError(0xdeadbeef);
+    ret = GetAddrInfoW(NULL, NULL, NULL, &result);
+    if (ret == 0)
+    {
+        skip("nxdomain returned success. Broken ISP redirects?\n");
+        return;
+    }
+    ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
+    ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
+    ok(result == NULL, "got %p\n", result);
+
+    result = (ADDRINFOW *)0xdeadbeef;
+    WSASetLastError(0xdeadbeef);
+    ret = GetAddrInfoW(nxdomain, NULL, NULL, &result);
+    if (ret == 0)
+    {
+        skip("nxdomain returned success. Broken ISP redirects?\n");
+        return;
+    }
+    ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
+    ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
+    ok(result == NULL, "got %p\n", result);
+
+    for (i = 0; i < ARRAY_SIZE(hinttests); i++)
+    {
+        hint.ai_family = hinttests[i].family;
+        hint.ai_socktype = hinttests[i].socktype;
+        hint.ai_protocol = hinttests[i].protocol;
+
+        result = NULL;
+        SetLastError(0xdeadbeef);
+        ret = GetAddrInfoW(localhost, NULL, &hint, &result);
+        todo_wine_if (hinttests[i].error) ok(ret == hinttests[i].error, "test %d: wrong ret %d\n", i, ret);
+        if (!ret)
+        {
+            for (p = result; p; p = p->ai_next)
+            {
+                /* when AF_UNSPEC is used the return will be either AF_INET or AF_INET6 */
+                if (hinttests[i].family == AF_UNSPEC)
+                    ok(p->ai_family == AF_INET || p->ai_family == AF_INET6,
+                       "test %d: expected AF_INET or AF_INET6, got %d\n",
+                       i, p->ai_family);
+                else
+                    ok(p->ai_family == hinttests[i].family,
+                       "test %d: expected family %d, got %d\n",
+                       i, hinttests[i].family, p->ai_family);
+
+                ok(p->ai_socktype == hinttests[i].socktype,
+                   "test %d: expected type %d, got %d\n",
+                   i, hinttests[i].socktype, p->ai_socktype);
+                ok(p->ai_protocol == hinttests[i].protocol,
+                   "test %d: expected protocol %d, got %d\n",
+                   i, hinttests[i].protocol, p->ai_protocol);
+            }
+            FreeAddrInfoW(result);
+        }
+        else
+        {
+            ok(WSAGetLastError() == hinttests[i].error, "test %d: wrong error %d\n", i, WSAGetLastError());
+        }
+    }
+
+    /* Test IDN resolution (Internationalized Domain Names) present since Windows 8 */
+    result = NULL;
+    ret = GetAddrInfoW(idn_punycode, NULL, NULL, &result);
+    ok(!ret, "got %d expected success\n", ret);
+    ok(result != NULL, "got %p\n", result);
+    FreeAddrInfoW(result);
+
+    hint.ai_family = AF_INET;
+    hint.ai_socktype = 0;
+    hint.ai_protocol = 0;
+    hint.ai_flags = 0;
+
+    result = NULL;
+    ret = GetAddrInfoW(idn_punycode, NULL, &hint, &result);
+    ok(!ret, "got %d expected success\n", ret);
+    ok(result != NULL, "got %p\n", result);
+
+    result2 = NULL;
+    ret = GetAddrInfoW(idn_domain, NULL, NULL, &result2);
+    if (broken(ret == WSAHOST_NOT_FOUND))
+    {
+        FreeAddrInfoW(result);
+        win_skip("IDN resolution not supported in Win <= 7\n");
+        return;
+    }
+
+    ok(!ret, "got %d expected success\n", ret);
+    ok(result2 != NULL, "got %p\n", result2);
+    FreeAddrInfoW(result2);
+
+    hint.ai_family = AF_INET;
+    hint.ai_socktype = 0;
+    hint.ai_protocol = 0;
+    hint.ai_flags = 0;
+
+    result2 = NULL;
+    ret = GetAddrInfoW(idn_domain, NULL, &hint, &result2);
+    ok(!ret, "got %d expected success\n", ret);
+    ok(result2 != NULL, "got %p\n", result2);
+
+    /* ensure manually resolved punycode and unicode hosts result in same data */
+    compare_addrinfow(result, result2);
+
+    FreeAddrInfoW(result);
+    FreeAddrInfoW(result2);
+
+    hint.ai_family = AF_INET;
+    hint.ai_socktype = 0;
+    hint.ai_protocol = 0;
+    hint.ai_flags = 0;
+
+    result2 = NULL;
+    ret = GetAddrInfoW(idn_domain, NULL, &hint, &result2);
+    ok(!ret, "got %d expected success\n", ret);
+    ok(result2 != NULL, "got %p\n", result2);
+    FreeAddrInfoW(result2);
+
+    /* Disable IDN resolution and test again*/
+    hint.ai_family = AF_INET;
+    hint.ai_socktype = 0;
+    hint.ai_protocol = 0;
+    hint.ai_flags = AI_DISABLE_IDN_ENCODING;
+
+    SetLastError(0xdeadbeef);
+    result2 = NULL;
+    ret = GetAddrInfoW(idn_domain, NULL, &hint, &result2);
+    ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
+    ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
+    ok(result2 == NULL, "got %p\n", result2);
+}
+
+static struct completion_routine_test
+{
+    WSAOVERLAPPED  *overlapped;
+    DWORD           error;
+    ADDRINFOEXW   **result;
+    HANDLE          event;
+    DWORD           called;
+} completion_routine_test;
+
+static void CALLBACK completion_routine(DWORD error, DWORD byte_count, WSAOVERLAPPED *overlapped)
+{
+    struct completion_routine_test *test = &completion_routine_test;
+
+    ok(error == test->error, "got %u\n", error);
+    ok(!byte_count, "got %u\n", byte_count);
+    ok(overlapped == test->overlapped, "got %p\n", overlapped);
+    ok(overlapped->Internal == test->error, "got %lu\n", overlapped->Internal);
+    ok(overlapped->Pointer == test->result, "got %p\n", overlapped->Pointer);
+    ok(overlapped->hEvent == NULL, "got %p\n", overlapped->hEvent);
+
+    test->called++;
+    SetEvent(test->event);
+}
+
+static void test_GetAddrInfoExW(void)
+{
+    static const WCHAR empty[] = {0};
+    static const WCHAR localhost[] = {'l','o','c','a','l','h','o','s','t',0};
+    static const WCHAR winehq[] = {'t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',0};
+    static const WCHAR nxdomain[] = {'n','x','d','o','m','a','i','n','.','w','i','n','e','h','q','.','o','r','g',0};
+    ADDRINFOEXW *result;
+    OVERLAPPED overlapped;
+    HANDLE event;
+    int ret;
+
+    if (!pGetAddrInfoExW || !pGetAddrInfoExOverlappedResult)
+    {
+        win_skip("GetAddrInfoExW and/or GetAddrInfoExOverlappedResult not present\n");
+        return;
+    }
+
+    event = WSACreateEvent();
+
+    result = (ADDRINFOEXW *)0xdeadbeef;
+    WSASetLastError(0xdeadbeef);
+    ret = pGetAddrInfoExW(NULL, NULL, NS_DNS, NULL, NULL, &result, NULL, NULL, NULL, NULL);
+    ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
+    ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
+    ok(result == NULL, "got %p\n", result);
+
+    result = NULL;
+    WSASetLastError(0xdeadbeef);
+    ret = pGetAddrInfoExW(empty, NULL, NS_DNS, NULL, NULL, &result, NULL, NULL, NULL, NULL);
+    ok(!ret, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
+    ok(result != NULL, "GetAddrInfoW failed\n");
+    ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
+    pFreeAddrInfoExW(result);
+
+    result = NULL;
+    ret = pGetAddrInfoExW(localhost, NULL, NS_DNS, NULL, NULL, &result, NULL, NULL, NULL, NULL);
+    ok(!ret, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
+    pFreeAddrInfoExW(result);
+
+    result = (void *)0xdeadbeef;
+    memset(&overlapped, 0xcc, sizeof(overlapped));
+    overlapped.hEvent = event;
+    ResetEvent(event);
+    ret = pGetAddrInfoExW(localhost, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, NULL, NULL);
+    ok(ret == ERROR_IO_PENDING, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
+    ok(!result, "result != NULL\n");
+    ok(WaitForSingleObject(event, 1000) == WAIT_OBJECT_0, "wait failed\n");
+    ret = pGetAddrInfoExOverlappedResult(&overlapped);
+    ok(!ret, "overlapped result is %d\n", ret);
+    pFreeAddrInfoExW(result);
+
+    result = (void *)0xdeadbeef;
+    memset(&overlapped, 0xcc, sizeof(overlapped));
+    ResetEvent(event);
+    overlapped.hEvent = event;
+    WSASetLastError(0xdeadbeef);
+    ret = pGetAddrInfoExW(winehq, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, NULL, NULL);
+    ok(ret == ERROR_IO_PENDING, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
+    ok(WSAGetLastError() == ERROR_IO_PENDING, "expected 11001, got %d\n", WSAGetLastError());
+    ret = overlapped.Internal;
+    ok(ret == WSAEINPROGRESS || ret == ERROR_SUCCESS, "overlapped.Internal = %u\n", ret);
+    ok(WaitForSingleObject(event, 1000) == WAIT_OBJECT_0, "wait failed\n");
+    ret = pGetAddrInfoExOverlappedResult(&overlapped);
+    ok(!ret, "overlapped result is %d\n", ret);
+    ok(overlapped.hEvent == event, "hEvent changed %p\n", overlapped.hEvent);
+    ok(overlapped.Internal == ERROR_SUCCESS, "overlapped.Internal = %lx\n", overlapped.Internal);
+    ok(overlapped.Pointer == &result, "overlapped.Pointer != &result\n");
+    ok(result != NULL, "result == NULL\n");
+    ok(!result->ai_blob, "ai_blob != NULL\n");
+    ok(!result->ai_bloblen, "ai_bloblen != 0\n");
+    ok(!result->ai_provider, "ai_provider = %s\n", wine_dbgstr_guid(result->ai_provider));
+    pFreeAddrInfoExW(result);
+
+    result = (void *)0xdeadbeef;
+    memset(&overlapped, 0xcc, sizeof(overlapped));
+    ResetEvent(event);
+    overlapped.hEvent = event;
+    ret = pGetAddrInfoExW(NULL, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, NULL, NULL);
+    todo_wine
+    ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
+    todo_wine
+    ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
+    ok(result == NULL, "got %p\n", result);
+    ret = WaitForSingleObject(event, 0);
+    todo_wine_if(ret != WAIT_TIMEOUT) /* Remove when abowe todo_wines are fixed */
+    ok(ret == WAIT_TIMEOUT, "wait failed\n");
+
+    /* event + completion routine */
+    result = (void *)0xdeadbeef;
+    memset(&overlapped, 0xcc, sizeof(overlapped));
+    overlapped.hEvent = event;
+    ResetEvent(event);
+    ret = pGetAddrInfoExW(localhost, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, completion_routine, NULL);
+    ok(ret == WSAEINVAL, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
+
+    /* completion routine, existing domain */
+    result = (void *)0xdeadbeef;
+    overlapped.hEvent = NULL;
+    completion_routine_test.overlapped = &overlapped;
+    completion_routine_test.error = ERROR_SUCCESS;
+    completion_routine_test.result = &result;
+    completion_routine_test.event = event;
+    completion_routine_test.called = 0;
+    ResetEvent(event);
+    ret = pGetAddrInfoExW(winehq, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, completion_routine, NULL);
+    ok(ret == ERROR_IO_PENDING, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
+    ok(!result, "result != NULL\n");
+    ok(WaitForSingleObject(event, 1000) == WAIT_OBJECT_0, "wait failed\n");
+    ret = pGetAddrInfoExOverlappedResult(&overlapped);
+    ok(!ret, "overlapped result is %d\n", ret);
+    ok(overlapped.hEvent == NULL, "hEvent changed %p\n", overlapped.hEvent);
+    ok(overlapped.Internal == ERROR_SUCCESS, "overlapped.Internal = %lx\n", overlapped.Internal);
+    ok(overlapped.Pointer == &result, "overlapped.Pointer != &result\n");
+    ok(completion_routine_test.called == 1, "got %u\n", completion_routine_test.called);
+    pFreeAddrInfoExW(result);
+
+    /* completion routine, non-existing domain */
+    result = (void *)0xdeadbeef;
+    completion_routine_test.overlapped = &overlapped;
+    completion_routine_test.error = WSAHOST_NOT_FOUND;
+    completion_routine_test.called = 0;
+    ResetEvent(event);
+    ret = pGetAddrInfoExW(nxdomain, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, completion_routine, NULL);
+    ok(ret == ERROR_IO_PENDING, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
+    ok(!result, "result != NULL\n");
+    ok(WaitForSingleObject(event, 1000) == WAIT_OBJECT_0, "wait failed\n");
+    ret = pGetAddrInfoExOverlappedResult(&overlapped);
+    ok(ret == WSAHOST_NOT_FOUND, "overlapped result is %d\n", ret);
+    ok(overlapped.hEvent == NULL, "hEvent changed %p\n", overlapped.hEvent);
+    ok(overlapped.Internal == WSAHOST_NOT_FOUND, "overlapped.Internal = %lx\n", overlapped.Internal);
+    ok(overlapped.Pointer == &result, "overlapped.Pointer != &result\n");
+    ok(completion_routine_test.called == 1, "got %u\n", completion_routine_test.called);
+    ok(result == NULL, "got %p\n", result);
+
+    WSACloseEvent(event);
+}
+
+static void verify_ipv6_addrinfo(ADDRINFOA *result, const char *expect)
+{
+    SOCKADDR_IN6 *sockaddr6;
+    char buffer[256];
+    const char *ret;
+
+    ok(result->ai_family == AF_INET6, "ai_family == %d\n", result->ai_family);
+    ok(result->ai_addrlen >= sizeof(struct sockaddr_in6), "ai_addrlen == %d\n", (int)result->ai_addrlen);
+    ok(result->ai_addr != NULL, "ai_addr == NULL\n");
+
+    sockaddr6 = (SOCKADDR_IN6 *)result->ai_addr;
+    ok(sockaddr6->sin6_family == AF_INET6, "ai_addr->sin6_family == %d\n", sockaddr6->sin6_family);
+    ok(sockaddr6->sin6_port == 0, "ai_addr->sin6_port == %d\n", sockaddr6->sin6_port);
+
+    memset(buffer, 0, sizeof(buffer));
+    ret = p_inet_ntop(AF_INET6, &sockaddr6->sin6_addr, buffer, sizeof(buffer));
+    ok(ret != NULL, "inet_ntop failed (%d)\n", WSAGetLastError());
+    ok(!strcmp(buffer, expect), "ai_addr->sin6_addr == '%s' (expected '%s')\n", buffer, expect);
+}
+
+static void compare_addrinfo(ADDRINFO *a, ADDRINFO *b)
+{
+    for (; a && b ; a = a->ai_next, b = b->ai_next)
+    {
+        ok(a->ai_flags == b->ai_flags,
+           "Wrong flags %d != %d\n", a->ai_flags, b->ai_flags);
+        ok(a->ai_family == b->ai_family,
+           "Wrong family %d != %d\n", a->ai_family, b->ai_family);
+        ok(a->ai_socktype == b->ai_socktype,
+           "Wrong socktype %d != %d\n", a->ai_socktype, b->ai_socktype);
+        ok(a->ai_protocol == b->ai_protocol,
+           "Wrong protocol %d != %d\n", a->ai_protocol, b->ai_protocol);
+        ok(a->ai_addrlen == b->ai_addrlen,
+           "Wrong addrlen %lu != %lu\n", a->ai_addrlen, b->ai_addrlen);
+        ok(!memcmp(a->ai_addr, b->ai_addr, min(a->ai_addrlen, b->ai_addrlen)),
+           "Wrong address data\n");
+        if (a->ai_canonname && b->ai_canonname)
+        {
+            ok(!strcmp(a->ai_canonname, b->ai_canonname), "Wrong canonical name '%s' != '%s'\n",
+               a->ai_canonname, b->ai_canonname);
+        }
+        else
+            ok(!a->ai_canonname && !b->ai_canonname, "Expected both names absent (%p != %p)\n",
+               a->ai_canonname, b->ai_canonname);
+    }
+    ok(!a && !b, "Expected both addresses null (%p != %p)\n", a, b);
+}
+
+static void test_getaddrinfo(void)
+{
+    int i, ret;
+    ADDRINFOA *result, *result2, *p, hint;
+    SOCKADDR_IN *sockaddr;
+    CHAR name[256], *ip;
+    DWORD size = sizeof(name);
+
+    memset(&hint, 0, sizeof(ADDRINFOA));
+    GetComputerNameExA( ComputerNamePhysicalDnsHostname, name, &size );
+
+    result = (ADDRINFOA *)0xdeadbeef;
+    WSASetLastError(0xdeadbeef);
+    ret = getaddrinfo(NULL, NULL, NULL, &result);
+    ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
+    ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
+    ok(result == NULL, "got %p\n", result);
+
+    result = NULL;
+    WSASetLastError(0xdeadbeef);
+    ret = getaddrinfo("", NULL, NULL, &result);
+    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
+    ok(result != NULL, "getaddrinfo failed\n");
+    ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
+    freeaddrinfo(result);
+
+    result = NULL;
+    ret = getaddrinfo(NULL, "0", NULL, &result);
+    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
+    ok(result != NULL, "getaddrinfo failed\n");
+
+    result2 = NULL;
+    ret = getaddrinfo(NULL, "", NULL, &result2);
+    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
+    ok(result2 != NULL, "getaddrinfo failed\n");
+    compare_addrinfo(result, result2);
+    freeaddrinfo(result);
+    freeaddrinfo(result2);
+
+    result = NULL;
+    WSASetLastError(0xdeadbeef);
+    ret = getaddrinfo("", "0", NULL, &result);
+    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
+    ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
+    ok(result != NULL, "getaddrinfo failed\n");
+
+    result2 = NULL;
+    ret = getaddrinfo("", "", NULL, &result2);
+    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
+    ok(result2 != NULL, "getaddrinfo failed\n");
+    compare_addrinfo(result, result2);
+    freeaddrinfo(result);
+    freeaddrinfo(result2);
+
+    result = NULL;
+    ret = getaddrinfo("localhost", NULL, NULL, &result);
+    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
+    freeaddrinfo(result);
+
+    result = NULL;
+    ret = getaddrinfo("localhost", "", NULL, &result);
+    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
+    freeaddrinfo(result);
+
+    result = NULL;
+    ret = getaddrinfo("localhost", "0", NULL, &result);
+    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
+    freeaddrinfo(result);
+
+    result = NULL;
+    ret = getaddrinfo("localhost", "80", NULL, &result);
+    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
+    freeaddrinfo(result);
+
+    result = NULL;
+    ret = getaddrinfo("localhost", NULL, &hint, &result);
+    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
+    freeaddrinfo(result);
+
+    result = NULL;
+    WSASetLastError(0xdeadbeef);
+    ret = getaddrinfo("localhost", "80", &hint, &result);
+    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
+    ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
+    freeaddrinfo(result);
+
+    hint.ai_flags = AI_NUMERICHOST;
+    result = (void *)0xdeadbeef;
+    ret = getaddrinfo("localhost", "80", &hint, &result);
+    ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", WSAGetLastError());
+    ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected WSAHOST_NOT_FOUND, got %d\n", WSAGetLastError());
+    ok(!result, "result = %p\n", result);
+    hint.ai_flags = 0;
+
+    /* try to get information from the computer name, result is the same
+     * as if requesting with an empty host name. */
+    ret = getaddrinfo(name, NULL, NULL, &result);
+    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
+    ok(result != NULL, "GetAddrInfoW failed\n");
+
+    ret = getaddrinfo("", NULL, NULL, &result2);
+    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
+    ok(result != NULL, "GetAddrInfoW failed\n");
+    compare_addrinfo(result, result2);
+    freeaddrinfo(result);
+    freeaddrinfo(result2);
+
+    ret = getaddrinfo(name, "", NULL, &result);
+    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
+    ok(result != NULL, "GetAddrInfoW failed\n");
+
+    ret = getaddrinfo("", "", NULL, &result2);
+    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
+    ok(result != NULL, "GetAddrInfoW failed\n");
+    compare_addrinfo(result, result2);
+    freeaddrinfo(result);
+    freeaddrinfo(result2);
+
+    result = (ADDRINFOA *)0xdeadbeef;
+    WSASetLastError(0xdeadbeef);
+    ret = getaddrinfo("nxdomain.codeweavers.com", NULL, NULL, &result);
+    if (ret == 0)
+    {
+        skip("nxdomain returned success. Broken ISP redirects?\n");
+        return;
+    }
+    ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
+    ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
+    ok(result == NULL, "got %p\n", result);
+
+    /* Test IPv4 address conversion */
+    result = NULL;
+    ret = getaddrinfo("192.168.1.253", NULL, NULL, &result);
+    ok(!ret, "getaddrinfo failed with %d\n", ret);
+    ok(result->ai_family == AF_INET, "ai_family == %d\n", result->ai_family);
+    ok(result->ai_addrlen >= sizeof(struct sockaddr_in), "ai_addrlen == %d\n", (int)result->ai_addrlen);
+    ok(result->ai_addr != NULL, "ai_addr == NULL\n");
+    sockaddr = (SOCKADDR_IN *)result->ai_addr;
+    ok(sockaddr->sin_family == AF_INET, "ai_addr->sin_family == %d\n", sockaddr->sin_family);
+    ok(sockaddr->sin_port == 0, "ai_addr->sin_port == %d\n", sockaddr->sin_port);
+
+    ip = inet_ntoa(sockaddr->sin_addr);
+    ok(strcmp(ip, "192.168.1.253") == 0, "sockaddr->ai_addr == '%s'\n", ip);
+    freeaddrinfo(result);
+
+    /* Test IPv4 address conversion with port */
+    result = NULL;
+    hint.ai_flags = AI_NUMERICHOST;
+    ret = getaddrinfo("192.168.1.253:1024", NULL, &hint, &result);
+    hint.ai_flags = 0;
+    ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo returned unexpected result: %d\n", ret);
+    ok(result == NULL, "expected NULL, got %p\n", result);
+
+    /* Test IPv6 address conversion */
+    result = NULL;
+    SetLastError(0xdeadbeef);
+    ret = getaddrinfo("2a00:2039:dead:beef:cafe::6666", NULL, NULL, &result);
+
+    if (result != NULL)
+    {
+        ok(!ret, "getaddrinfo failed with %d\n", ret);
+        verify_ipv6_addrinfo(result, "2a00:2039:dead:beef:cafe::6666");
+        freeaddrinfo(result);
+
+        /* Test IPv6 address conversion with brackets */
+        result = NULL;
+        ret = getaddrinfo("[beef::cafe]", NULL, NULL, &result);
+        ok(!ret, "getaddrinfo failed with %d\n", ret);
+        verify_ipv6_addrinfo(result, "beef::cafe");
+        freeaddrinfo(result);
+
+        /* Test IPv6 address conversion with brackets and hints */
+        memset(&hint, 0, sizeof(ADDRINFOA));
+        hint.ai_flags = AI_NUMERICHOST;
+        hint.ai_family = AF_INET6;
+        result = NULL;
+        ret = getaddrinfo("[beef::cafe]", NULL, &hint, &result);
+        ok(!ret, "getaddrinfo failed with %d\n", ret);
+        verify_ipv6_addrinfo(result, "beef::cafe");
+        freeaddrinfo(result);
+
+        memset(&hint, 0, sizeof(ADDRINFOA));
+        hint.ai_flags = AI_NUMERICHOST;
+        hint.ai_family = AF_INET;
+        result = NULL;
+        ret = getaddrinfo("[beef::cafe]", NULL, &hint, &result);
+        ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
+
+        /* Test IPv6 address conversion with brackets and port */
+        result = NULL;
+        ret = getaddrinfo("[beef::cafe]:10239", NULL, NULL, &result);
+        ok(!ret, "getaddrinfo failed with %d\n", ret);
+        verify_ipv6_addrinfo(result, "beef::cafe");
+        freeaddrinfo(result);
+
+        /* Test IPv6 address conversion with unmatched brackets */
+        result = NULL;
+        hint.ai_flags = AI_NUMERICHOST;
+        ret = getaddrinfo("[beef::cafe", NULL, &hint, &result);
+        ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
+
+        ret = getaddrinfo("beef::cafe]", NULL, &hint, &result);
+        ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
+    }
+    else
+    {
+        ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
+        win_skip("getaddrinfo does not support IPV6\n");
+    }
+
+    hint.ai_flags = 0;
+
+    for (i = 0; i < ARRAY_SIZE(hinttests); i++)
+    {
+        hint.ai_family = hinttests[i].family;
+        hint.ai_socktype = hinttests[i].socktype;
+        hint.ai_protocol = hinttests[i].protocol;
+
+        result = NULL;
+        SetLastError(0xdeadbeef);
+        ret = getaddrinfo("localhost", NULL, &hint, &result);
+        todo_wine_if (hinttests[i].error) ok(ret == hinttests[i].error, "test %d: wrong ret %d\n", i, ret);
+        if (!ret)
+        {
+            for (p = result; p; p = p->ai_next)
+            {
+                /* when AF_UNSPEC is used the return will be either AF_INET or AF_INET6 */
+                if (hinttests[i].family == AF_UNSPEC)
+                    ok(p->ai_family == AF_INET || p->ai_family == AF_INET6,
+                       "test %d: expected AF_INET or AF_INET6, got %d\n",
+                       i, p->ai_family);
+                else
+                    ok(p->ai_family == hinttests[i].family,
+                       "test %d: expected family %d, got %d\n",
+                       i, hinttests[i].family, p->ai_family);
+
+                ok(p->ai_socktype == hinttests[i].socktype,
+                   "test %d: expected type %d, got %d\n",
+                   i, hinttests[i].socktype, p->ai_socktype);
+                ok(p->ai_protocol == hinttests[i].protocol,
+                   "test %d: expected protocol %d, got %d\n",
+                   i, hinttests[i].protocol, p->ai_protocol);
+            }
+            freeaddrinfo(result);
+        }
+        else
+        {
+            ok(WSAGetLastError() == hinttests[i].error, "test %d: wrong error %d\n", i, WSAGetLastError());
+        }
+    }
+
+    memset(&hint, 0, sizeof(hint));
+    ret = getaddrinfo(NULL, "nonexistentservice", &hint, &result);
+    ok(ret == WSATYPE_NOT_FOUND, "got %d\n", ret);
+}
+
 START_TEST( protocol )
 {
     WSADATA data;
     WORD version = MAKEWORD( 2, 2 );
- 
+
+    pFreeAddrInfoExW = (void *)GetProcAddress(GetModuleHandleA("ws2_32"), "FreeAddrInfoExW");
+    pGetAddrInfoExOverlappedResult = (void *)GetProcAddress(GetModuleHandleA("ws2_32"), "GetAddrInfoExOverlappedResult");
+    pGetAddrInfoExW = (void *)GetProcAddress(GetModuleHandleA("ws2_32"), "GetAddrInfoExW");
+    p_inet_ntop = (void *)GetProcAddress(GetModuleHandleA("ws2_32"), "inet_ntop");
+
     if (WSAStartup( version, &data )) return;
 
     test_WSAEnumProtocolsA();
     test_WSAEnumProtocolsW();
     test_getprotobyname();
     test_getprotobynumber();
+
+    test_GetAddrInfoW();
+    test_GetAddrInfoExW();
+    test_getaddrinfo();
 }
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 61af5b0183a..877c21377aa 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -65,12 +65,6 @@
    k.keepaliveinterval = interval;
 
 /* Function pointers */
-static void  (WINAPI *pFreeAddrInfoExW)(ADDRINFOEXW *ai);
-static int   (WINAPI *pGetAddrInfoExW)(const WCHAR *name, const WCHAR *servname, DWORD namespace,
-        GUID *namespace_id, const ADDRINFOEXW *hints, ADDRINFOEXW **result,
-        struct timeval *timeout, OVERLAPPED *overlapped,
-        LPLOOKUPSERVICE_COMPLETION_ROUTINE completion_routine, HANDLE *handle);
-static int   (WINAPI *pGetAddrInfoExOverlappedResult)(OVERLAPPED *overlapped);
 static int   (WINAPI *pGetHostNameW)(WCHAR *, int);
 static PCSTR (WINAPI *pInetNtop)(INT,LPVOID,LPSTR,ULONG);
 static PCWSTR(WINAPI *pInetNtopW)(INT,LPVOID,LPWSTR,ULONG);
@@ -163,46 +157,6 @@ typedef struct select_thread_params
     BOOL ReadKilled;
 } select_thread_params;
 
-/* Tests used in both getaddrinfo and GetAddrInfoW */
-static const struct addr_hint_tests
-{
-    int family, socktype, protocol;
-    DWORD error;
-} hinttests[] = {
-    {AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, 0 },
-    {AF_UNSPEC, SOCK_STREAM, IPPROTO_UDP, 0 },
-    {AF_UNSPEC, SOCK_STREAM, IPPROTO_IPV6,0 },
-    {AF_UNSPEC, SOCK_DGRAM,  IPPROTO_TCP, 0 },
-    {AF_UNSPEC, SOCK_DGRAM,  IPPROTO_UDP, 0 },
-    {AF_UNSPEC, SOCK_DGRAM,  IPPROTO_IPV6,0 },
-    {AF_INET,   SOCK_STREAM, IPPROTO_TCP, 0 },
-    {AF_INET,   SOCK_STREAM, IPPROTO_UDP, 0 },
-    {AF_INET,   SOCK_STREAM, IPPROTO_IPV6,0 },
-    {AF_INET,   SOCK_DGRAM,  IPPROTO_TCP, 0 },
-    {AF_INET,   SOCK_DGRAM,  IPPROTO_UDP, 0 },
-    {AF_INET,   SOCK_DGRAM,  IPPROTO_IPV6,0 },
-    {AF_UNSPEC, 0,           IPPROTO_TCP, 0 },
-    {AF_UNSPEC, 0,           IPPROTO_UDP, 0 },
-    {AF_UNSPEC, 0,           IPPROTO_IPV6,0 },
-    {AF_UNSPEC, SOCK_STREAM, 0,           0 },
-    {AF_UNSPEC, SOCK_DGRAM,  0,           0 },
-    {AF_INET,   0,           IPPROTO_TCP, 0 },
-    {AF_INET,   0,           IPPROTO_UDP, 0 },
-    {AF_INET,   0,           IPPROTO_IPV6,0 },
-    {AF_INET,   SOCK_STREAM, 0,           0 },
-    {AF_INET,   SOCK_DGRAM,  0,           0 },
-    {AF_UNSPEC, 999,         IPPROTO_TCP, WSAESOCKTNOSUPPORT },
-    {AF_UNSPEC, 999,         IPPROTO_UDP, WSAESOCKTNOSUPPORT },
-    {AF_UNSPEC, 999,         IPPROTO_IPV6,WSAESOCKTNOSUPPORT },
-    {AF_INET,   999,         IPPROTO_TCP, WSAESOCKTNOSUPPORT },
-    {AF_INET,   999,         IPPROTO_UDP, WSAESOCKTNOSUPPORT },
-    {AF_INET,   999,         IPPROTO_IPV6,WSAESOCKTNOSUPPORT },
-    {AF_UNSPEC, SOCK_STREAM, 999,         0 },
-    {AF_UNSPEC, SOCK_STREAM, 999,         0 },
-    {AF_INET,   SOCK_DGRAM,  999,         0 },
-    {AF_INET,   SOCK_DGRAM,  999,         0 },
-};
-
 /**************** Static variables ***************/
 
 static DWORD      tls;              /* Thread local storage index */
@@ -390,62 +344,6 @@ static void check_so_opentype (void)
     ok ( tmp == 0, "check_so_opentype: wrong startup value of SO_OPENTYPE: %d\n", tmp );
 }
 
-static void compare_addrinfo (ADDRINFO *a, ADDRINFO *b)
-{
-    for (; a && b ; a = a->ai_next, b = b->ai_next)
-    {
-        ok(a->ai_flags == b->ai_flags,
-           "Wrong flags %d != %d\n", a->ai_flags, b->ai_flags);
-        ok(a->ai_family == b->ai_family,
-           "Wrong family %d != %d\n", a->ai_family, b->ai_family);
-        ok(a->ai_socktype == b->ai_socktype,
-           "Wrong socktype %d != %d\n", a->ai_socktype, b->ai_socktype);
-        ok(a->ai_protocol == b->ai_protocol,
-           "Wrong protocol %d != %d\n", a->ai_protocol, b->ai_protocol);
-        ok(a->ai_addrlen == b->ai_addrlen,
-           "Wrong addrlen %lu != %lu\n", a->ai_addrlen, b->ai_addrlen);
-        ok(!memcmp(a->ai_addr, b->ai_addr, min(a->ai_addrlen, b->ai_addrlen)),
-           "Wrong address data\n");
-        if (a->ai_canonname && b->ai_canonname)
-        {
-            ok(!strcmp(a->ai_canonname, b->ai_canonname), "Wrong canonical name '%s' != '%s'\n",
-               a->ai_canonname, b->ai_canonname);
-        }
-        else
-            ok(!a->ai_canonname && !b->ai_canonname, "Expected both names absent (%p != %p)\n",
-               a->ai_canonname, b->ai_canonname);
-    }
-    ok(!a && !b, "Expected both addresses null (%p != %p)\n", a, b);
-}
-
-static void compare_addrinfow (ADDRINFOW *a, ADDRINFOW *b)
-{
-    for (; a && b ; a = a->ai_next, b = b->ai_next)
-    {
-        ok(a->ai_flags == b->ai_flags,
-           "Wrong flags %d != %d\n", a->ai_flags, b->ai_flags);
-        ok(a->ai_family == b->ai_family,
-           "Wrong family %d != %d\n", a->ai_family, b->ai_family);
-        ok(a->ai_socktype == b->ai_socktype,
-           "Wrong socktype %d != %d\n", a->ai_socktype, b->ai_socktype);
-        ok(a->ai_protocol == b->ai_protocol,
-           "Wrong protocol %d != %d\n", a->ai_protocol, b->ai_protocol);
-        ok(a->ai_addrlen == b->ai_addrlen,
-           "Wrong addrlen %lu != %lu\n", a->ai_addrlen, b->ai_addrlen);
-        ok(!memcmp(a->ai_addr, b->ai_addr, min(a->ai_addrlen, b->ai_addrlen)),
-           "Wrong address data\n");
-        if (a->ai_canonname && b->ai_canonname)
-        {
-            ok(!lstrcmpW(a->ai_canonname, b->ai_canonname), "Wrong canonical name '%s' != '%s'\n",
-               wine_dbgstr_w(a->ai_canonname), wine_dbgstr_w(b->ai_canonname));
-        }
-        else
-            ok(!a->ai_canonname && !b->ai_canonname, "Expected both names absent (%p != %p)\n",
-               a->ai_canonname, b->ai_canonname);
-    }
-    ok(!a && !b, "Expected both addresses null (%p != %p)\n", a, b);
-}
-
 /**************** Server utility functions ***************/
 
 /*
@@ -1201,9 +1099,6 @@ static void Init (void)
     WSADATA data;
     HMODULE hws2_32 = GetModuleHandleA("ws2_32.dll"), ntdll;
 
-    pFreeAddrInfoExW = (void *)GetProcAddress(hws2_32, "FreeAddrInfoExW");
-    pGetAddrInfoExW = (void *)GetProcAddress(hws2_32, "GetAddrInfoExW");
-    pGetAddrInfoExOverlappedResult = (void *)GetProcAddress(hws2_32, "GetAddrInfoExOverlappedResult");
     pGetHostNameW = (void *)GetProcAddress(hws2_32, "GetHostNameW");
     pInetNtop = (void *)GetProcAddress(hws2_32, "inet_ntop");
     pInetNtopW = (void *)GetProcAddress(hws2_32, "InetNtopW");
@@ -6537,703 +6432,6 @@ todo_wine
 #undef POLL_ISSET
 #undef POLL_CLEAR
 
-static void test_GetAddrInfoW(void)
-{
-    static const WCHAR port[] = {'8','0',0};
-    static const WCHAR empty[] = {0};
-    static const WCHAR localhost[] = {'l','o','c','a','l','h','o','s','t',0};
-    static const WCHAR nxdomain[] =
-        {'n','x','d','o','m','a','i','n','.','c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0};
-    static const WCHAR zero[] = {'0',0};
-    int i, ret;
-    ADDRINFOW *result, *result2, *p, hint;
-    WCHAR name[256];
-    DWORD size = ARRAY_SIZE(name);
-    /* te su to.winehq.org written in katakana */
-    static const WCHAR idn_domain[] =
-        {0x30C6,0x30B9,0x30C8,'.','w','i','n','e','h','q','.','o','r','g',0};
-    static const WCHAR idn_punycode[] =
-        {'x','n','-','-','z','c','k','z','a','h','.','w','i','n','e','h','q','.','o','r','g',0};
-
-    memset(&hint, 0, sizeof(ADDRINFOW));
-    name[0] = 0;
-    GetComputerNameExW( ComputerNamePhysicalDnsHostname, name, &size );
-
-    result = (ADDRINFOW *)0xdeadbeef;
-    WSASetLastError(0xdeadbeef);
-    ret = GetAddrInfoW(NULL, NULL, NULL, &result);
-    ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
-    ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
-    ok(result == NULL, "got %p\n", result);
-
-    result = NULL;
-    WSASetLastError(0xdeadbeef);
-    ret = GetAddrInfoW(empty, NULL, NULL, &result);
-    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
-    ok(result != NULL, "GetAddrInfoW failed\n");
-    ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
-    FreeAddrInfoW(result);
-
-    result = NULL;
-    ret = GetAddrInfoW(NULL, zero, NULL, &result);
-    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
-    ok(result != NULL, "GetAddrInfoW failed\n");
-
-    result2 = NULL;
-    ret = GetAddrInfoW(NULL, empty, NULL, &result2);
-    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
-    ok(result2 != NULL, "GetAddrInfoW failed\n");
-    compare_addrinfow(result, result2);
-    FreeAddrInfoW(result);
-    FreeAddrInfoW(result2);
-
-    result = NULL;
-    ret = GetAddrInfoW(empty, zero, NULL, &result);
-    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
-    ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
-    ok(result != NULL, "GetAddrInfoW failed\n");
-
-    result2 = NULL;
-    ret = GetAddrInfoW(empty, empty, NULL, &result2);
-    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
-    ok(result2 != NULL, "GetAddrInfoW failed\n");
-    compare_addrinfow(result, result2);
-    FreeAddrInfoW(result);
-    FreeAddrInfoW(result2);
-
-    result = NULL;
-    ret = GetAddrInfoW(localhost, NULL, NULL, &result);
-    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
-    FreeAddrInfoW(result);
-
-    result = NULL;
-    ret = GetAddrInfoW(localhost, empty, NULL, &result);
-    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
-    FreeAddrInfoW(result);
-
-    result = NULL;
-    ret = GetAddrInfoW(localhost, zero, NULL, &result);
-    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
-    FreeAddrInfoW(result);
-
-    result = NULL;
-    ret = GetAddrInfoW(localhost, port, NULL, &result);
-    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
-    FreeAddrInfoW(result);
-
-    result = NULL;
-    ret = GetAddrInfoW(localhost, NULL, &hint, &result);
-    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
-    FreeAddrInfoW(result);
-
-    result = NULL;
-    SetLastError(0xdeadbeef);
-    ret = GetAddrInfoW(localhost, port, &hint, &result);
-    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
-    ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
-    FreeAddrInfoW(result);
-
-    /* try to get information from the computer name, result is the same
-     * as if requesting with an empty host name. */
-    ret = GetAddrInfoW(name, NULL, NULL, &result);
-    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
-    ok(result != NULL, "GetAddrInfoW failed\n");
-
-    ret = GetAddrInfoW(empty, NULL, NULL, &result2);
-    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
-    ok(result != NULL, "GetAddrInfoW failed\n");
-    compare_addrinfow(result, result2);
-    FreeAddrInfoW(result);
-    FreeAddrInfoW(result2);
-
-    ret = GetAddrInfoW(name, empty, NULL, &result);
-    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
-    ok(result != NULL, "GetAddrInfoW failed\n");
-
-    ret = GetAddrInfoW(empty, empty, NULL, &result2);
-    ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
-    ok(result != NULL, "GetAddrInfoW failed\n");
-    compare_addrinfow(result, result2);
-    FreeAddrInfoW(result);
-    FreeAddrInfoW(result2);
-
-    result = (ADDRINFOW *)0xdeadbeef;
-    WSASetLastError(0xdeadbeef);
-    ret = GetAddrInfoW(NULL, NULL, NULL, &result);
-    if(ret == 0)
-    {
-        skip("nxdomain returned success. Broken ISP redirects?\n");
-        return;
-    }
-    ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
-    ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
-    ok(result == NULL, "got %p\n", result);
-
-    result = (ADDRINFOW *)0xdeadbeef;
-    WSASetLastError(0xdeadbeef);
-    ret = GetAddrInfoW(nxdomain, NULL, NULL, &result);
-    if(ret == 0)
-    {
-        skip("nxdomain returned success. Broken ISP redirects?\n");
-        return;
-    }
-    ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
-    ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
-    ok(result == NULL, "got %p\n", result);
-
-    for (i = 0;i < (ARRAY_SIZE(hinttests));i++)
-    {
-        hint.ai_family = hinttests[i].family;
-        hint.ai_socktype = hinttests[i].socktype;
-        hint.ai_protocol = hinttests[i].protocol;
-
-        result = NULL;
-        SetLastError(0xdeadbeef);
-        ret = GetAddrInfoW(localhost, NULL, &hint, &result);
-        todo_wine_if(hinttests[i].error) ok(ret == hinttests[i].error, "test %d: wrong ret %d\n", i, ret);
-        if(!ret)
-        {
-            for (p = result; p; p = p->ai_next)
-            {
-                /* when AF_UNSPEC is used the return will be either AF_INET or AF_INET6 */
-                if (hinttests[i].family == AF_UNSPEC)
-                    ok(p->ai_family == AF_INET || p->ai_family == AF_INET6,
-                       "test %d: expected AF_INET or AF_INET6, got %d\n",
-                       i, p->ai_family);
-                else
-                    ok(p->ai_family == hinttests[i].family,
-                       "test %d: expected family %d, got %d\n",
-                       i, hinttests[i].family, p->ai_family);
-
-                ok(p->ai_socktype == hinttests[i].socktype,
-                   "test %d: expected type %d, got %d\n",
-                   i, hinttests[i].socktype, p->ai_socktype);
-                ok(p->ai_protocol == hinttests[i].protocol,
-                   "test %d: expected protocol %d, got %d\n",
-                   i, hinttests[i].protocol, p->ai_protocol);
-            }
-            FreeAddrInfoW(result);
-        }
-        else
-        {
-            ok(WSAGetLastError() == hinttests[i].error, "test %d: wrong error %d\n", i, WSAGetLastError());
-        }
-    }
-
-    /* Test IDN resolution (Internationalized Domain Names) present since Windows 8 */
-    result = NULL;
-    ret = GetAddrInfoW(idn_punycode, NULL, NULL, &result);
-    ok(!ret, "got %d expected success\n", ret);
-    ok(result != NULL, "got %p\n", result);
-    FreeAddrInfoW(result);
-
-    hint.ai_family = AF_INET;
-    hint.ai_socktype = 0;
-    hint.ai_protocol = 0;
-    hint.ai_flags = 0;
-
-    result = NULL;
-    ret = GetAddrInfoW(idn_punycode, NULL, &hint, &result);
-    ok(!ret, "got %d expected success\n", ret);
-    ok(result != NULL, "got %p\n", result);
-
-    result2 = NULL;
-    ret = GetAddrInfoW(idn_domain, NULL, NULL, &result2);
-    if (broken(ret == WSAHOST_NOT_FOUND))
-    {
-        FreeAddrInfoW(result);
-        win_skip("IDN resolution not supported in Win <= 7\n");
-        return;
-    }
-
-    ok(!ret, "got %d expected success\n", ret);
-    ok(result2 != NULL, "got %p\n", result2);
-    FreeAddrInfoW(result2);
-
-    hint.ai_family = AF_INET;
-    hint.ai_socktype = 0;
-    hint.ai_protocol = 0;
-    hint.ai_flags = 0;
-
-    result2 = NULL;
-    ret = GetAddrInfoW(idn_domain, NULL, &hint, &result2);
-    ok(!ret, "got %d expected success\n", ret);
-    ok(result2 != NULL, "got %p\n", result2);
-
-    /* ensure manually resolved punycode and unicode hosts result in same data */
-    compare_addrinfow(result, result2);
-
-    FreeAddrInfoW(result);
-    FreeAddrInfoW(result2);
-
-    hint.ai_family = AF_INET;
-    hint.ai_socktype = 0;
-    hint.ai_protocol = 0;
-    hint.ai_flags = 0;
-
-    result2 = NULL;
-    ret = GetAddrInfoW(idn_domain, NULL, &hint, &result2);
-    ok(!ret, "got %d expected success\n", ret);
-    ok(result2 != NULL, "got %p\n", result2);
-    FreeAddrInfoW(result2);
-
-    /* Disable IDN resolution and test again*/
-    hint.ai_family = AF_INET;
-    hint.ai_socktype = 0;
-    hint.ai_protocol = 0;
-    hint.ai_flags = AI_DISABLE_IDN_ENCODING;
-
-    SetLastError(0xdeadbeef);
-    result2 = NULL;
-    ret = GetAddrInfoW(idn_domain, NULL, &hint, &result2);
-    ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
-    ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
-    ok(result2 == NULL, "got %p\n", result2);
-}
-
-static struct completion_routine_test
-{
-    WSAOVERLAPPED  *overlapped;
-    DWORD           error;
-    ADDRINFOEXW   **result;
-    HANDLE          event;
-    DWORD           called;
-} completion_routine_test;
-
-static void CALLBACK completion_routine(DWORD error, DWORD byte_count, WSAOVERLAPPED *overlapped)
-{
-    struct completion_routine_test *test = &completion_routine_test;
-
-    ok(error == test->error, "got %u\n", error);
-    ok(!byte_count, "got %u\n", byte_count);
-    ok(overlapped == test->overlapped, "got %p\n", overlapped);
-    ok(overlapped->Internal == test->error, "got %lu\n", overlapped->Internal);
-    ok(overlapped->Pointer == test->result, "got %p\n", overlapped->Pointer);
-    ok(overlapped->hEvent == NULL, "got %p\n", overlapped->hEvent);
-
-    test->called++;
-    SetEvent(test->event);
-}
-
-static void test_GetAddrInfoExW(void)
-{
-    static const WCHAR empty[] = {0};
-    static const WCHAR localhost[] = {'l','o','c','a','l','h','o','s','t',0};
-    static const WCHAR winehq[] = {'t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',0};
-    static const WCHAR nxdomain[] = {'n','x','d','o','m','a','i','n','.','w','i','n','e','h','q','.','o','r','g',0};
-    ADDRINFOEXW *result;
-    OVERLAPPED overlapped;
-    HANDLE event;
-    int ret;
-
-    if (!pGetAddrInfoExW || !pGetAddrInfoExOverlappedResult)
-    {
-        win_skip("GetAddrInfoExW and/or GetAddrInfoExOverlappedResult not present\n");
-        return;
-    }
-
-    event = WSACreateEvent();
-
-    result = (ADDRINFOEXW *)0xdeadbeef;
-    WSASetLastError(0xdeadbeef);
-    ret = pGetAddrInfoExW(NULL, NULL, NS_DNS, NULL, NULL, &result, NULL, NULL, NULL, NULL);
-    ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
-    ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
-    ok(result == NULL, "got %p\n", result);
-
-    result = NULL;
-    WSASetLastError(0xdeadbeef);
-    ret = pGetAddrInfoExW(empty, NULL, NS_DNS, NULL, NULL, &result, NULL, NULL, NULL, NULL);
-    ok(!ret, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
-    ok(result != NULL, "GetAddrInfoW failed\n");
-    ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
-    pFreeAddrInfoExW(result);
-
-    result = NULL;
-    ret = pGetAddrInfoExW(localhost, NULL, NS_DNS, NULL, NULL, &result, NULL, NULL, NULL, NULL);
-    ok(!ret, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
-    pFreeAddrInfoExW(result);
-
-    result = (void*)0xdeadbeef;
-    memset(&overlapped, 0xcc, sizeof(overlapped));
-    overlapped.hEvent = event;
-    ResetEvent(event);
-    ret = pGetAddrInfoExW(localhost, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, NULL, NULL);
-    ok(ret == ERROR_IO_PENDING, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
-    ok(!result, "result != NULL\n");
-    ok(WaitForSingleObject(event, 1000) == WAIT_OBJECT_0, "wait failed\n");
-    ret = pGetAddrInfoExOverlappedResult(&overlapped);
-    ok(!ret, "overlapped result is %d\n", ret);
-    pFreeAddrInfoExW(result);
-
-    result = (void*)0xdeadbeef;
-    memset(&overlapped, 0xcc, sizeof(overlapped));
-    ResetEvent(event);
-    overlapped.hEvent = event;
-    WSASetLastError(0xdeadbeef);
-    ret = pGetAddrInfoExW(winehq, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, NULL, NULL);
-    ok(ret == ERROR_IO_PENDING, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
-    ok(WSAGetLastError() == ERROR_IO_PENDING, "expected 11001, got %d\n", WSAGetLastError());
-    ret = overlapped.Internal;
-    ok(ret == WSAEINPROGRESS || ret == ERROR_SUCCESS, "overlapped.Internal = %u\n", ret);
-    ok(WaitForSingleObject(event, 1000) == WAIT_OBJECT_0, "wait failed\n");
-    ret = pGetAddrInfoExOverlappedResult(&overlapped);
-    ok(!ret, "overlapped result is %d\n", ret);
-    ok(overlapped.hEvent == event, "hEvent changed %p\n", overlapped.hEvent);
-    ok(overlapped.Internal == ERROR_SUCCESS, "overlapped.Internal = %lx\n", overlapped.Internal);
-    ok(overlapped.Pointer == &result, "overlapped.Pointer != &result\n");
-    ok(result != NULL, "result == NULL\n");
-    if (result != NULL)
-    {
-        ok(!result->ai_blob, "ai_blob != NULL\n");
-        ok(!result->ai_bloblen, "ai_bloblen != 0\n");
-        ok(!result->ai_provider, "ai_provider = %s\n", wine_dbgstr_guid(result->ai_provider));
-        pFreeAddrInfoExW(result);
-    }
-
-    result = (void*)0xdeadbeef;
-    memset(&overlapped, 0xcc, sizeof(overlapped));
-    ResetEvent(event);
-    overlapped.hEvent = event;
-    ret = pGetAddrInfoExW(NULL, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, NULL, NULL);
-    todo_wine
-    ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
-    todo_wine
-    ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
-    ok(result == NULL, "got %p\n", result);
-    ret = WaitForSingleObject(event, 0);
-    todo_wine_if(ret != WAIT_TIMEOUT) /* Remove when abowe todo_wines are fixed */
-    ok(ret == WAIT_TIMEOUT, "wait failed\n");
-
-    /* event + completion routine */
-    result = (void*)0xdeadbeef;
-    memset(&overlapped, 0xcc, sizeof(overlapped));
-    overlapped.hEvent = event;
-    ResetEvent(event);
-    ret = pGetAddrInfoExW(localhost, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, completion_routine, NULL);
-    ok(ret == WSAEINVAL, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
-
-    /* completion routine, existing domain */
-    result = (void *)0xdeadbeef;
-    overlapped.hEvent = NULL;
-    completion_routine_test.overlapped = &overlapped;
-    completion_routine_test.error = ERROR_SUCCESS;
-    completion_routine_test.result = &result;
-    completion_routine_test.event = event;
-    completion_routine_test.called = 0;
-    ResetEvent(event);
-    ret = pGetAddrInfoExW(winehq, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, completion_routine, NULL);
-    ok(ret == ERROR_IO_PENDING, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
-    ok(!result, "result != NULL\n");
-    ok(WaitForSingleObject(event, 1000) == WAIT_OBJECT_0, "wait failed\n");
-    ret = pGetAddrInfoExOverlappedResult(&overlapped);
-    ok(!ret, "overlapped result is %d\n", ret);
-    ok(overlapped.hEvent == NULL, "hEvent changed %p\n", overlapped.hEvent);
-    ok(overlapped.Internal == ERROR_SUCCESS, "overlapped.Internal = %lx\n", overlapped.Internal);
-    ok(overlapped.Pointer == &result, "overlapped.Pointer != &result\n");
-    ok(completion_routine_test.called == 1, "got %u\n", completion_routine_test.called);
-    pFreeAddrInfoExW(result);
-
-    /* completion routine, non-existing domain */
-    result = (void *)0xdeadbeef;
-    completion_routine_test.overlapped = &overlapped;
-    completion_routine_test.error = WSAHOST_NOT_FOUND;
-    completion_routine_test.called = 0;
-    ResetEvent(event);
-    ret = pGetAddrInfoExW(nxdomain, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, completion_routine, NULL);
-    ok(ret == ERROR_IO_PENDING, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
-    ok(!result, "result != NULL\n");
-    ok(WaitForSingleObject(event, 1000) == WAIT_OBJECT_0, "wait failed\n");
-    ret = pGetAddrInfoExOverlappedResult(&overlapped);
-    ok(ret == WSAHOST_NOT_FOUND, "overlapped result is %d\n", ret);
-    ok(overlapped.hEvent == NULL, "hEvent changed %p\n", overlapped.hEvent);
-    ok(overlapped.Internal == WSAHOST_NOT_FOUND, "overlapped.Internal = %lx\n", overlapped.Internal);
-    ok(overlapped.Pointer == &result, "overlapped.Pointer != &result\n");
-    ok(completion_routine_test.called == 1, "got %u\n", completion_routine_test.called);
-    ok(result == NULL, "got %p\n", result);
-
-    WSACloseEvent(event);
-}
-
-static void verify_ipv6_addrinfo(ADDRINFOA *result, const char *expectedIp)
-{
-    SOCKADDR_IN6 *sockaddr6;
-    char ipBuffer[256];
-    const char *ret;
-
-    ok(result->ai_family == AF_INET6, "ai_family == %d\n", result->ai_family);
-    ok(result->ai_addrlen >= sizeof(struct sockaddr_in6), "ai_addrlen == %d\n", (int)result->ai_addrlen);
-    ok(result->ai_addr != NULL, "ai_addr == NULL\n");
-
-    if (result->ai_addr != NULL)
-    {
-        sockaddr6 = (SOCKADDR_IN6 *)result->ai_addr;
-        ok(sockaddr6->sin6_family == AF_INET6, "ai_addr->sin6_family == %d\n", sockaddr6->sin6_family);
-        ok(sockaddr6->sin6_port == 0, "ai_addr->sin6_port == %d\n", sockaddr6->sin6_port);
-
-        ZeroMemory(ipBuffer, sizeof(ipBuffer));
-        ret = pInetNtop(AF_INET6, &sockaddr6->sin6_addr, ipBuffer, sizeof(ipBuffer));
-        ok(ret != NULL, "inet_ntop failed (%d)\n", WSAGetLastError());
-        ok(strcmp(ipBuffer, expectedIp) == 0, "ai_addr->sin6_addr == '%s' (expected '%s')\n", ipBuffer, expectedIp);
-    }
-}
-
-static void test_getaddrinfo(void)
-{
-    int i, ret;
-    ADDRINFOA *result, *result2, *p, hint;
-    SOCKADDR_IN *sockaddr;
-    CHAR name[256], *ip;
-    DWORD size = sizeof(name);
-
-    memset(&hint, 0, sizeof(ADDRINFOA));
-    GetComputerNameExA( ComputerNamePhysicalDnsHostname, name, &size );
-
-    result = (ADDRINFOA *)0xdeadbeef;
-    WSASetLastError(0xdeadbeef);
-    ret = getaddrinfo(NULL, NULL, NULL, &result);
-    ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
-    ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
-    ok(result == NULL, "got %p\n", result);
-
-    result = NULL;
-    WSASetLastError(0xdeadbeef);
-    ret = getaddrinfo("", NULL, NULL, &result);
-    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
-    ok(result != NULL, "getaddrinfo failed\n");
-    ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
-    freeaddrinfo(result);
-
-    result = NULL;
-    ret = getaddrinfo(NULL, "0", NULL, &result);
-    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
-    ok(result != NULL, "getaddrinfo failed\n");
-
-    result2 = NULL;
-    ret = getaddrinfo(NULL, "", NULL, &result2);
-    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
-    ok(result2 != NULL, "getaddrinfo failed\n");
-    compare_addrinfo(result, result2);
-    freeaddrinfo(result);
-    freeaddrinfo(result2);
-
-    result = NULL;
-    WSASetLastError(0xdeadbeef);
-    ret = getaddrinfo("", "0", NULL, &result);
-    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
-    ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
-    ok(result != NULL, "getaddrinfo failed\n");
-
-    result2 = NULL;
-    ret = getaddrinfo("", "", NULL, &result2);
-    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
-    ok(result2 != NULL, "getaddrinfo failed\n");
-    compare_addrinfo(result, result2);
-    freeaddrinfo(result);
-    freeaddrinfo(result2);
-
-    result = NULL;
-    ret = getaddrinfo("localhost", NULL, NULL, &result);
-    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
-    freeaddrinfo(result);
-
-    result = NULL;
-    ret = getaddrinfo("localhost", "", NULL, &result);
-    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
-    freeaddrinfo(result);
-
-    result = NULL;
-    ret = getaddrinfo("localhost", "0", NULL, &result);
-    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
-    freeaddrinfo(result);
-
-    result = NULL;
-    ret = getaddrinfo("localhost", "80", NULL, &result);
-    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
-    freeaddrinfo(result);
-
-    result = NULL;
-    ret = getaddrinfo("localhost", NULL, &hint, &result);
-    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
-    freeaddrinfo(result);
-
-    result = NULL;
-    WSASetLastError(0xdeadbeef);
-    ret = getaddrinfo("localhost", "80", &hint, &result);
-    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
-    ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
-    freeaddrinfo(result);
-
-    hint.ai_flags = AI_NUMERICHOST;
-    result = (void*)0xdeadbeef;
-    ret = getaddrinfo("localhost", "80", &hint, &result);
-    ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", WSAGetLastError());
-    ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected WSAHOST_NOT_FOUND, got %d\n", WSAGetLastError());
-    ok(!result, "result = %p\n", result);
-    hint.ai_flags = 0;
-
-    /* try to get information from the computer name, result is the same
-     * as if requesting with an empty host name. */
-    ret = getaddrinfo(name, NULL, NULL, &result);
-    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
-    ok(result != NULL, "GetAddrInfoW failed\n");
-
-    ret = getaddrinfo("", NULL, NULL, &result2);
-    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
-    ok(result != NULL, "GetAddrInfoW failed\n");
-    compare_addrinfo(result, result2);
-    freeaddrinfo(result);
-    freeaddrinfo(result2);
-
-    ret = getaddrinfo(name, "", NULL, &result);
-    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
-    ok(result != NULL, "GetAddrInfoW failed\n");
-
-    ret = getaddrinfo("", "", NULL, &result2);
-    ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
-    ok(result != NULL, "GetAddrInfoW failed\n");
-    compare_addrinfo(result, result2);
-    freeaddrinfo(result);
-    freeaddrinfo(result2);
-
-    result = (ADDRINFOA *)0xdeadbeef;
-    WSASetLastError(0xdeadbeef);
-    ret = getaddrinfo("nxdomain.codeweavers.com", NULL, NULL, &result);
-    if(ret == 0)
-    {
-        skip("nxdomain returned success. Broken ISP redirects?\n");
-        return;
-    }
-    ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
-    ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
-    ok(result == NULL, "got %p\n", result);
-
-    /* Test IPv4 address conversion */
-    result = NULL;
-    ret = getaddrinfo("192.168.1.253", NULL, NULL, &result);
-    ok(!ret, "getaddrinfo failed with %d\n", ret);
-    ok(result->ai_family == AF_INET, "ai_family == %d\n", result->ai_family);
-    ok(result->ai_addrlen >= sizeof(struct sockaddr_in), "ai_addrlen == %d\n", (int)result->ai_addrlen);
-    ok(result->ai_addr != NULL, "ai_addr == NULL\n");
-    sockaddr = (SOCKADDR_IN *)result->ai_addr;
-    ok(sockaddr->sin_family == AF_INET, "ai_addr->sin_family == %d\n", sockaddr->sin_family);
-    ok(sockaddr->sin_port == 0, "ai_addr->sin_port == %d\n", sockaddr->sin_port);
-
-    ip = inet_ntoa(sockaddr->sin_addr);
-    ok(strcmp(ip, "192.168.1.253") == 0, "sockaddr->ai_addr == '%s'\n", ip);
-    freeaddrinfo(result);
-
-    /* Test IPv4 address conversion with port */
-    result = NULL;
-    hint.ai_flags = AI_NUMERICHOST;
-    ret = getaddrinfo("192.168.1.253:1024", NULL, &hint, &result);
-    hint.ai_flags = 0;
-    ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo returned unexpected result: %d\n", ret);
-    ok(result == NULL, "expected NULL, got %p\n", result);
-
-    /* Test IPv6 address conversion */
-    result = NULL;
-    SetLastError(0xdeadbeef);
-    ret = getaddrinfo("2a00:2039:dead:beef:cafe::6666", NULL, NULL, &result);
-
-    if (result != NULL)
-    {
-        ok(!ret, "getaddrinfo failed with %d\n", ret);
-        verify_ipv6_addrinfo(result, "2a00:2039:dead:beef:cafe::6666");
-        freeaddrinfo(result);
-
-        /* Test IPv6 address conversion with brackets */
-        result = NULL;
-        ret = getaddrinfo("[beef::cafe]", NULL, NULL, &result);
-        ok(!ret, "getaddrinfo failed with %d\n", ret);
-        verify_ipv6_addrinfo(result, "beef::cafe");
-        freeaddrinfo(result);
-
-        /* Test IPv6 address conversion with brackets and hints */
-        memset(&hint, 0, sizeof(ADDRINFOA));
-        hint.ai_flags = AI_NUMERICHOST;
-        hint.ai_family = AF_INET6;
-        result = NULL;
-        ret = getaddrinfo("[beef::cafe]", NULL, &hint, &result);
-        ok(!ret, "getaddrinfo failed with %d\n", ret);
-        verify_ipv6_addrinfo(result, "beef::cafe");
-        freeaddrinfo(result);
-
-        memset(&hint, 0, sizeof(ADDRINFOA));
-        hint.ai_flags = AI_NUMERICHOST;
-        hint.ai_family = AF_INET;
-        result = NULL;
-        ret = getaddrinfo("[beef::cafe]", NULL, &hint, &result);
-        ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
-
-        /* Test IPv6 address conversion with brackets and port */
-        result = NULL;
-        ret = getaddrinfo("[beef::cafe]:10239", NULL, NULL, &result);
-        ok(!ret, "getaddrinfo failed with %d\n", ret);
-        verify_ipv6_addrinfo(result, "beef::cafe");
-        freeaddrinfo(result);
-
-        /* Test IPv6 address conversion with unmatched brackets */
-        result = NULL;
-        hint.ai_flags = AI_NUMERICHOST;
-        ret = getaddrinfo("[beef::cafe", NULL, &hint, &result);
-        ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
-
-        ret = getaddrinfo("beef::cafe]", NULL, &hint, &result);
-        ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
-    }
-    else
-    {
-        ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
-        win_skip("getaddrinfo does not support IPV6\n");
-    }
-
-    hint.ai_flags = 0;
-
-    for (i = 0;i < (ARRAY_SIZE(hinttests));i++)
-    {
-        hint.ai_family = hinttests[i].family;
-        hint.ai_socktype = hinttests[i].socktype;
-        hint.ai_protocol = hinttests[i].protocol;
-
-        result = NULL;
-        SetLastError(0xdeadbeef);
-        ret = getaddrinfo("localhost", NULL, &hint, &result);
-        todo_wine_if(hinttests[i].error) ok(ret == hinttests[i].error, "test %d: wrong ret %d\n", i, ret);
-        if(!ret)
-        {
-            for (p = result; p; p = p->ai_next)
-            {
-                /* when AF_UNSPEC is used the return will be either AF_INET or AF_INET6 */
-                if (hinttests[i].family == AF_UNSPEC)
-                    ok(p->ai_family == AF_INET || p->ai_family == AF_INET6,
-                       "test %d: expected AF_INET or AF_INET6, got %d\n",
-                       i, p->ai_family);
-                else
-                    ok(p->ai_family == hinttests[i].family,
-                       "test %d: expected family %d, got %d\n",
-                       i, hinttests[i].family, p->ai_family);
-
-                ok(p->ai_socktype == hinttests[i].socktype,
-                   "test %d: expected type %d, got %d\n",
-                   i, hinttests[i].socktype, p->ai_socktype);
-                ok(p->ai_protocol == hinttests[i].protocol,
-                   "test %d: expected protocol %d, got %d\n",
-                   i, hinttests[i].protocol, p->ai_protocol);
-            }
-            freeaddrinfo(result);
-        }
-        else
-        {
-            ok(WSAGetLastError() == hinttests[i].error, "test %d: wrong error %d\n", i, WSAGetLastError());
-        }
-    }
-
-    memset(&hint, 0, sizeof(hint));
-    ret = getaddrinfo(NULL, "nonexistentservice", &hint, &result);
-    ok(ret == WSATYPE_NOT_FOUND, "got %d\n", ret);
-}
-
 static void test_ConnectEx(void)
 {
     SOCKET listener = INVALID_SOCKET;
@@ -10680,9 +9878,6 @@ START_TEST( sock )
 
     test_ipv6only();
     test_TransmitFile();
-    test_GetAddrInfoW();
-    test_GetAddrInfoExW();
-    test_getaddrinfo();
     test_AcceptEx();
     test_ConnectEx();
     test_DisconnectEx();
-- 
2.30.2




More information about the wine-devel mailing list