From 0625dd8bf6f60a90f33e2000c9c48860b01596ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=BCller?= Date: Wed, 20 Apr 2016 16:03:48 +0200 Subject: [PATCH] ws2_32/tests: Add initial tests for DisconnectEx. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michael Müller Signed-off-by: Sebastian Lackner Signed-off-by: Bruno Jesus <00cpxxx@gmail.com> Signed-off-by: Alexandre Julliard --- dlls/ws2_32/tests/sock.c | 97 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index d5e01c8f1b9..e5da804af44 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -7810,6 +7810,102 @@ end: closesocket(connector2); } +static void test_DisconnectEx(void) +{ + SOCKET listener, acceptor, connector; + LPFN_DISCONNECTEX pDisconnectEx; + GUID disconnectExGuid = WSAID_DISCONNECTEX; + struct sockaddr_in address; + DWORD num_bytes, flags; + OVERLAPPED overlapped; + int addrlen, iret; + BOOL bret; + + connector = socket(AF_INET, SOCK_STREAM, 0); + ok(connector != INVALID_SOCKET, "failed to create connector socket, error %d\n", WSAGetLastError()); + + iret = WSAIoctl(connector, SIO_GET_EXTENSION_FUNCTION_POINTER, &disconnectExGuid, sizeof(disconnectExGuid), + &pDisconnectEx, sizeof(pDisconnectEx), &num_bytes, NULL, NULL); + if (iret) + { + skip("WSAIoctl failed to get DisconnectEx, error %d\n", WSAGetLastError()); + closesocket(connector); + return; + } + + listener = socket(AF_INET, SOCK_STREAM, 0); + ok(listener != INVALID_SOCKET, "failed to create listener socket, error %d\n", WSAGetLastError()); + + memset(&address, 0, sizeof(address)); + address.sin_family = AF_INET; + address.sin_addr.s_addr = inet_addr("127.0.0.1"); + iret = bind(listener, (struct sockaddr *)&address, sizeof(address)); + ok(iret == 0, "failed to bind, error %d\n", WSAGetLastError()); + + addrlen = sizeof(address); + iret = getsockname(listener, (struct sockaddr *)&address, &addrlen); + ok(iret == 0, "failed to lookup bind address, error %d\n", WSAGetLastError()); + + iret = listen(listener, 1); + ok(iret == 0, "failed to listen, error %d\n", WSAGetLastError()); + + set_blocking(listener, TRUE); + + memset(&overlapped, 0, sizeof(overlapped)); + bret = pDisconnectEx(INVALID_SOCKET, &overlapped, 0, 0); + ok(bret == FALSE, "DisconnectEx unexpectedly succeeded\n"); + ok(WSAGetLastError() == WSAENOTSOCK, "expected WSAENOTSOCK, got %d\n", WSAGetLastError()); + + memset(&overlapped, 0, sizeof(overlapped)); + bret = pDisconnectEx(connector, &overlapped, 0, 0); + ok(bret == FALSE, "DisconnectEx unexpectedly succeeded\n"); + ok(WSAGetLastError() == WSAENOTCONN, "expected WSAENOTCONN, got %d\n", WSAGetLastError()); + + iret = connect(connector, (struct sockaddr *)&address, addrlen); + ok(iret == 0, "failed to connect, error %d\n", WSAGetLastError()); + + acceptor = accept(listener, NULL, NULL); + ok(acceptor != INVALID_SOCKET, "could not accept socket, error %d\n", WSAGetLastError()); + + memset(&overlapped, 0, sizeof(overlapped)); + overlapped.hEvent = WSACreateEvent(); + ok(overlapped.hEvent != WSA_INVALID_EVENT, "WSACreateEvent failed, error %d\n", WSAGetLastError()); + bret = pDisconnectEx(connector, &overlapped, 0, 0); + if (bret) + ok(overlapped.Internal == STATUS_PENDING, "expected STATUS_PENDING, got %08lx\n", overlapped.Internal); + else if (WSAGetLastError() == ERROR_IO_PENDING) + bret = WSAGetOverlappedResult(connector, &overlapped, &num_bytes, TRUE, &flags); + ok(bret, "DisconnectEx failed, error %d\n", WSAGetLastError()); + WSACloseEvent(overlapped.hEvent); + + iret = connect(connector, (struct sockaddr *)&address, sizeof(address)); + ok(iret != 0, "connect unexpectedly succeeded\n"); + ok(WSAGetLastError() == WSAEISCONN, "expected WSAEISCONN, got %d\n", WSAGetLastError()); + + closesocket(acceptor); + closesocket(connector); + + connector = socket(AF_INET, SOCK_STREAM, 0); + ok(connector != INVALID_SOCKET, "failed to create connector socket, error %d\n", WSAGetLastError()); + + iret = connect(connector, (struct sockaddr *)&address, addrlen); + ok(iret == 0, "failed to connect, error %d\n", WSAGetLastError()); + + acceptor = accept(listener, NULL, NULL); + ok(acceptor != INVALID_SOCKET, "could not accept socket, error %d\n", WSAGetLastError()); + + bret = pDisconnectEx(connector, NULL, 0, 0); + ok(bret, "DisconnectEx failed, error %d\n", WSAGetLastError()); + + iret = connect(connector, (struct sockaddr *)&address, sizeof(address)); + ok(iret != 0, "connect unexpectedly succeeded\n"); + ok(WSAGetLastError() == WSAEISCONN, "expected WSAEISCONN, got %d\n", WSAGetLastError()); + + closesocket(acceptor); + closesocket(connector); + closesocket(listener); +} + #define compare_file(h,s,o) compare_file2(h,s,o,__FILE__,__LINE__) static void compare_file2(HANDLE handle, SOCKET sock, int offset, const char *file, int line) @@ -9588,6 +9684,7 @@ START_TEST( sock ) test_getaddrinfo(); test_AcceptEx(); test_ConnectEx(); + test_DisconnectEx(); test_sioRoutingInterfaceQuery(); test_sioAddressListChange();