Piotr Caban : ws2_32/tests: Add more select tests.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Nov 28 12:49:04 CST 2014
Module: wine
Branch: master
Commit: 6d5b7c7344154dfe7c6faabe813ca69772e17740
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6d5b7c7344154dfe7c6faabe813ca69772e17740
Author: Piotr Caban <piotr at codeweavers.com>
Date: Thu Nov 27 18:52:15 2014 +0100
ws2_32/tests: Add more select tests.
---
dlls/ws2_32/tests/sock.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 75 insertions(+)
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index acc2783..106588d 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -3229,6 +3229,8 @@ static void test_listen(void)
static void test_select(void)
{
+ static const char tmp_buf[1024];
+
SOCKET fdRead, fdWrite;
fd_set readfds, writefds, exceptfds;
unsigned int maxfd;
@@ -3327,6 +3329,79 @@ static void test_select(void)
ok ( (ret == SOCKET_ERROR), "expected SOCKET_ERROR, got %i\n", ret);
ok ( WSAGetLastError() == WSAENOTSOCK, "expected WSAENOTSOCK, got %i\n", WSAGetLastError());
ok ( !FD_ISSET(fdRead, &exceptfds), "FD should not be set\n");
+
+ ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n");
+ maxfd = fdRead;
+ if(fdWrite > maxfd) maxfd = fdWrite;
+
+ FD_ZERO(&readfds);
+ FD_SET(fdRead, &readfds);
+ ret = select(fdRead+1, &readfds, NULL, NULL, &select_timeout);
+ ok(!ret, "select returned %d\n", ret);
+
+ FD_ZERO(&writefds);
+ FD_SET(fdWrite, &writefds);
+ ret = select(fdWrite+1, NULL, &writefds, NULL, &select_timeout);
+ ok(ret == 1, "select returned %d\n", ret);
+ ok(FD_ISSET(fdWrite, &writefds), "fdWrite socket is not in the set\n");
+
+ /* tests for overlapping fd_set pointers */
+ FD_ZERO(&readfds);
+ FD_SET(fdWrite, &readfds);
+ ret = select(fdWrite+1, &readfds, &readfds, NULL, &select_timeout);
+ ok(ret == 1, "select returned %d\n", ret);
+ ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n");
+
+ FD_ZERO(&readfds);
+ FD_SET(fdWrite, &readfds);
+ FD_SET(fdRead, &readfds);
+ ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout);
+ ok(ret == 2, "select returned %d\n", ret);
+ ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n");
+ ok(FD_ISSET(fdRead, &readfds), "fdWrite socket is not in the set\n");
+
+ ok(send(fdWrite, "test", 4, 0) == 4, "failed to send data\n");
+ FD_ZERO(&readfds);
+ FD_SET(fdRead, &readfds);
+ ret = select(fdRead+1, &readfds, NULL, NULL, &select_timeout);
+ ok(ret == 1, "select returned %d\n", ret);
+ ok(FD_ISSET(fdRead, &readfds), "fdWrite socket is not in the set\n");
+
+ FD_ZERO(&readfds);
+ FD_SET(fdWrite, &readfds);
+ FD_SET(fdRead, &readfds);
+ ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout);
+ ok(ret == 2, "select returned %d\n", ret);
+ ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n");
+ ok(FD_ISSET(fdRead, &readfds), "fdWrite socket is not in the set\n");
+
+ while(1) {
+ FD_ZERO(&writefds);
+ FD_SET(fdWrite, &writefds);
+ ret = select(fdWrite+1, NULL, &writefds, NULL, &select_timeout);
+ if(!ret) break;
+ ok(send(fdWrite, tmp_buf, sizeof(tmp_buf), 0) > 0, "failed to send data\n");
+ }
+ FD_ZERO(&readfds);
+ FD_SET(fdWrite, &readfds);
+ FD_SET(fdRead, &readfds);
+ ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout);
+ ok(ret == 1, "select returned %d\n", ret);
+ ok(!FD_ISSET(fdWrite, &readfds), "fdWrite socket is in the set\n");
+ ok(FD_ISSET(fdRead, &readfds), "fdWrite socket is not in the set\n");
+
+ ok(send(fdRead, "test", 4, 0) == 4, "failed to send data\n");
+ Sleep(100);
+ FD_ZERO(&readfds);
+ FD_SET(fdWrite, &readfds);
+ FD_SET(fdRead, &readfds);
+ ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout);
+ ok(ret == 2, "select returned %d\n", ret);
+ ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n");
+ ok(FD_ISSET(fdRead, &readfds), "fdWrite socket is not in the set\n");
+
+ closesocket(fdRead);
+ closesocket(fdWrite);
}
static DWORD WINAPI AcceptKillThread(void *param)
More information about the wine-cvs
mailing list