Owen Rudge : ws2_32/tests: Test IP address conversion in getaddrinfo.

Alexandre Julliard julliard at winehq.org
Tue Jun 13 16:14:50 CDT 2017


Module: wine
Branch: master
Commit: 93323bcf6c124b7681fcb88426efde10633972cf
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=93323bcf6c124b7681fcb88426efde10633972cf

Author: Owen Rudge <orudge at codeweavers.com>
Date:   Tue Jun 13 02:07:50 2017 -0300

ws2_32/tests: Test IP address conversion in getaddrinfo.

Signed-off-by: Bruno Jesus <bjesus at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ws2_32/tests/sock.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 107 insertions(+), 1 deletion(-)

diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 677a750..23464ac 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -7335,11 +7335,35 @@ static void test_GetAddrInfoW(void)
     ok(result2 == NULL, "got %p\n", result2);
 }
 
+static void verify_ipv6_addrinfo(ADDRINFOA *result, const char *expectedIp)
+{
+    SOCKADDR_IN6 *sockaddr6;
+    char ipBuffer[256];
+    const char *ret;
+
+    ok(result->ai_family == AF_INET6, "ai_family == %d\n", result->ai_family);
+    ok(result->ai_addrlen >= sizeof(struct sockaddr_in6), "ai_addrlen == %d\n", (int)result->ai_addrlen);
+    ok(result->ai_addr != NULL, "ai_addr == NULL\n");
+
+    if (result->ai_addr != NULL)
+    {
+        sockaddr6 = (SOCKADDR_IN6 *)result->ai_addr;
+        ok(sockaddr6->sin6_family == AF_INET6, "ai_addr->sin6_family == %d\n", sockaddr6->sin6_family);
+        ok(sockaddr6->sin6_port == 0, "ai_addr->sin6_port == %d\n", sockaddr6->sin6_port);
+
+        ZeroMemory(ipBuffer, sizeof(ipBuffer));
+        ret = pInetNtop(AF_INET6, &sockaddr6->sin6_addr, ipBuffer, sizeof(ipBuffer));
+        ok(ret != NULL, "inet_ntop failed (%d)\n", WSAGetLastError());
+        ok(strcmp(ipBuffer, expectedIp) == 0, "ai_addr->sin6_addr == '%s' (expected '%s')\n", ipBuffer, expectedIp);
+    }
+}
+
 static void test_getaddrinfo(void)
 {
     int i, ret;
     ADDRINFOA *result, *result2, *p, hint;
-    CHAR name[256];
+    SOCKADDR_IN *sockaddr;
+    CHAR name[256], *ip;
     DWORD size = sizeof(name);
 
     if (!pgetaddrinfo || !pfreeaddrinfo)
@@ -7469,6 +7493,88 @@ static void test_getaddrinfo(void)
     ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
     ok(result == NULL, "got %p\n", result);
 
+    /* Test IPv4 address conversion */
+    result = NULL;
+    ret = pgetaddrinfo("192.168.1.253", NULL, NULL, &result);
+    ok(!ret, "getaddrinfo failed with %d\n", ret);
+    ok(result->ai_family == AF_INET, "ai_family == %d\n", result->ai_family);
+    ok(result->ai_addrlen >= sizeof(struct sockaddr_in), "ai_addrlen == %d\n", (int)result->ai_addrlen);
+    ok(result->ai_addr != NULL, "ai_addr == NULL\n");
+    sockaddr = (SOCKADDR_IN *)result->ai_addr;
+    ok(sockaddr->sin_family == AF_INET, "ai_addr->sin_family == %d\n", sockaddr->sin_family);
+    ok(sockaddr->sin_port == 0, "ai_addr->sin_port == %d\n", sockaddr->sin_port);
+
+    ip = inet_ntoa(sockaddr->sin_addr);
+    ok(strcmp(ip, "192.168.1.253") == 0, "sockaddr->ai_addr == '%s'\n", ip);
+    pfreeaddrinfo(result);
+
+    /* Test IPv4 address conversion with port */
+    result = NULL;
+    hint.ai_flags = AI_NUMERICHOST;
+    ret = pgetaddrinfo("192.168.1.253:1024", NULL, &hint, &result);
+    hint.ai_flags = 0;
+    ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo returned unexpected result: %d\n", ret);
+    ok(result == NULL, "expected NULL, got %p\n", result);
+
+    /* Test IPv6 address conversion */
+    result = NULL;
+    SetLastError(0xdeadbeef);
+    ret = pgetaddrinfo("2a00:2039:dead:beef:cafe::6666", NULL, NULL, &result);
+
+    if (result != NULL)
+    {
+        ok(!ret, "getaddrinfo failed with %d\n", ret);
+        verify_ipv6_addrinfo(result, "2a00:2039:dead:beef:cafe::6666");
+        pfreeaddrinfo(result);
+
+        /* Test IPv6 address conversion with brackets */
+        result = NULL;
+        ret = pgetaddrinfo("[beef::cafe]", NULL, NULL, &result);
+        ok(!ret, "getaddrinfo failed with %d\n", ret);
+        verify_ipv6_addrinfo(result, "beef::cafe");
+        pfreeaddrinfo(result);
+
+        /* Test IPv6 address conversion with brackets and hints */
+        memset(&hint, 0, sizeof(ADDRINFOA));
+        hint.ai_flags = AI_NUMERICHOST;
+        hint.ai_family = AF_INET6;
+        result = NULL;
+        ret = pgetaddrinfo("[beef::cafe]", NULL, &hint, &result);
+        ok(!ret, "getaddrinfo failed with %d\n", ret);
+        verify_ipv6_addrinfo(result, "beef::cafe");
+        pfreeaddrinfo(result);
+
+        memset(&hint, 0, sizeof(ADDRINFOA));
+        hint.ai_flags = AI_NUMERICHOST;
+        hint.ai_family = AF_INET;
+        result = NULL;
+        ret = pgetaddrinfo("[beef::cafe]", NULL, &hint, &result);
+        ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
+
+        /* Test IPv6 address conversion with brackets and port */
+        result = NULL;
+        ret = pgetaddrinfo("[beef::cafe]:10239", NULL, NULL, &result);
+        ok(!ret, "getaddrinfo failed with %d\n", ret);
+        verify_ipv6_addrinfo(result, "beef::cafe");
+        pfreeaddrinfo(result);
+
+        /* Test IPv6 address conversion with unmatched brackets */
+        result = NULL;
+        hint.ai_flags = AI_NUMERICHOST;
+        ret = pgetaddrinfo("[beef::cafe", NULL, &hint, &result);
+        ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
+
+        ret = pgetaddrinfo("beef::cafe]", NULL, &hint, &result);
+        ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
+    }
+    else
+    {
+        ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
+        win_skip("getaddrinfo does not support IPV6\n");
+    }
+
+    hint.ai_flags = 0;
+
     for (i = 0;i < (sizeof(hinttests) / sizeof(hinttests[0]));i++)
     {
         hint.ai_family = hinttests[i].family;




More information about the wine-cvs mailing list