Author: phater
Date: Fri Oct 28 07:01:16 2016
New Revision: 73052

URL: http://svn.reactos.org/svn/reactos?rev=73052&view=rev
Log:
[WS2_32_APITESTS] Add tests for WSAAsync original by Miroslav Mastný. Converted 
to api test by me.
CORE-12152 #resolve #comment Thanks

Added:
    trunk/rostests/apitests/ws2_32/WSAAsync.c   (with props)
Modified:
    trunk/rostests/apitests/ws2_32/CMakeLists.txt
    trunk/rostests/apitests/ws2_32/testlist.c

Modified: trunk/rostests/apitests/ws2_32/CMakeLists.txt
URL: 
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/ws2_32/CMakeLists.txt?rev=73052&r1=73051&r2=73052&view=diff
==============================================================================
--- trunk/rostests/apitests/ws2_32/CMakeLists.txt       [iso-8859-1] (original)
+++ trunk/rostests/apitests/ws2_32/CMakeLists.txt       [iso-8859-1] Fri Oct 28 
07:01:16 2016
@@ -9,6 +9,7 @@
     nostartup.c
     recv.c
     send.c
+    WSAAsync.c
     WSAIoctl.c
     WSARecv.c
     WSAStartup.c

Added: trunk/rostests/apitests/ws2_32/WSAAsync.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/ws2_32/WSAAsync.c?rev=73052
==============================================================================
--- trunk/rostests/apitests/ws2_32/WSAAsync.c   (added)
+++ trunk/rostests/apitests/ws2_32/WSAAsync.c   [iso-8859-1] Fri Oct 28 
07:01:16 2016
@@ -0,0 +1,167 @@
+/*
+* PROJECT:         ReactOS api tests
+* LICENSE:         GPL - See COPYING in the top level directory
+* PURPOSE:         Test for WSAAsync
+* PROGRAMMERS:     Miroslav Mastny 
+*/
+
+#include <apitest.h>
+
+#include <stdio.h>
+#include <windows.h>
+#include <winsock2.h>
+
+#define SVR_PORT 5000
+#define WAIT_TIMEOUT_ 10000
+#define EXIT_FLAGS (FD_ACCEPT|FD_CONNECT)
+
+START_TEST(WSAAsync)
+{
+    WSADATA    WsaData;
+    SOCKET     ServerSocket = INVALID_SOCKET,
+               ClientSocket = INVALID_SOCKET;
+    WSAEVENT   ServerEvent = WSA_INVALID_EVENT,
+               ClientEvent = WSA_INVALID_EVENT;
+    struct hostent *ent = NULL;
+    struct sockaddr_in server_addr_in;
+    struct sockaddr_in addr_remote;
+    struct sockaddr_in addr_con_loc;
+    int nConRes;
+    int addrsize, len;
+    WSAEVENT fEvents[2];
+    SOCKET fSockets[2];
+    SOCKET sockaccept;
+    WSANETWORKEVENTS WsaNetworkEvents;
+    ULONG ulValue = 1;
+    DWORD dwWait;
+    DWORD dwFlags = 0;
+
+    if (WSAStartup(MAKEWORD(2, 2), &WsaData) != 0)
+    {
+        skip("WSAStartup failed\n");
+        return;
+    }
+
+    ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+    ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+    ServerEvent  = WSACreateEvent();
+    ClientEvent  = WSACreateEvent();
+
+    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;
+    }
+    if (ServerEvent == WSA_INVALID_EVENT)
+    {
+        skip("ERROR: Server WSAEvent creation failed\n");
+        closesocket(ClientSocket);
+        closesocket(ServerSocket);
+        return;
+    }
+    if (ClientEvent == WSA_INVALID_EVENT)
+    {
+        skip("ERROR: Client WSAEvent creation failed\n");
+        WSACloseEvent(ServerEvent);
+        closesocket(ClientSocket);
+        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");
+    ok(WSAEventSelect(ServerSocket, ServerEvent, FD_ACCEPT | FD_CLOSE) == 0, 
"ERROR: server accept EventSelect failed\n");
+
+    // client inialialization
+    ok(WSAEventSelect(ClientSocket, ClientEvent, FD_CONNECT | FD_CLOSE) == 0, 
"ERROR: client EventSelect failed\n");
+    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");
+
+    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");
+
+    fSockets[0] = ServerSocket;
+    fSockets[1] = ClientSocket;
+
+    fEvents[0] = ServerEvent;
+    fEvents[1] = ClientEvent;
+
+    while (dwFlags != EXIT_FLAGS)
+    {
+        dwWait = WaitForMultipleObjects(2, fEvents, FALSE, WAIT_TIMEOUT_);
+
+        ok(dwWait == WAIT_OBJECT_0 || // server socket event
+           dwWait == WAIT_OBJECT_0+1, // client socket event
+           "Unknown event received %ld\n", dwWait);
+        if (dwWait != WAIT_OBJECT_0 && dwWait != WAIT_OBJECT_0+1)
+        {
+            skip("ERROR: Connection timeout\n");
+            break;
+        }
+
+        WSAEnumNetworkEvents(fSockets[dwWait-WAIT_OBJECT_0], 
fEvents[dwWait-WAIT_OBJECT_0], &WsaNetworkEvents);
+
+        if ((WsaNetworkEvents.lNetworkEvents & FD_ACCEPT) != 0)
+        {// connection accepted
+            trace("Event FD_ACCEPT...\n");
+            ok(WsaNetworkEvents.iErrorCode[FD_ACCEPT_BIT] == 0, "Error on 
accept %d\n", WsaNetworkEvents.iErrorCode[FD_ACCEPT_BIT]);
+            if (WsaNetworkEvents.iErrorCode[FD_ACCEPT_BIT] == 0)
+            {
+                addrsize = sizeof(addr_remote);
+                sockaccept = accept(fSockets[dwWait - WAIT_OBJECT_0], (struct 
sockaddr*)&addr_remote, &addrsize);
+                ok(sockaccept != INVALID_SOCKET, "ERROR: Connection accept 
function failed, error %ld\n", WSAGetLastError());
+                dwFlags |= FD_ACCEPT;
+            }
+        }
+ 
+        if ((WsaNetworkEvents.lNetworkEvents & FD_CONNECT) != 0)
+        {// client connected
+            trace("Event FD_CONNECT...\n");
+            ok(WsaNetworkEvents.iErrorCode[FD_CONNECT_BIT] == 0, "Error on 
connect %d\n", WsaNetworkEvents.iErrorCode[FD_CONNECT_BIT]);
+            if (WsaNetworkEvents.iErrorCode[FD_CONNECT_BIT] == 0)
+            {
+                len = sizeof(addr_con_loc);
+                ok(getsockname(fSockets[dwWait - WAIT_OBJECT_0], (struct 
sockaddr*)&addr_con_loc, &len) == 0, "\n");
+                dwFlags |= FD_CONNECT;
+            }
+        }
+    }
+
+done:
+    WSACloseEvent(ServerEvent);
+    WSACloseEvent(ClientEvent);
+    closesocket(ServerSocket);
+    closesocket(ClientSocket);
+
+    WSACleanup();
+}

Propchange: trunk/rostests/apitests/ws2_32/WSAAsync.c
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: trunk/rostests/apitests/ws2_32/testlist.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/ws2_32/testlist.c?rev=73052&r1=73051&r2=73052&view=diff
==============================================================================
--- trunk/rostests/apitests/ws2_32/testlist.c   [iso-8859-1] (original)
+++ trunk/rostests/apitests/ws2_32/testlist.c   [iso-8859-1] Fri Oct 28 
07:01:16 2016
@@ -11,6 +11,7 @@
 extern void func_nostartup(void);
 extern void func_recv(void);
 extern void func_send(void);
+extern void func_WSAAsync(void);
 extern void func_WSAIoctl(void);
 extern void func_WSARecv(void);
 extern void func_WSAStartup(void);
@@ -25,6 +26,7 @@
     { "nostartup", func_nostartup },
     { "recv", func_recv },
     { "send", func_send },
+    { "WSAAsync", func_WSAAsync },
     { "WSAIoctl", func_WSAIoctl },
     { "WSARecv", func_WSARecv },
     { "WSAStartup", func_WSAStartup },


Reply via email to