ws2_32/tests: Add and update WSASocketA() tests

Bruno Jesus 00cpxxx at gmail.com
Thu Aug 1 19:51:31 CDT 2013


This patch adds a few more tests that were not present before and also
update the WSAEnumProtocols test using the correct way to detect the
first entry to be used in auto protocol/socket type detection. Also
fixes the last test that was not useful.

After this patch the next steps are:
implement getsockopt(SO_PROTOCOL_INFO)
fix WSADuplicate
fix WSASocket
-------------- next part --------------
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 7e70449..5ce4959 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 3e060e5..7516d25 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


More information about the wine-patches mailing list