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