[USP10_WINETEST] Sync with Wine Staging 2.9. CORE-13362
[reactos.git] / rostests / kmtests / tcpip / TcpIp_user.c
index 2b5da02..cf69981 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include <kmt_test.h>
+#include <winsock2.h>
 
 #include "tcpip.h"
 
@@ -35,3 +36,72 @@ START_TEST(TcpIpTdi)
 
     UnloadTcpIpTestDriver();
 }
+
+static
+DWORD
+WINAPI
+AcceptProc(
+    _In_ LPVOID Parameter)
+{
+    WORD WinsockVersion;
+    WSADATA WsaData;
+    int Error;
+    SOCKET ListenSocket, AcceptSocket;
+    struct sockaddr_in ListenAddress, AcceptAddress;
+    int AcceptAddressLength;
+    HANDLE ReadyToConnectEvent = (HANDLE)Parameter;
+
+    /* Initialize winsock */
+    WinsockVersion = MAKEWORD(2, 0);
+    Error = WSAStartup(WinsockVersion, &WsaData);
+    ok(Error == 0, "");
+
+    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+    ok_bool_true(ListenSocket != INVALID_SOCKET, "socket failed");
+
+    ZeroMemory(&ListenAddress, sizeof(ListenAddress));
+    ListenAddress.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
+    ListenAddress.sin_port = htons(TEST_CONNECT_SERVER_PORT);
+    ListenAddress.sin_family = AF_INET;
+
+    Error = bind(ListenSocket, (struct sockaddr*)&ListenAddress, sizeof(ListenAddress));
+    ok(Error == 0, "");
+
+    Error = listen(ListenSocket, 1);
+    ok(Error == 0, "");
+
+    SetEvent(ReadyToConnectEvent);
+
+    AcceptAddressLength = sizeof(AcceptAddress);
+    AcceptSocket = accept(ListenSocket, (struct sockaddr*)&AcceptAddress, &AcceptAddressLength);
+    ok(AcceptSocket != INVALID_SOCKET, "\n");
+    ok_eq_long(AcceptAddressLength, sizeof(AcceptAddress));
+    ok_eq_hex(AcceptAddress.sin_addr.S_un.S_addr, inet_addr("127.0.0.1"));
+    ok_eq_hex(AcceptAddress.sin_port, ntohs(TEST_CONNECT_CLIENT_PORT));
+
+    return 0;
+}
+
+START_TEST(TcpIpConnect)
+{
+    HANDLE AcceptThread;
+    HANDLE ReadyToConnectEvent;
+
+    ReadyToConnectEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+    ok(ReadyToConnectEvent != NULL, "\n");
+
+    AcceptThread = CreateThread(NULL, 0, AcceptProc, (PVOID)ReadyToConnectEvent, 0, NULL);
+    ok(AcceptThread != NULL, "");
+
+    WaitForSingleObject(ReadyToConnectEvent, INFINITE);
+
+    LoadTcpIpTestDriver();
+
+    ok(KmtSendToDriver(IOCTL_TEST_CONNECT) == ERROR_SUCCESS, "\n");
+
+    WaitForSingleObject(AcceptThread, INFINITE);
+
+    UnloadTcpIpTestDriver();
+
+    WSACleanup();
+}