Author: akhaldi
Date: Sun Sep 24 11:36:21 2017
New Revision: 75960

URL: http://svn.reactos.org/svn/reactos?rev=75960&view=rev
Log:
[WS2_32_WINETEST] Sync with Wine Staging 2.16. CORE-13762

Modified:
    trunk/rostests/winetests/ws2_32/sock.c

Modified: trunk/rostests/winetests/ws2_32/sock.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/ws2_32/sock.c?rev=75960&r1=75959&r2=75960&view=diff
==============================================================================
--- trunk/rostests/winetests/ws2_32/sock.c      [iso-8859-1] (original)
+++ trunk/rostests/winetests/ws2_32/sock.c      [iso-8859-1] Sun Sep 24 
11:36:21 2017
@@ -72,7 +72,13 @@
 static void  (WINAPI *pfreeaddrinfo)(struct addrinfo *);
 static int   (WINAPI *pgetaddrinfo)(LPCSTR,LPCSTR,const struct addrinfo 
*,struct addrinfo **);
 static void  (WINAPI *pFreeAddrInfoW)(PADDRINFOW);
+static void  (WINAPI *pFreeAddrInfoExW)(ADDRINFOEXW *ai);
 static int   (WINAPI *pGetAddrInfoW)(LPCWSTR,LPCWSTR,const ADDRINFOW 
*,PADDRINFOW *);
+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 PCSTR (WINAPI *pInetNtop)(INT,LPVOID,LPSTR,ULONG);
 static PCWSTR(WINAPI *pInetNtopW)(INT,LPVOID,LPWSTR,ULONG);
 static int   (WINAPI *pInetPtonA)(INT,LPCSTR,LPVOID);
@@ -1234,7 +1240,10 @@
     pfreeaddrinfo = (void *)GetProcAddress(hws2_32, "freeaddrinfo");
     pgetaddrinfo = (void *)GetProcAddress(hws2_32, "getaddrinfo");
     pFreeAddrInfoW = (void *)GetProcAddress(hws2_32, "FreeAddrInfoW");
+    pFreeAddrInfoExW = (void *)GetProcAddress(hws2_32, "FreeAddrInfoExW");
     pGetAddrInfoW = (void *)GetProcAddress(hws2_32, "GetAddrInfoW");
+    pGetAddrInfoExW = (void *)GetProcAddress(hws2_32, "GetAddrInfoExW");
+    pGetAddrInfoExOverlappedResult = (void *)GetProcAddress(hws2_32, 
"GetAddrInfoExOverlappedResult");
     pInetNtop = (void *)GetProcAddress(hws2_32, "inet_ntop");
     pInetNtopW = (void *)GetProcAddress(hws2_32, "InetNtopW");
     pInetPtonA = (void *)GetProcAddress(hws2_32, "inet_pton");
@@ -1654,7 +1663,7 @@
             ok(k == 99, "Expected 99, got %d\n", k);
             }
         }
-        else /* <= 2003 the tests differ between TCP and UDP, UDP silenty 
accepts */
+        else /* <= 2003 the tests differ between TCP and UDP, UDP silently 
accepts */
         {
             SetLastError(0xdeadbeef);
             k = 99;
@@ -3613,6 +3622,7 @@
     struct sockaddr_in addr;
     struct timeval select_timeout;
 
+    memset(&readfds, 0, sizeof(readfds));
     FD_ZERO(&readfds);
     FD_SET(par->s, &readfds);
     select_timeout.tv_sec=5;
@@ -4785,7 +4795,7 @@
         }
 
         ok(memcmp(he->h_addr_list[0], loopback, he->h_length) == 0,
-           "gethostbyname(\"localhost\") returned %d.%d.%d.%d\n",
+           "gethostbyname(\"localhost\") returned %u.%u.%u.%u\n",
            he->h_addr_list[0][0], he->h_addr_list[0][1], he->h_addr_list[0][2],
            he->h_addr_list[0][3]);
     }
@@ -4809,7 +4819,7 @@
         if (he->h_addr_list[0][0] == 127)
         {
             ok(memcmp(he->h_addr_list[0], magic_loopback, he->h_length) == 0,
-               "gethostbyname(\"%s\") returned %d.%d.%d.%d not 127.12.34.56\n",
+               "gethostbyname(\"%s\") returned %u.%u.%u.%u not 127.12.34.56\n",
                name, he->h_addr_list[0][0], he->h_addr_list[0][1],
                he->h_addr_list[0][2], he->h_addr_list[0][3]);
         }
@@ -6871,7 +6881,6 @@
     memset(&ov, 0, sizeof(ov));
     completion_called = 0;
     iret = WSARecv(dest, bufs, 1, NULL, &flags, &ov, io_completion);
-    todo_wine
     ok(iret == SOCKET_ERROR && GetLastError() == WSAEINVAL, "WSARecv failed - 
%d error %d\n", iret, GetLastError());
     ok(!completion_called, "completion called\n");
 
@@ -7382,11 +7391,124 @@
     ok(result2 == NULL, "got %p\n", result2);
 }
 
+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};
+    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");
+
+    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;
-    CHAR name[256];
+    SOCKADDR_IN *sockaddr;
+    CHAR name[256], *ip;
     DWORD size = sizeof(name);
 
     if (!pgetaddrinfo || !pfreeaddrinfo)
