Mike Kaplinskiy : ws2_32/tests: Test WSAAccept with CF_DEFER.
Alexandre Julliard
julliard at winehq.org
Fri Sep 25 10:24:57 CDT 2009
Module: wine
Branch: master
Commit: 45bd91b28b014f28b8bf05552b387ee27a0a8816
URL: http://source.winehq.org/git/wine.git/?a=commit;h=45bd91b28b014f28b8bf05552b387ee27a0a8816
Author: Mike Kaplinskiy <mike.kaplinskiy at gmail.com>
Date: Fri Sep 25 01:59:20 2009 -0400
ws2_32/tests: Test WSAAccept with CF_DEFER.
---
dlls/ws2_32/tests/sock.c | 46 +++++++++++++++++++++++++++++++++++++---------
1 files changed, 37 insertions(+), 9 deletions(-)
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 3d470c6..57147c9 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -1949,11 +1949,20 @@ static DWORD WINAPI AcceptKillThread(select_thread_params *par)
return 0;
}
+
+static int CALLBACK AlwaysDeferConditionFunc(LPWSABUF lpCallerId, LPWSABUF lpCallerData, LPQOS pQos,
+ LPQOS lpGQOS, LPWSABUF lpCalleeId, LPWSABUF lpCalleeData,
+ GROUP FAR * g, DWORD_PTR dwCallbackData)
+{
+ return CF_DEFER;
+}
+
static void test_accept(void)
{
int ret;
- SOCKET server_socket = INVALID_SOCKET;
+ SOCKET server_socket = INVALID_SOCKET, accepted = INVALID_SOCKET, connector = INVALID_SOCKET;
struct sockaddr_in address;
+ int socklen;
select_thread_params thread_params;
HANDLE thread_handle = NULL;
DWORD id;
@@ -1966,6 +1975,7 @@ static void test_accept(void)
}
memset(&address, 0, sizeof(address));
+ address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_family = AF_INET;
ret = bind(server_socket, (struct sockaddr*) &address, sizeof(address));
if (ret != 0)
@@ -1974,13 +1984,34 @@ static void test_accept(void)
goto done;
}
- ret = listen(server_socket, 1);
+ socklen = sizeof(address);
+ ret = getsockname(server_socket, (struct sockaddr*)&address, &socklen);
+ if (ret != 0) {
+ skip("failed to lookup bind address, error %d\n", WSAGetLastError());
+ goto done;
+ }
+
+ ret = listen(server_socket, 5);
if (ret != 0)
{
trace("error making server socket listen: %d\n", WSAGetLastError());
goto done;
}
+ trace("Blocking accept next\n");
+
+ connector = socket(AF_INET, SOCK_STREAM, 0);
+ ok(connector != INVALID_SOCKET, "Failed to create connector socket, error %d\n", WSAGetLastError());
+
+ ret = connect(connector, (struct sockaddr*)&address, sizeof(address));
+ ok(ret == 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
+
+ accepted = WSAAccept(server_socket, NULL, NULL, (LPCONDITIONPROC) AlwaysDeferConditionFunc, 0);
+ ok(accepted == INVALID_SOCKET && WSAGetLastError() == WSATRY_AGAIN, "Failed to defer connection, %d\n", WSAGetLastError());
+
+ accepted = accept(server_socket, NULL, 0);
+ ok(accepted != INVALID_SOCKET, "Failed to accept deferred connection, error %d\n", WSAGetLastError());
+
server_ready = CreateEventA(NULL, TRUE, FALSE, NULL);
if (server_ready == INVALID_HANDLE_VALUE)
{
@@ -2011,6 +2042,10 @@ static void test_accept(void)
ok(thread_params.ReadKilled, "closesocket did not wakeup accept\n");
done:
+ if (accepted != INVALID_SOCKET)
+ closesocket(accepted);
+ if (connector != INVALID_SOCKET)
+ closesocket(connector);
if (thread_handle != NULL)
CloseHandle(thread_handle);
if (server_ready != INVALID_HANDLE_VALUE)
@@ -2757,13 +2792,6 @@ static void test_GetAddrInfoW(void)
pFreeAddrInfoW(result);
}
-static int CALLBACK AlwaysDeferConditionFunc(LPWSABUF lpCallerId, LPWSABUF lpCallerData, LPQOS pQos,
- LPQOS lpGQOS, LPWSABUF lpCalleeId, LPWSABUF lpCalleeData,
- GROUP FAR * g, DWORD_PTR dwCallbackData)
-{
- return CF_DEFER;
-}
-
static void test_AcceptEx(void)
{
SOCKET listener = INVALID_SOCKET;
More information about the wine-cvs
mailing list