Module: wine Branch: master Commit: b9f6f3896a128cca1f396713216bdce03e79cc69 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b9f6f3896a128cca1f39671321...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Apr 5 14:03:17 2017 +0200
ws2_32/tests: Added WSARecv tests using completion function.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ws2_32/tests/sock.c | 45 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-)
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index c77f43b..023eb42 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -6656,6 +6656,13 @@ static DWORD WINAPI recv_thread(LPVOID arg) return 0; }
+static int completion_called; + +static void WINAPI io_completion(DWORD error, DWORD transferred, WSAOVERLAPPED *overlapped, DWORD flags) +{ + completion_called++; +} + static void test_WSARecv(void) { SOCKET src, dest, server = INVALID_SOCKET; @@ -6668,7 +6675,7 @@ static void test_WSARecv(void) int iret, len; DWORD dwret; BOOL bret; - HANDLE thread; + HANDLE thread, event = NULL, io_port;
tcp_socketpair(&src, &dest); if (src == INVALID_SOCKET || dest == INVALID_SOCKET) @@ -6732,9 +6739,9 @@ static void test_WSARecv(void) ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
bufs[0].len = sizeof(buf); - ov.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL); + ov.hEvent = event = CreateEventA(NULL, FALSE, FALSE, NULL); ok(ov.hEvent != NULL, "could not create event object, errno = %d\n", GetLastError()); - if (!ov.hEvent) + if (!event) goto end;
ling.l_onoff = 1; @@ -6795,6 +6802,34 @@ static void test_WSARecv(void) WaitForSingleObject(thread, 3000); CloseHandle(thread);
+ memset(&ov, 0, sizeof(ov)); + ov.hEvent = event; + ResetEvent(event); + iret = WSARecv(dest, bufs, 1, NULL, &flags, &ov, io_completion); + ok(iret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING, "WSARecv failed - %d error %d\n", iret, GetLastError()); + send(src, "test message", sizeof("test message"), 0); + + completion_called = 0; + dwret = SleepEx(1000, TRUE); + ok(dwret == WAIT_IO_COMPLETION, "got %u\n", dwret); + ok(completion_called == 1, "completion not called\n"); + + dwret = WaitForSingleObject(event, 1); + ok(dwret == WAIT_TIMEOUT, "got %u\n", dwret); + + io_port = CreateIoCompletionPort( (HANDLE)dest, NULL, 0, 0 ); + ok(io_port != NULL, "failed to create completion port %u\n", GetLastError()); + + /* Using completion function on socket associated with completion port is not allowed. */ + 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"); + + CloseHandle(io_port); + end: if (server != INVALID_SOCKET) closesocket(server); @@ -6802,8 +6837,8 @@ end: closesocket(dest); if (src != INVALID_SOCKET) closesocket(src); - if (ov.hEvent) - WSACloseEvent(ov.hEvent); + if (event) + WSACloseEvent(event); }
#define POLL_CLEAR() ix = 0