mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 08:25:03 +00:00
[WS2_32_WINETEST] Sync with Wine Staging 2.16. CORE-13762
svn path=/trunk/; revision=75960
This commit is contained in:
parent
9c8d9cd263
commit
bc87785826
1 changed files with 224 additions and 19 deletions
|
@ -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 @@ static void Init (void)
|
|||
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 @@ todo_wine
|
|||
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 @@ static DWORD WINAPI SelectReadThread(void *param)
|
|||
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 @@ static void test_gethostbyname_hack(void)
|
|||
}
|
||||
|
||||
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 @@ static void test_gethostbyname_hack(void)
|
|||
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 @@ static void test_WSARecv(void)
|
|||
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 @@ static void test_GetAddrInfoW(void)
|
|||
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)
|
||||
|
@ -7516,6 +7638,88 @@ static void test_getaddrinfo(void)
|
|||
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++)
|
||||
{
|
||||
hint.ai_family = hinttests[i].family;
|
||||
|
@ -7619,6 +7823,7 @@ static void test_ConnectEx(void)
|
|||
goto end;
|
||||
}
|
||||
|
||||
bytesReturned = 0xdeadbeef;
|
||||
iret = WSAIoctl(connector, SIO_GET_EXTENSION_FUNCTION_POINTER, &connectExGuid, sizeof(connectExGuid),
|
||||
&pConnectEx, sizeof(pConnectEx), &bytesReturned, NULL, NULL);
|
||||
if (iret) {
|
||||
|
@ -7626,6 +7831,8 @@ static void test_ConnectEx(void)
|
|||
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 "
|
||||
"returned %d + errno %d\n", bret, WSAGetLastError());
|
||||
|
@ -7756,22 +7963,14 @@ static void test_ConnectEx(void)
|
|||
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());
|
||||
dwret = WaitForSingleObject(overlapped.hEvent, 15000);
|
||||
ok(dwret == WAIT_OBJECT_0, "Waiting for connect event failed with %d + errno %d\n", dwret, 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());
|
||||
}
|
||||
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)
|
||||
|
@ -9853,6 +10052,11 @@ static void test_completion_port(void)
|
|||
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);
|
||||
ok(status == STATUS_SUCCESS || broken(status == STATUS_INVALID_INFO_CLASS) /* XP */,
|
||||
|
@ -10559,6 +10763,7 @@ START_TEST( sock )
|
|||
test_ipv6only();
|
||||
test_TransmitFile();
|
||||
test_GetAddrInfoW();
|
||||
test_GetAddrInfoExW();
|
||||
test_getaddrinfo();
|
||||
test_AcceptEx();
|
||||
test_ConnectEx();
|
||||
|
|
Loading…
Reference in a new issue