Author: phater
Date: Thu Nov 10 15:00:44 2016
New Revision: 73194

URL: http://svn.reactos.org/svn/reactos?rev=73194&view=rev
Log:
[WS2_32_APITESTS] Add more WSAAsync tests

Modified:
    trunk/rostests/apitests/ws2_32/WSAAsync.c

Modified: trunk/rostests/apitests/ws2_32/WSAAsync.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/ws2_32/WSAAsync.c?rev=73194&r1=73193&r2=73194&view=diff
==============================================================================
--- trunk/rostests/apitests/ws2_32/WSAAsync.c   [iso-8859-1] (original)
+++ trunk/rostests/apitests/ws2_32/WSAAsync.c   [iso-8859-1] Thu Nov 10 
15:00:44 2016
@@ -26,7 +26,7 @@
     struct sockaddr_in server_addr_in;
     struct sockaddr_in addr_remote;
     struct sockaddr_in addr_con_loc;
-    int nConRes;
+    int nConRes, nSockNameRes;
     int addrsize, len;
     WSAEVENT fEvents[2];
     SOCKET fSockets[2];
@@ -35,6 +35,11 @@
     ULONG ulValue = 1;
     DWORD dwWait;
     DWORD dwFlags = 0;
+    struct fd_set select_rfds;
+    struct fd_set select_wfds;
+    struct fd_set select_efds;
+    struct timeval timeval;
+    BOOL ConnectSent = FALSE;
 
     if (WSAStartup(MAKEWORD(2, 2), &WsaData) != 0)
     {
@@ -156,10 +161,135 @@
             }
         }
     }
