diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index 54b0840cdfc..9a90454cd7d 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -3859,7 +3859,7 @@ static void test_addr_to_print(void) static void test_ioctlsocket(void) { - SOCKET sock; + SOCKET sock, src, dst; struct tcp_keepalive kalive; int ret, optval; static const LONG cmds[] = {FIONBIO, FIONREAD, SIOCATMARK}; @@ -3943,6 +3943,32 @@ static void test_ioctlsocket(void) ok(ret == 0 || broken(ret == SOCKET_ERROR), "WSAIoctl failed unexpectedly\n"); closesocket(sock); + + if (tcp_socketpair(&src, &dst) != 0) + { + ok(0, "creating socket pair failed, skipping test\n"); + return; + } + + /* test FIONREAD on TCP sockets */ + optval = 0xdeadbeef; + ret = WSAIoctl(dst, FIONREAD, NULL, 0, &optval, sizeof(optval), &arg, NULL, NULL); + ok(ret == 0, "WSAIoctl failed unexpectedly with error %d\n", WSAGetLastError()); + ok(optval == 0, "FIONREAD should have returned 0 bytes, got %d instead\n", optval); + + optval = 0xdeadbeef; + ok(send(src, "TEST", 4, 0) == 4, "failed to send test data\n"); + Sleep(100); + ret = WSAIoctl(dst, FIONREAD, NULL, 0, &optval, sizeof(optval), &arg, NULL, NULL); + ok(ret == 0, "WSAIoctl failed unexpectedly with error %d\n", WSAGetLastError()); + ok(optval == 4, "FIONREAD should have returned 4 bytes, got %d instead\n", optval); + + closesocket(dst); + optval = 0xdeadbeef; + ret = WSAIoctl(dst, FIONREAD, NULL, 0, &optval, sizeof(optval), &arg, NULL, NULL); + ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n"); + ok(optval == 0xdeadbeef, "FIONREAD should not have changed last error, got %d instead\n", optval); + closesocket(src); } static BOOL drain_pause = FALSE;