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