Damjan Jovanovic : ws2_32: Added tests for closesocket cancelling pending I /O operations.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Dec 5 04:50:56 CST 2006


Module: wine
Branch: master
Commit: 526e1353e68e91b8485b2896455966f64076a696
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=526e1353e68e91b8485b2896455966f64076a696

Author: Damjan Jovanovic <damjan.jov at gmail.com>
Date:   Mon Dec  4 08:01:19 2006 +0200

ws2_32: Added tests for closesocket cancelling pending I/O operations.

---

 dlls/ws2_32/tests/sock.c |   88 ++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 85 insertions(+), 3 deletions(-)

diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 45b858c..45331e9 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -1399,15 +1399,96 @@ static void test_select(void)
     ok ( (thread_handle != NULL), "CreateThread failed unexpectedly: %d\n", GetLastError());
 
     WaitForSingleObject (server_ready, INFINITE);
-    Sleep(2000);
+    Sleep(200);
     ret = closesocket(fdRead);
     ok ( (ret == 0), "closesocket failed unexpectedly: %d\n", ret);
 
-    WaitForSingleObject (thread_handle, TEST_TIMEOUT * 1000);
-    todo_wine {
+    WaitForSingleObject (thread_handle, 1000);
     ok ( (thread_params.ReadKilled), "closesocket did not wakeup select\n");
+
+}
+
+static DWORD WINAPI AcceptKillThread(select_thread_params *par)
+{
+    struct sockaddr_in address;
+    int len = sizeof(address);
+    SOCKET client_socket;
+
+    SetEvent(server_ready);
+    client_socket = accept(par->s, (struct sockaddr*) &address, &len);
+    if (client_socket != INVALID_SOCKET)
+        closesocket(client_socket);
+    par->ReadKilled = (client_socket == INVALID_SOCKET);
+    return 0;
+}
+
+static void test_accept(void)
+{
+    int ret;
+    SOCKET server_socket = INVALID_SOCKET;
+    struct sockaddr_in address;
+    select_thread_params thread_params;
+    HANDLE thread_handle = NULL;
+
+    server_socket = socket(AF_INET, SOCK_STREAM, 0);
+    if (server_socket == INVALID_SOCKET)
+    {
+        trace("error creating server socket: %d\n", WSAGetLastError());
+        goto done;
+    }
+
+    memset(&address, 0, sizeof(address));
+    address.sin_family = AF_INET;
+    ret = bind(server_socket, (struct sockaddr*) &address, sizeof(address));
+    if (ret != 0)
+    {
+        trace("error binding server socket: %d\n", WSAGetLastError());
+        goto done;
+    }
+
+    ret = listen(server_socket, 1);
+    if (ret != 0)
+    {
+        trace("error making server socket listen: %d\n", WSAGetLastError());
+        goto done;
+    }
+
+    server_ready = CreateEventW(NULL, TRUE, FALSE, NULL);
+    if (server_ready == INVALID_HANDLE_VALUE)
+    {
+        trace("error creating event: %d\n", GetLastError());
+        goto done;
     }
 
+    thread_params.s = server_socket;
+    thread_params.ReadKilled = FALSE;
+    thread_handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) AcceptKillThread,
+        &thread_params, 0, NULL);
+    if (thread_handle == NULL)
+    {
+        trace("error creating thread: %d\n", GetLastError());
+        goto done;
+    }
+
+    WaitForSingleObject(server_ready, INFINITE);
+    Sleep(200);
+    ret = closesocket(server_socket);
+    if (ret != 0)
+    {
+        trace("closesocket failed: %d\n", WSAGetLastError());
+        goto done;
+    }
+
+    WaitForSingleObject(thread_handle, 1000);
+    ok(thread_params.ReadKilled, "closesocket did not wakeup accept\n");
+
+done:
+    if (thread_handle != NULL)
+        CloseHandle(thread_handle);
+    if (server_ready != INVALID_HANDLE_VALUE)
+        CloseHandle(server_ready);
+    if (server_socket != INVALID_SOCKET)
+        closesocket(server_socket);
 }
 
 static void test_extendedSocketOptions()
@@ -1513,6 +1594,7 @@ START_TEST( sock )
     test_WSAStringToAddressW();
 
     test_select();
+    test_accept();
 
     Exit();
 }




More information about the wine-cvs mailing list