@@ -7515,6 +7637,88 @@
     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 = pgetaddrinfo("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);
+    pfreeaddrinfo(result);
+
+    /* Test IPv4 address conversion with port */
+    result = NULL;
+    hint.ai_flags = AI_NUMERICHOST;
+    ret = pgetaddrinfo("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 = pgetaddrinfo("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");
+        pfreeaddrinfo(result);
+
+        /* Test IPv6 address conversion with brackets */
+        result = NULL;
+        ret = pgetaddrinfo("[beef::cafe]", NULL, NULL, &result);
+        ok(!ret, "getaddrinfo failed with %d\n", ret);
+        verify_ipv6_addrinfo(result, "beef::cafe");
+        pfreeaddrinfo(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 = pgetaddrinfo("[beef::cafe]", NULL, &hint, &result);
+        ok(!ret, "getaddrinfo failed with %d\n", ret);
+        verify_ipv6_addrinfo(result, "beef::cafe");
+        pfreeaddrinfo(result);
+
+        memset(&hint, 0, sizeof(ADDRINFOA));
+        hint.ai_flags = AI_NUMERICHOST;
+        hint.ai_family = AF_INET;
+        result = NULL;
+        ret = pgetaddrinfo("[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 = pgetaddrinfo("[beef::cafe]:10239", NULL, NULL, &result);
+        ok(!ret, "getaddrinfo failed with %d\n", ret);
+        verify_ipv6_addrinfo(result, "beef::cafe");
+        pfreeaddrinfo(result);
+
+        /* Test IPv6 address conversion with unmatched brackets */
+        result = NULL;
+        hint.ai_flags = AI_NUMERICHOST;
+        ret = pgetaddrinfo("[beef::cafe", NULL, &hint, &result);
+        ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
+
+        ret = pgetaddrinfo("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 < (sizeof(hinttests) / sizeof(hinttests[0]));i++)
     {
@@ -7619,12 +7823,15 @@
         goto end;
     }
 
+    bytesReturned = 0xdeadbeef;
     iret = WSAIoctl(connector, SIO_GET_EXTENSION_FUNCTION_POINTER, 
&connectExGuid, sizeof(connectExGuid),
         &pConnectEx, sizeof(pConnectEx), &bytesReturned, NULL, NULL);
     if (iret) {
         win_skip("WSAIoctl failed to get ConnectEx with ret %d + errno %d\n", 
iret, WSAGetLastError());
         goto end;
     }
+
+    ok(bytesReturned == sizeof(pConnectEx), "expected sizeof(pConnectEx), got 
%u\n", bytesReturned);
 
     bret = pConnectEx(INVALID_SOCKET, (struct sockaddr*)&address, addrlen, 
NULL, 0, &bytesReturned, &overlapped);
     ok(bret == FALSE && WSAGetLastError() == WSAENOTSOCK, "ConnectEx on 
invalid socket "
@@ -7756,22 +7963,14 @@
     address.sin_port = htons(1);
 
     bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, 
&bytesReturned, &overlapped);
-    ok(bret == FALSE && GetLastError(), "ConnectEx to bad destination failed: "
+    ok(bret == FALSE && GetLastError() == ERROR_IO_PENDING, "ConnectEx to bad 
destination failed: "
         "returned %d + errno %d\n", bret, GetLastError());
-
-    if (GetLastError() == ERROR_IO_PENDING)
-    {
-        dwret = WaitForSingleObject(overlapped.hEvent, 15000);
-        ok(dwret == WAIT_OBJECT_0, "Waiting for connect event failed with %d + 
errno %d\n", dwret, GetLastError());
-
-        bret = GetOverlappedResult((HANDLE)connector, &overlapped, 
&bytesReturned, FALSE);
-        ok(bret == FALSE && GetLastError() == ERROR_CONNECTION_REFUSED,
-           "Connecting to a disconnected host returned error %d - %d\n", bret, 
WSAGetLastError());
-    }
-    else {
-        ok(GetLastError() == WSAECONNREFUSED,
-           "Connecting to a disconnected host returned error %d - %d\n", bret, 
WSAGetLastError());
-    }
+    dwret = WaitForSingleObject(overlapped.hEvent, 15000);
+    ok(dwret == WAIT_OBJECT_0, "Waiting for connect event failed with %d + 
errno %d\n", dwret, GetLastError());
+
+    bret = GetOverlappedResult((HANDLE)connector, &overlapped, &bytesReturned, 
FALSE);
+    ok(bret == FALSE && GetLastError() == ERROR_CONNECTION_REFUSED,
+       "Connecting to a disconnected host returned error %d - %d\n", bret, 
WSAGetLastError());
 
 end:
     if (overlapped.hEvent)
@@ -9852,6 +10051,11 @@
 
     io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 236, 0);
     ok(io_port != NULL, "failed to create completion port %u\n", 
GetLastError());
+
+    io_info.Flags = FILE_SKIP_COMPLETION_PORT_ON_SUCCESS;
+    status = pNtSetInformationFile((HANDLE)src, &io, &io_info, 
sizeof(io_info), FileIoCompletionNotificationInformation);
+    ok(status == STATUS_SUCCESS || broken(status == STATUS_INVALID_INFO_CLASS) 
/* XP */,
+       "expected STATUS_SUCCESS, got %08x\n", status);
 
     io_info.Flags = FILE_SKIP_COMPLETION_PORT_ON_SUCCESS;
     status = pNtSetInformationFile((HANDLE)dest, &io, &io_info, 
sizeof(io_info), FileIoCompletionNotificationInformation);
@@ -10559,6 +10763,7 @@
     test_ipv6only();
     test_TransmitFile();
     test_GetAddrInfoW();
+    test_GetAddrInfoExW();
     test_getaddrinfo();
     test_AcceptEx();
     test_ConnectEx();


Reply via email to