Zebediah Figura : ws2_32/tests: Add more tests for SO_CONNECT_TIME.

Alexandre Julliard julliard at winehq.org
Tue Jul 19 15:55:01 CDT 2022


Module: wine
Branch: master
Commit: 913a96d753e756fbca1c66c902c2bbb0be7038f1
URL:    https://gitlab.winehq.org/wine/wine/-/commit/913a96d753e756fbca1c66c902c2bbb0be7038f1

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Sun May 29 11:31:18 2022 -0500

ws2_32/tests: Add more tests for SO_CONNECT_TIME.

---

 dlls/ws2_32/tests/sock.c | 90 +++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 74 insertions(+), 16 deletions(-)

diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 32872e1b683..c00d156d354 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -7841,7 +7841,7 @@ static void test_AcceptEx(void)
     const struct sockaddr_in bind_addr = {.sin_family = AF_INET, .sin_addr.s_addr = htonl(INADDR_LOOPBACK)};
     SOCKET listener, acceptor, acceptor2, connector, connector2;
     struct sockaddr_in bindAddress, peerAddress, *readBindAddress, *readRemoteAddress;
-    int socklen, optlen;
+    int socklen, iret, localSize = sizeof(struct sockaddr_in), remoteSize = localSize;
     GUID acceptExGuid = WSAID_ACCEPTEX, getAcceptExGuid = WSAID_GETACCEPTEXSOCKADDRS;
     GUID connectex_guid = WSAID_CONNECTEX;
     LPFN_ACCEPTEX pAcceptEx = NULL;
@@ -7849,12 +7849,10 @@ static void test_AcceptEx(void)
     LPFN_CONNECTEX pConnectEx = NULL;
     fd_set fds_accept, fds_send;
     static const struct timeval timeout = {1, 0};
-    DWORD bytesReturned, connect_time;
     char buffer[1024], ipbuffer[32];
     OVERLAPPED overlapped = {0}, overlapped2 = {0};
-    int iret, localSize = sizeof(struct sockaddr_in), remoteSize = localSize;
+    DWORD bytesReturned, dwret;
     BOOL bret;
-    DWORD dwret;
 
     overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
     overlapped2.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
@@ -8188,22 +8186,10 @@ static void test_AcceptEx(void)
     ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
     ok(overlapped.Internal == STATUS_PENDING, "got %08lx\n", (ULONG)overlapped.Internal);
 
-    connect_time = 0xdeadbeef;
-    optlen = sizeof(connect_time);
-    iret = getsockopt(connector, SOL_SOCKET, SO_CONNECT_TIME, (char *)&connect_time, &optlen);
-    ok(!iret, "getsockopt failed %d\n", WSAGetLastError());
-    ok(connect_time == ~0u, "unexpected connect time %lu\n", connect_time);
-
     /* AcceptEx() still won't complete until we send data */
     iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
     ok(iret == 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
 
-    connect_time = 0xdeadbeef;
-    optlen = sizeof(connect_time);
-    iret = getsockopt(connector, SOL_SOCKET, SO_CONNECT_TIME, (char *)&connect_time, &optlen);
-    ok(!iret, "getsockopt failed %d\n", WSAGetLastError());
-    ok(connect_time < 0xdeadbeef, "unexpected connect time %lu\n", connect_time);
-
     dwret = WaitForSingleObject(overlapped.hEvent, 0);
     ok(dwret == WAIT_TIMEOUT, "Waiting for accept event timeout failed with %ld + errno %ld\n", dwret, GetLastError());
     ok(overlapped.Internal == STATUS_PENDING, "got %08lx\n", (ULONG)overlapped.Internal);
@@ -12965,6 +12951,77 @@ static void test_icmp(void)
     closesocket(s);
 }
 
+static void test_connect_time(void)
+{
+    struct sockaddr_in addr = {.sin_family = AF_INET, .sin_addr.s_addr = htonl(INADDR_LOOPBACK)};
+    SOCKET client, server;
+    unsigned int time;
+    int ret, len;
+
+    client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+
+    len = sizeof(time);
+    SetLastError(0xdeadbeef);
+    ret = getsockopt(client, SOL_SOCKET, SO_CONNECT_TIME, (char *)&time, &len);
+    ok(!ret, "got %d\n", ret);
+    ok(!GetLastError(), "got error %lu\n", GetLastError());
+    ok(len == sizeof(time), "got len %d\n", len);
+    ok(time == ~0u, "got time %u\n", time);
+
+    closesocket(client);
+
+    tcp_socketpair(&client, &server);
+
+    len = sizeof(time);
+    SetLastError(0xdeadbeef);
+    ret = getsockopt(client, SOL_SOCKET, SO_CONNECT_TIME, (char *)&time, &len);
+    ok(!ret, "got %d\n", ret);
+    ok(!GetLastError(), "got error %lu\n", GetLastError());
+    ok(len == sizeof(time), "got len %d\n", len);
+    ok(time == 0, "got time %u\n", time);
+
+    len = sizeof(time);
+    SetLastError(0xdeadbeef);
+    ret = getsockopt(server, SOL_SOCKET, SO_CONNECT_TIME, (char *)&time, &len);
+    ok(!ret, "got %d\n", ret);
+    ok(!GetLastError(), "got error %lu\n", GetLastError());
+    ok(len == sizeof(time), "got len %d\n", len);
+    ok(time == 0, "got time %u\n", time);
+
+    closesocket(client);
+    closesocket(server);
+
+    client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+    server = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+
+    ret = bind(server, (struct sockaddr *)&addr, sizeof(addr));
+    ok(!ret, "got error %lu\n", GetLastError());
+    len = sizeof(addr);
+    ret = getsockname(server, (struct sockaddr *)&addr, &len);
+    ok(!ret, "got error %lu\n", GetLastError());
+    ret = connect(client, (struct sockaddr *)&addr, sizeof(addr));
+    ok(!ret, "got error %lu\n", GetLastError());
+
+    len = sizeof(time);
+    SetLastError(0xdeadbeef);
+    ret = getsockopt(client, SOL_SOCKET, SO_CONNECT_TIME, (char *)&time, &len);
+    ok(!ret, "got %d\n", ret);
+    ok(!GetLastError(), "got error %lu\n", GetLastError());
+    ok(len == sizeof(time), "got len %d\n", len);
+    todo_wine ok(time == ~0u, "got time %u\n", time);
+
+    len = sizeof(time);
+    SetLastError(0xdeadbeef);
+    ret = getsockopt(server, SOL_SOCKET, SO_CONNECT_TIME, (char *)&time, &len);
+    ok(!ret, "got %d\n", ret);
+    ok(!GetLastError(), "got error %lu\n", GetLastError());
+    ok(len == sizeof(time), "got len %d\n", len);
+    ok(time == ~0u, "got time %u\n", time);
+
+    closesocket(server);
+    closesocket(client);
+}
+
 START_TEST( sock )
 {
     int i;
@@ -12984,6 +13041,7 @@ START_TEST( sock )
     test_extendedSocketOptions();
     test_so_debug();
     test_sockopt_validity();
+    test_connect_time();
 
     for (i = 0; i < ARRAY_SIZE(tests); i++)
         do_test(&tests[i]);




More information about the wine-cvs mailing list