From ce0e3158b2e8ac9c2e946f700727ef79537ff972 Mon Sep 17 00:00:00 2001 From: Bruno Jesus <00cpxxx@gmail.com> Date: Thu, 1 Aug 2013 21:51:31 -0300 Subject: [PATCH] ws2_32/tests: Add and update WSASocketA() tests. --- dlls/ws2_32/tests/sock.c | 58 +++++++++++++++++++++++++++++++++++++++++------- include/winsock2.h | 6 +++++ 2 files changed, 56 insertions(+), 8 deletions(-) diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index 7e70449b97d..5ce4959bb07 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -1701,6 +1701,22 @@ todo_wine ok(sock != INVALID_SOCKET, "WSASocketA should have succeeded\n"); closesocket(sock); + /* SOCK_STREAM does not support IPPROTO_UDP */ + SetLastError(0xdeadbeef); + ok(WSASocketA(AF_INET, SOCK_STREAM, IPPROTO_UDP, NULL, 0, 0) == INVALID_SOCKET, + "WSASocketA should have failed\n"); + err = WSAGetLastError(); +todo_wine + ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err); + + /* SOCK_DGRAM does not support IPPROTO_TCP */ + SetLastError(0xdeadbeef); + ok(WSASocketA(AF_INET, SOCK_DGRAM, IPPROTO_TCP, NULL, 0, 0) == INVALID_SOCKET, + "WSASocketA should have failed\n"); + err = WSAGetLastError(); +todo_wine + ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err); + /* Set pi_size explicitly to a value below 2*sizeof(WSAPROTOCOL_INFOA) * to avoid a crash on win98. */ @@ -1739,6 +1755,18 @@ todo_wine pi[0].iProtocol = IPPROTO_UDP; pi[0].iSocketType = SOCK_DGRAM; pi[0].iAddressFamily = AF_INET; + sock = WSASocketA(0, 0, 0, &pi[0], 0, 0); +todo_wine { + ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n", + WSAGetLastError()); + size = sizeof(socktype); + socktype = 0xdead; + err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size); + ok(!err,"getsockopt failed with %d\n", WSAGetLastError()); + ok(socktype == SOCK_DGRAM, "Wrong socket type, expected %d received %d\n", + SOCK_DGRAM, socktype); + closesocket(sock); +} sock = WSASocketA(AF_INET, SOCK_STREAM, IPPROTO_TCP, &pi[0], 0, 0); ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n", WSAGetLastError()); @@ -1771,7 +1799,9 @@ todo_wine ok(items != SOCKET_ERROR, "WSAEnumProtocolsA failed, last error is %d\n", WSAGetLastError()); - /* when no protocol is specified the first socket type from WSAEnumProtocols is returned */ + /* when no protocol and socket type are specified the first entry + * from WSAEnumProtocols that has the flag PFL_MATCHES_PROTOCOL_ZERO + * is returned */ sock = WSASocketA(AF_INET, 0, 0, NULL, 0, 0); todo_wine ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n", @@ -1782,12 +1812,21 @@ todo_wine { socktype = 0xdead; err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size); ok(!err, "getsockopt failed with %d\n", WSAGetLastError()); - ok(socktype == pi[0].iSocketType, "Wrong socket type, expected %d received %d\n", - pi[0].iSocketType, socktype); + for(i = 0; i < items; i++) + { + if(pi[i].dwProviderFlags & PFL_MATCHES_PROTOCOL_ZERO) + { + ok(socktype == pi[i].iSocketType, "Wrong socket type, expected %d received %d\n", + pi[i].iSocketType, socktype); + break; + } + } + ok(i != items, "Creating a socket without protocol and socket type didn't work\n"); } closesocket(sock); - /* when the protocol is specified the first socket type that matches the protocol is returned */ + /* when no socket type is specified the first entry from WSAEnumProtocols + * that matches the protocol is returned */ for (i = 0; i < sizeof(autoprotocols) / sizeof(autoprotocols[0]); i++) { sock = WSASocketA(0, 0, autoprotocols[i], NULL, 0, 0); @@ -1801,18 +1840,21 @@ todo_wine todo_wine ok(!err, "getsockopt failed with %d\n", WSAGetLastError()); - for (j = 0; j < items; j++) + for (err = 1, j = 0; j < items; j++) { if (pi[j].iProtocol == autoprotocols[i]) { + if (socktype == pi[j].iSocketType) + err = 0; + else todo_wine - ok(socktype == pi[j].iSocketType, "Wrong socket type, expected %d received %d\n", - pi[j].iSocketType, socktype); + ok(0, "Wrong socket type, expected %d received %d\n", + pi[j].iSocketType, socktype); break; } } todo_wine - ok(socktype != 0xdead, "Protocol %d not found in WSAEnumProtocols\n", autoprotocols[i]); + ok(!err, "Protocol %d not found in WSAEnumProtocols\n", autoprotocols[i]); closesocket(sock); } diff --git a/include/winsock2.h b/include/winsock2.h index 3e060e5c0d0..7516d25c1de 100644 --- a/include/winsock2.h +++ b/include/winsock2.h @@ -213,6 +213,12 @@ typedef struct _WSAPROTOCOLCHAIN DWORD ChainEntries[MAX_PROTOCOL_CHAIN]; /* a list of dwCatalogEntryIds */ } WSAPROTOCOLCHAIN, * LPWSAPROTOCOLCHAIN; +/* constants used in dwProviderFlags from struct WSAPROTOCOL_INFO */ +#define PFL_MULTIPLE_PROTO_ENTRIES 0x00000001 +#define PFL_RECOMMENDED_PROTO_ENTRY 0x00000002 +#define PFL_HIDDEN 0x00000004 +#define PFL_MATCHES_PROTOCOL_ZERO 0x00000008 + #define XP1_CONNECTIONLESS 0x00000001 #define XP1_GUARANTEED_DELIVERY 0x00000002 #define XP1_GUARANTEED_ORDER 0x00000004 -- 2.11.4.GIT