+    closesocket(sockaccept);
+    closesocket(ServerSocket);
+    closesocket(ClientSocket);
+
+    /* same test but with waiting select and getsockname to return proper 
values */
+    ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+    ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+
+    if (ServerSocket == INVALID_SOCKET)
+    {
+        skip("ERROR: Server socket creation failed\n");
+        return;
+    }
+    if (ClientSocket == INVALID_SOCKET)
+    {
+        skip("ERROR: Client socket creation failed\n");
+        closesocket(ServerSocket);
+        return;
+    }
+    ent = gethostbyname("127.0.0.1");
+    if (ent == NULL)
+    {
+        ok(ent != NULL, "ERROR: gethostbyname '127.0.0.1' failed, trying 
'localhost'\n");
+        ent = gethostbyname("localhost");
+
+        if (ent == NULL)
+        {
+            skip("ERROR: gethostbyname 'localhost' failed\n");
+            goto done;
+        }
+    }
+
+    server_addr_in.sin_family = AF_INET;
+    server_addr_in.sin_port = htons(SVR_PORT);
+    memcpy(&server_addr_in.sin_addr.S_un.S_addr, ent->h_addr_list[0], 4);
+
+    // server inialialization
+    trace("Initializing server and client connections ...\n");
+    ok(bind(ServerSocket, (struct sockaddr*)&server_addr_in, 
sizeof(server_addr_in)) == 0, "ERROR: server bind failed\n");
+    ok(ioctlsocket(ServerSocket, FIONBIO, &ulValue) == 0, "ERROR: server 
ioctlsocket FIONBIO failed\n");
+
+    // client inialialization
+    ok(ioctlsocket(ClientSocket, FIONBIO, &ulValue) == 0, "ERROR: client 
ioctlsocket FIONBIO failed\n");
+
+    // listen
+    trace("Starting server listening mode ...\n");
+    ok(listen(ServerSocket, SOMAXCONN) == 0, "ERROR: cannot initialize server 
listen\n");
+
+    memset(&timeval, 0, sizeof(timeval));
+    timeval.tv_usec = WAIT_TIMEOUT_;
+    dwFlags = 0;
+
+    while (dwFlags != EXIT_FLAGS)
+    {
+        len = sizeof(addr_con_loc);
+        nSockNameRes = getsockname(ClientSocket, (struct 
sockaddr*)&addr_con_loc, &len);
+        if (dwFlags == 0 && !ConnectSent)
+        {
+            ok(nSockNameRes == SOCKET_ERROR, "ERROR: getsockname function 
failed, expected %d error %d\n", SOCKET_ERROR, nSockNameRes);
+            ok(WSAGetLastError() == WSAEINVAL, "ERROR: getsockname function 
failed, expected %ld error %d\n", WSAEINVAL, WSAGetLastError());
+            trace("Starting client to server connection ...\n");
+            // connect
+            nConRes = connect(ClientSocket, (struct sockaddr*)&server_addr_in, 
sizeof(server_addr_in));
+            ok(nConRes == SOCKET_ERROR, "ERROR: client connect() result is not 
SOCKET_ERROR\n");
+            ok(WSAGetLastError() == WSAEWOULDBLOCK, "ERROR: client connect() 
last error is not WSAEWOULDBLOCK\n");
+            ConnectSent = TRUE;
+            continue;
+        }
+        else
+        {
+            ok(nSockNameRes == 0, "ERROR: getsockname function failed, 
expected %d error %d\n", 0, nSockNameRes);
+            ok(len == sizeof(addr_con_loc), "ERROR: getsockname function wrong 
size, expected %d returned %d\n", sizeof(addr_con_loc), len);
+            ok(addr_con_loc.sin_addr.s_addr == server_addr_in.sin_addr.s_addr, 
"ERROR: getsockname function wrong addr, expected %lx returned %lx\n", 
server_addr_in.sin_addr.s_addr, addr_con_loc.sin_addr.s_addr);
+        }
+        if ((dwFlags & FD_ACCEPT) != 0)
+        {// client connected
+            trace("Select CONNECT...\n");
+            dwFlags |= FD_CONNECT;
+        }
+
+        FD_ZERO(&select_rfds);
+        FD_ZERO(&select_wfds);
+        FD_ZERO(&select_efds);
+        FD_SET(ServerSocket, &select_rfds);
+        FD_SET(ClientSocket, &select_rfds);
+        FD_SET(ServerSocket, &select_wfds);
+        FD_SET(ClientSocket, &select_wfds);
+        FD_SET(ServerSocket, &select_efds);
+        FD_SET(ClientSocket, &select_efds);
+        if ((dwFlags & FD_ACCEPT) != 0)
+        {
+            FD_SET(sockaccept, &select_rfds);
+            FD_SET(sockaccept, &select_wfds);
+            FD_SET(sockaccept, &select_efds);
+        }
+        if (select(0, &select_rfds, &select_wfds, &select_efds, &timeval) != 0)
+        {// connection accepted
+            if (dwFlags == (FD_ACCEPT | FD_CONNECT))
+            {
+                trace("Select ACCEPT&CONNECT...\n");
+                ok(FD_ISSET(ClientSocket, &select_wfds), "ClientSocket is not 
writable\n");
+                ok(FD_ISSET(sockaccept, &select_wfds), "sockaccept is not 
writable\n");
+                ok(!FD_ISSET(ServerSocket, &select_rfds), "ServerSocket is 
readable\n");
+            }
+            if (dwFlags == FD_ACCEPT)
+            {
+                trace("Select ACCEPT...\n");
+                ok(!FD_ISSET(ClientSocket, &select_wfds), "ClientSocket is 
writable\n");
+                ok(FD_ISSET(sockaccept, &select_wfds), "sockaccept is not 
writable\n");
+                ok(FD_ISSET(ServerSocket, &select_rfds), "ServerSocket is not 
readable\n");
+            }
+            if (dwFlags == 0)
+            {
+                if (FD_ISSET(ServerSocket, &select_rfds))
+                {
+                    trace("Select ACCEPT...\n");
+                    addrsize = sizeof(addr_remote);
+                    sockaccept = accept(ServerSocket, (struct 
sockaddr*)&addr_remote, &addrsize);
+                    ok(sockaccept != INVALID_SOCKET, "ERROR: Connection accept 
function failed, error %d\n", WSAGetLastError());
+                    dwFlags |= FD_ACCEPT;
+                }
+            }
+        }
+    }
 
 done:
     WSACloseEvent(ServerEvent);
     WSACloseEvent(ClientEvent);
+    closesocket(sockaccept);
     closesocket(ServerSocket);
     closesocket(ClientSocket);
 


Reply via email to