[PATCH 3/3] ntdll/tests: Add tests for RtlIpv4StringToAddressEx, RtlIpv6StringToAddress (try 2)
Mark Jansen
learn0more+wine at gmail.com
Sun Feb 15 11:05:04 CST 2015
Add test for RtlIpv6StringToAddressEx
---
dlls/ntdll/tests/rtl.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 140 insertions(+)
-------------- next part --------------
From 4d8a8dd231c112377ea93225a7cab069def272e6 Mon Sep 17 00:00:00 2001
From: Mark Jansen <learn0more+wine at gmail.com>
Date: Sun, 15 Feb 2015 16:28:41 +0100
Subject: Add test for RtlIpv6StringToAddressEx
---
dlls/ntdll/tests/rtl.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 140 insertions(+)
diff --git a/dlls/ntdll/tests/rtl.c b/dlls/ntdll/tests/rtl.c
index 37470a3..332e37b 100644
--- a/dlls/ntdll/tests/rtl.c
+++ b/dlls/ntdll/tests/rtl.c
@@ -92,6 +92,7 @@ static NTSTATUS (WINAPI *pRtlIpv4AddressToStringExA)(const IN_ADDR *, USHORT, L
static NTSTATUS (WINAPI *pRtlIpv4StringToAddressA)(PCSTR, BOOLEAN, PCSTR *, IN_ADDR *);
static NTSTATUS (WINAPI *pRtlIpv4StringToAddressExA)(PCSTR, BOOLEAN, IN_ADDR *, PUSHORT);
static NTSTATUS (WINAPI *pRtlIpv6StringToAddressA)(PCSTR, PCSTR *, struct in6_addr *);
+static NTSTATUS (WINAPI *pRtlIpv6StringToAddressExA)(PCSTR AddressString, struct in6_addr *, PULONG, PUSHORT);
static NTSTATUS (WINAPI *pLdrAddRefDll)(ULONG, HMODULE);
static NTSTATUS (WINAPI *pLdrLockLoaderLock)(ULONG, ULONG*, ULONG_PTR*);
static NTSTATUS (WINAPI *pLdrUnlockLoaderLock)(ULONG, ULONG_PTR);
@@ -141,6 +142,7 @@ static void InitFunctionPtrs(void)
pRtlIpv4StringToAddressA = (void *)GetProcAddress(hntdll, "RtlIpv4StringToAddressA");
pRtlIpv4StringToAddressExA = (void *)GetProcAddress(hntdll, "RtlIpv4StringToAddressExA");
pRtlIpv6StringToAddressA = (void *)GetProcAddress(hntdll, "RtlIpv6StringToAddressA");
+ pRtlIpv6StringToAddressExA = (void *)GetProcAddress(hntdll, "RtlIpv6StringToAddressExA");
pLdrAddRefDll = (void *)GetProcAddress(hntdll, "LdrAddRefDll");
pLdrLockLoaderLock = (void *)GetProcAddress(hntdll, "LdrLockLoaderLock");
pLdrUnlockLoaderLock = (void *)GetProcAddress(hntdll, "LdrUnlockLoaderLock");
@@ -1812,6 +1814,143 @@ static void test_RtlIpv6StringToAddress(void)
}
}
+static void test_RtlIpv6StringToAddressEx(void)
+{
+ NTSTATUS res;
+ IN6_ADDR ip, expected_ip;
+ ULONG scope;
+ USHORT port;
+ static const struct
+ {
+ PCSTR address;
+ NTSTATUS res;
+ ULONG scope;
+ USHORT port;
+ int ip[8];
+ } tests[] =
+ {
+ { "[::]", STATUS_SUCCESS, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0 } },
+ { "[::1]:8080", STATUS_SUCCESS, 0, 0x901f, { 0, 0, 0, 0, 0, 0, 0, 0x100 } },
+ { "[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80", STATUS_SUCCESS, 0, 0x5000, { 0xdcfe, 0x98ba, 0x5476, 0x1032, 0xdcfe, 0x98ba, 0x5476, 0x1032 } },
+ { "[1080:0:0:0:8:800:200C:417A]:1234", STATUS_SUCCESS, 0, 0xd204, { 0x8010, 0, 0, 0, 0x800, 8, 0xc20, 0x7a41 } },
+ { "[3ffe:2a00:100:7031::1]:8080", STATUS_SUCCESS, 0, 0x901f, { 0xfe3f, 0x2a, 1, 0x3170, 0, 0, 0, 0x100 } },
+ { "[ 3ffe:2a00:100:7031::1]:8080", STATUS_INVALID_PARAMETER, 0xbadf00d, 0xbeef, { -1 } },
+ { "[3ffe:2a00:100:7031::1 ]:8080", STATUS_INVALID_PARAMETER, 0xbadf00d, 0xbeef, { 0xfe3f, 0x2a, 1, 0x3170, 0, 0, 0, 0x100 } },
+ { "[3ffe:2a00:100:7031::1].8080", STATUS_INVALID_PARAMETER, 0xbadf00d, 0xbeef, { 0xfe3f, 0x2a, 1, 0x3170, 0, 0, 0, 0x100 } },
+ { "[1080::8:800:200C:417A]:8080", STATUS_SUCCESS, 0, 0x901f, { 0x8010, 0, 0, 0, 0x800, 8, 0xc20, 0x7a41 } },
+ { "[1080::8:800:200C:417A]!8080", STATUS_INVALID_PARAMETER, 0xbadf00d, 0xbeef, { 0x8010, 0, 0, 0, 0x800, 8, 0xc20, 0x7a41 } },
+ { "[::FFFF:129.144.52.38]:80", STATUS_SUCCESS, 0, 0x5000, { 0, 0, 0, 0, 0, 0xffff, 0x9081, 0x2634 } },
+ { "[12345::6:7:8]:80", STATUS_INVALID_PARAMETER, 0xbadf00d, 0xbeef, { -1 } },
+ { "[ff01::8:800:200C:417A%16]:8080", STATUS_SUCCESS, 16, 0x901f, { 0x1ff, 0, 0, 0, 0x800, 8, 0xc20, 0x7a41 } },
+ { "[ff01::8:800:200C:417A%100]:8080", STATUS_SUCCESS, 100, 0x901f, { 0x1ff, 0, 0, 0, 0x800, 8, 0xc20, 0x7a41 } },
+ { "[ff01::8:800:200C:417A%1000]:8080", STATUS_SUCCESS, 1000, 0x901f, { 0x1ff, 0, 0, 0, 0x800, 8, 0xc20, 0x7a41 } },
+ { "[ff01::8:800:200C:417A%10000]:8080", STATUS_SUCCESS, 10000, 0x901f, { 0x1ff, 0, 0, 0, 0x800, 8, 0xc20, 0x7a41 } },
+ { "[ff01::8:800:200C:417A%1000000]:8080", STATUS_SUCCESS, 1000000, 0x901f, { 0x1ff, 0, 0, 0, 0x800, 8, 0xc20, 0x7a41 } },
+ { "[ff01::8:800:200C:417A%4294967295]:8080", STATUS_SUCCESS, 4294967295, 0x901f, { 0x1ff, 0, 0, 0, 0x800, 8, 0xc20, 0x7a41 } },
+ { "[ff01::8:800:200C:417A%4294967296]:8080", STATUS_INVALID_PARAMETER, 0xbadf00d, 0xbeef, { 0x1ff, 0, 0, 0, 0x800, 8, 0xc20, 0x7a41 } },
+ { "[ff01::8:800:200C:417A%-1]:8080", STATUS_INVALID_PARAMETER, 0xbadf00d, 0xbeef, { 0x1ff, 0, 0, 0, 0x800, 8, 0xc20, 0x7a41 } },
+ { "[ff01::8:800:200C:417A%0]:8080", STATUS_SUCCESS, 0, 0x901f, { 0x1ff, 0, 0, 0, 0x800, 8, 0xc20, 0x7a41 } },
+ { "[ff01::8:800:200C:417A%1", STATUS_INVALID_PARAMETER, 0xbadf00d, 0xbeef, { 0x1ff, 0, 0, 0, 0x800, 8, 0xc20, 0x7a41 } },
+ { "[ff01::8:800:200C:417A%0x1000]:8080", STATUS_INVALID_PARAMETER, 0xbadf00d, 0xbeef, { 0x1ff, 0, 0, 0, 0x800, 8, 0xc20, 0x7a41 } },
+ { "[ff01::8:800:200C:417A/16]:8080", STATUS_INVALID_PARAMETER, 0xbadf00d, 0xbeef, { 0x1ff, 0, 0, 0, 0x800, 8, 0xc20, 0x7a41 } },
+ };
+ const int testcount = sizeof(tests) / sizeof(tests[0]);
+ int i, j;
+
+ if (!pRtlIpv6StringToAddressExA)
+ {
+ skip("RtlIpv6StringToAddressEx not available\n");
+ return;
+ }
+
+ res = pRtlIpv6StringToAddressExA("::", &ip, &scope, &port);
+ ok(res == STATUS_SUCCESS, "[validate] res = 0x%08x, expected STATUS_SUCCESS\n", res);
+
+ for (j = 0; j < 8; ++j)
+ ip.s6_words[j] = expected_ip.s6_words[j] = 0xabab;
+ scope = 0xbadf00d;
+ port = 0xbeef;
+ res = pRtlIpv6StringToAddressExA(NULL, &ip, &scope, &port);
+ ok(res == STATUS_INVALID_PARAMETER, "[null string] res = 0x%08x, expected STATUS_INVALID_PARAMETER\n", res);
+ ok(scope == 0xbadf00d, "[null string] scope = 0x%08x, expected 0xbadf00d\n", scope);
+ ok(port == 0xbeef, "[null string] port = 0x%08x, expected 0xbeef\n", port);
+ ok(!memcmp(ip.s6_addr, expected_ip.s6_addr, sizeof(ip._S6_un)),
+ "[null string] ip is changed, expected it not to change\n");
+
+
+ for (j = 0; j < 8; ++j)
+ ip.s6_words[j] = 0xabab;
+ scope = 0xbadf00d;
+ port = 0xbeef;
+ res = pRtlIpv6StringToAddressExA("::", NULL, &scope, &port);
+ ok(res == STATUS_INVALID_PARAMETER, "[null result] res = 0x%08x, expected STATUS_INVALID_PARAMETER\n", res);
+ ok(scope == 0xbadf00d, "[null result] scope = 0x%08x, expected 0xbadf00d\n", scope);
+ ok(port == 0xbeef, "[null result] port = 0x%08x, expected 0xbeef\n", port);
+ ok(!memcmp(ip.s6_addr, expected_ip.s6_addr, sizeof(ip._S6_un)),
+ "[null result] ip is changed, expected it not to change\n");
+
+ for (j = 0; j < 8; ++j)
+ ip.s6_words[j] = 0xabab;
+ scope = 0xbadf00d;
+ port = 0xbeef;
+ res = pRtlIpv6StringToAddressExA("::", &ip, NULL, &port);
+ ok(res == STATUS_INVALID_PARAMETER, "[null scope] res = 0x%08x, expected STATUS_INVALID_PARAMETER\n", res);
+ ok(scope == 0xbadf00d, "[null scope] scope = 0x%08x, expected 0xbadf00d\n", scope);
+ ok(port == 0xbeef, "[null scope] port = 0x%08x, expected 0xbeef\n", port);
+ ok(!memcmp(ip.s6_addr, expected_ip.s6_addr, sizeof(ip._S6_un)),
+ "[null scope] ip is changed, expected it not to change\n");
+
+ for (j = 0; j < 8; ++j)
+ ip.s6_words[j] = 0xabab;
+ scope = 0xbadf00d;
+ port = 0xbeef;
+ res = pRtlIpv6StringToAddressExA("::", &ip, &scope, NULL);
+ ok(res == STATUS_INVALID_PARAMETER, "[null port] res = 0x%08x, expected STATUS_INVALID_PARAMETER\n", res);
+ ok(scope == 0xbadf00d, "[null port] scope = 0x%08x, expected 0xbadf00d\n", scope);
+ ok(port == 0xbeef, "[null port] port = 0x%08x, expected 0xbeef\n", port);
+ ok(!memcmp(ip.s6_addr, expected_ip.s6_addr, sizeof(ip._S6_un)),
+ "[null port] ip is changed, expected it not to change\n");
+
+ /* sanity check */
+ ok(sizeof(ip._S6_un) == (sizeof(USHORT)* 8), "sizeof(ip._S6_un)\n");
+
+ for (i = 0; i < testcount; i++)
+ {
+ scope = 0xbadf00d;
+ port = 0xbeef;
+ for (j = 0; j < 8; ++j)
+ ip.s6_words[j] = 0xabab;
+ res = pRtlIpv6StringToAddressExA(tests[i].address, &ip, &scope, &port);
+ ok(res == tests[i].res,
+ "[%s] res = 0x%08x, expected 0x%08x\n",
+ tests[i].address, res, tests[i].res);
+ ok(scope == tests[i].scope,
+ "[%s] scope = 0x%08x, expected 0x%08x\n",
+ tests[i].address, scope, tests[i].scope);
+ ok(port == tests[i].port,
+ "[%s] port = 0x%08x, expected 0x%08x\n",
+ tests[i].address, port, tests[i].port);
+
+ if (tests[i].ip[0] == -1)
+ {
+ for (j = 0; j < 8; ++j)
+ expected_ip.s6_words[j] = 0xabab;
+ }
+ else
+ {
+ for (j = 0; j < 8; ++j)
+ expected_ip.s6_words[j] = tests[i].ip[j];
+ }
+ ok(!memcmp(ip.s6_addr, expected_ip.s6_addr, sizeof(ip._S6_un)),
+ "[%s] ip = %x:%x:%x:%x:%x:%x:%x:%x, expected %x:%x:%x:%x:%x:%x:%x:%x\n",
+ tests[i].address,
+ ip.s6_words[0], ip.s6_words[1], ip.s6_words[2], ip.s6_words[3],
+ ip.s6_words[4], ip.s6_words[5], ip.s6_words[6], ip.s6_words[7],
+ expected_ip.s6_words[0], expected_ip.s6_words[1], expected_ip.s6_words[2], expected_ip.s6_words[3],
+ expected_ip.s6_words[4], expected_ip.s6_words[5], expected_ip.s6_words[6], expected_ip.s6_words[7]);
+ }
+}
+
static void test_LdrAddRefDll(void)
{
HMODULE mod, mod2;
@@ -1945,6 +2084,7 @@ START_TEST(rtl)
test_RtlIpv4StringToAddress();
test_RtlIpv4StringToAddressEx();
test_RtlIpv6StringToAddress();
+ test_RtlIpv6StringToAddressEx();
test_LdrAddRefDll();
test_LdrLockLoaderLock();
}
--
1.8.3.msysgit.0
More information about the wine-patches
mailing list