[PATCH 2/2] ntdll: RtlIpv4|6 tests

Sebastian Lackner sebastian at fds-team.de
Wed Jan 6 18:45:38 CST 2016


For tests, the subject should start with "ntdll/tests:".

Please note that Mark Jansen also has been working on the tests. Instead of
starting again from scratch, you might want to take a look at:

https://github.com/wine-compholio/wine-staging/tree/master/patches/ntdll-RtlIpStringToAddress

It probably should be possible to get those patches upstream with no or just
minor changes, I'll also take a look at them again.

On 07.01.2016 00:26, Donat Enikeev wrote:
> Tests for newly added implementations plus `test_RtlIpv4StringToAddress` rewritten as there was no such function before and therefore tests were never applied
> 
> Signed-off-by: Donat Enikeev <donat at enikeev.net>
> ---
>  dlls/ntdll/tests/rtl.c | 444 +++++++++++++++++++++++++++++++------------------
>  1 file changed, 281 insertions(+), 163 deletions(-)
> 
> diff --git a/dlls/ntdll/tests/rtl.c b/dlls/ntdll/tests/rtl.c
> index 94a22ac..8a77bcc 100644
> --- a/dlls/ntdll/tests/rtl.c
> +++ b/dlls/ntdll/tests/rtl.c
> @@ -25,6 +25,8 @@
>  
>  #include "ntdll_test.h"
>  #include "inaddr.h"
> +#include "in6addr.h"
> +#include "winnls.h"
>  
>  #ifndef __WINE_WINTERNL_H
>  
> @@ -89,6 +91,8 @@ static IMAGE_BASE_RELOCATION *(WINAPI *pLdrProcessRelocationBlock)(void*,UINT,US
>  static CHAR *    (WINAPI *pRtlIpv4AddressToStringA)(const IN_ADDR *, LPSTR);
>  static NTSTATUS  (WINAPI *pRtlIpv4AddressToStringExA)(const IN_ADDR *, USHORT, LPSTR, PULONG);
>  static NTSTATUS  (WINAPI *pRtlIpv4StringToAddressA)(PCSTR, BOOLEAN, PCSTR *, IN_ADDR *);
> +static CHAR *    (WINAPI *pRtlIpv6AddressToStringA)(const IN6_ADDR *, LPSTR);
> +static WCHAR *   (WINAPI *pRtlIpv6AddressToStringW)(const IN6_ADDR *, LPWSTR);
>  static NTSTATUS  (WINAPI *pLdrAddRefDll)(ULONG, HMODULE);
>  static NTSTATUS  (WINAPI *pLdrLockLoaderLock)(ULONG, ULONG*, ULONG_PTR*);
>  static NTSTATUS  (WINAPI *pLdrUnlockLoaderLock)(ULONG, ULONG_PTR);
> @@ -115,24 +119,24 @@ static void InitFunctionPtrs(void)
>      hntdll = LoadLibraryA("ntdll.dll");
>      ok(hntdll != 0, "LoadLibrary failed\n");
>      if (hntdll) {
> -	pRtlCompareMemory = (void *)GetProcAddress(hntdll, "RtlCompareMemory");
> -	pRtlCompareMemoryUlong = (void *)GetProcAddress(hntdll, "RtlCompareMemoryUlong");
> +        pRtlCompareMemory = (void *)GetProcAddress(hntdll, "RtlCompareMemory");
> +        pRtlCompareMemoryUlong = (void *)GetProcAddress(hntdll, "RtlCompareMemoryUlong");
>          pRtlDeleteTimer = (void *)GetProcAddress(hntdll, "RtlDeleteTimer");
> -	pRtlMoveMemory = (void *)GetProcAddress(hntdll, "RtlMoveMemory");
> -	pRtlFillMemory = (void *)GetProcAddress(hntdll, "RtlFillMemory");
> -	pRtlFillMemoryUlong = (void *)GetProcAddress(hntdll, "RtlFillMemoryUlong");
> -	pRtlZeroMemory = (void *)GetProcAddress(hntdll, "RtlZeroMemory");
> -	pRtlUlonglongByteSwap = (void *)GetProcAddress(hntdll, "RtlUlonglongByteSwap");
> -	pRtlUniform = (void *)GetProcAddress(hntdll, "RtlUniform");
> -	pRtlRandom = (void *)GetProcAddress(hntdll, "RtlRandom");
> -	pRtlAreAllAccessesGranted = (void *)GetProcAddress(hntdll, "RtlAreAllAccessesGranted");
> -	pRtlAreAnyAccessesGranted = (void *)GetProcAddress(hntdll, "RtlAreAnyAccessesGranted");
> -	pRtlComputeCrc32 = (void *)GetProcAddress(hntdll, "RtlComputeCrc32");
> -	pRtlInitializeHandleTable = (void *)GetProcAddress(hntdll, "RtlInitializeHandleTable");
> -	pRtlIsValidIndexHandle = (void *)GetProcAddress(hntdll, "RtlIsValidIndexHandle");
> -	pRtlDestroyHandleTable = (void *)GetProcAddress(hntdll, "RtlDestroyHandleTable");
> -	pRtlAllocateHandle = (void *)GetProcAddress(hntdll, "RtlAllocateHandle");
> -	pRtlFreeHandle = (void *)GetProcAddress(hntdll, "RtlFreeHandle");
> +        pRtlMoveMemory = (void *)GetProcAddress(hntdll, "RtlMoveMemory");
> +        pRtlFillMemory = (void *)GetProcAddress(hntdll, "RtlFillMemory");
> +        pRtlFillMemoryUlong = (void *)GetProcAddress(hntdll, "RtlFillMemoryUlong");
> +        pRtlZeroMemory = (void *)GetProcAddress(hntdll, "RtlZeroMemory");
> +        pRtlUlonglongByteSwap = (void *)GetProcAddress(hntdll, "RtlUlonglongByteSwap");
> +        pRtlUniform = (void *)GetProcAddress(hntdll, "RtlUniform");
> +        pRtlRandom = (void *)GetProcAddress(hntdll, "RtlRandom");
> +        pRtlAreAllAccessesGranted = (void *)GetProcAddress(hntdll, "RtlAreAllAccessesGranted");
> +        pRtlAreAnyAccessesGranted = (void *)GetProcAddress(hntdll, "RtlAreAnyAccessesGranted");
> +        pRtlComputeCrc32 = (void *)GetProcAddress(hntdll, "RtlComputeCrc32");
> +        pRtlInitializeHandleTable = (void *)GetProcAddress(hntdll, "RtlInitializeHandleTable");
> +        pRtlIsValidIndexHandle = (void *)GetProcAddress(hntdll, "RtlIsValidIndexHandle");
> +        pRtlDestroyHandleTable = (void *)GetProcAddress(hntdll, "RtlDestroyHandleTable");
> +        pRtlAllocateHandle = (void *)GetProcAddress(hntdll, "RtlAllocateHandle");
> +        pRtlFreeHandle = (void *)GetProcAddress(hntdll, "RtlFreeHandle");

To keep your patches as simple as possible, it might be easier to skip
the formatting changes. Touching code which is unrelated to your patch is
usually not a good idea. ;)

>          pRtlAllocateAndInitializeSid = (void *)GetProcAddress(hntdll, "RtlAllocateAndInitializeSid");
>          pRtlFreeSid = (void *)GetProcAddress(hntdll, "RtlFreeSid");
>          pNtCurrentTeb = (void *)GetProcAddress(hntdll, "NtCurrentTeb");
> @@ -141,6 +145,8 @@ static void InitFunctionPtrs(void)
>          pLdrProcessRelocationBlock  = (void *)GetProcAddress(hntdll, "LdrProcessRelocationBlock");
>          pRtlIpv4AddressToStringA = (void *)GetProcAddress(hntdll, "RtlIpv4AddressToStringA");
>          pRtlIpv4AddressToStringExA = (void *)GetProcAddress(hntdll, "RtlIpv4AddressToStringExA");
> +        pRtlIpv6AddressToStringA = (void *)GetProcAddress(hntdll, "RtlIpv6AddressToStringA");
> +        pRtlIpv6AddressToStringW = (void *)GetProcAddress(hntdll, "RtlIpv6AddressToStringW");
>          pRtlIpv4StringToAddressA = (void *)GetProcAddress(hntdll, "RtlIpv4StringToAddressA");
>          pLdrAddRefDll = (void *)GetProcAddress(hntdll, "LdrAddRefDll");
>          pLdrLockLoaderLock = (void *)GetProcAddress(hntdll, "LdrLockLoaderLock");
> @@ -1129,172 +1135,282 @@ static void test_RtlIpv4AddressToStringEx(void)
>  static void test_RtlIpv4StringToAddress(void)
>  {
>      NTSTATUS res;
> -    IN_ADDR ip, expected_ip;
> -    PCSTR terminator;
> -    CHAR dummy;
> +    IN_ADDR ip;
> +    LPCSTR terminator;

If you want to improve existing tests, this should probably also go into a separate patch.
Also, it wouldn't hurt to explain more detailed what exactly you improved.

>      struct
>      {
>          PCSTR address;
>          NTSTATUS res;
>          int terminator_offset;
> -        int ip[4];
> -        BOOL strict_is_different;
> -        NTSTATUS res_strict;
> -        int terminator_offset_strict;
> -        int ip_strict[4];
> -    } tests[] =
> +        ULONG ip_ulong;
> +    } tests[] = /** tests data for non-strict (strict below) */
> +    {
> +        { "255.255.255.255:123",  STATUS_SUCCESS,           15, 4294967295UL },
> +        { "255.255.255.256",      STATUS_INVALID_PARAMETER, 15, 1 },
> +        { "255.255.255.42949672", STATUS_INVALID_PARAMETER, 22, 1 },
> +        { "a",                    STATUS_INVALID_PARAMETER,  0, 1 },
> +        { "1.1.1.0xaA",           STATUS_SUCCESS,           10, 2852192513UL },
> +        { "1.1.1.0XaA",           STATUS_SUCCESS,           10, 2852192513UL },
> +        { "1.1.1.0x",             STATUS_INVALID_PARAMETER,  8, 1 },
> +        { "1.1.1.0xff",           STATUS_SUCCESS,           10, 4278255873UL },
> +        { "1.1.1.0x100",          STATUS_INVALID_PARAMETER, 11, 1 },
> +        { "1.1.1.0xffffffff",     STATUS_INVALID_PARAMETER, 16, 1 },
> +        { "1.1.1.0x100000000",    STATUS_INVALID_PARAMETER, 16, 1 },
> +        { "1.1.1.010",            STATUS_SUCCESS,            9, 134283521UL },
> +        { "1.1.1.00",             STATUS_SUCCESS,            8, 65793 },
> +        { "1.1.1.007",            STATUS_SUCCESS,            9, 117506305UL },
> +        { "1.1.1.08",             STATUS_INVALID_PARAMETER,  7, 1 },
> +        { "1.1.1.008",            STATUS_SUCCESS,            8, 65793 },
> +        { "1.1.1.0a",             STATUS_SUCCESS,            7, 65793 },
> +        { "1.1.1.0o10",           STATUS_SUCCESS,            7, 65793 },
> +        { "1.1.1.0b10",           STATUS_SUCCESS,            7, 65793 },
> +        { "1.1.1.-2",             STATUS_INVALID_PARAMETER,  6, 1 },
> +        { "1",                    STATUS_SUCCESS,            1, 16777216 },
> +        { "-1",                   STATUS_INVALID_PARAMETER,  0, 0 },
> +        { "203569230",            STATUS_SUCCESS,            9, 1312301580UL },
> +        { "1.223756",             STATUS_SUCCESS,            8, 208274177 },
> +        { "3.4.756",              STATUS_SUCCESS,            7, 4093772803UL },
> +        { "3.4.756.1",            STATUS_INVALID_PARAMETER,  9, 1 },
> +        { "3.4.65536",            STATUS_INVALID_PARAMETER,  9, 1 },
> +        { "3.4.5.6.7",            STATUS_INVALID_PARAMETER,  7, 1 },
> +        { "3.4.5.+6",             STATUS_INVALID_PARAMETER,  6, 1 },
> +        { " 3.4.5.6",             STATUS_INVALID_PARAMETER,  0, 1 },
> +        { "\t3.4.5.6",            STATUS_INVALID_PARAMETER,  0, 1 },
> +        { "3.4.5.6 ",             STATUS_SUCCESS,            7, 100992003UL },
> +        { "3. 4.5.6",             STATUS_INVALID_PARAMETER,  2, 1 },
> +        { ".",                    STATUS_INVALID_PARAMETER,  1, 1 },
> +        { "..",                   STATUS_INVALID_PARAMETER,  1, 1 },
> +        { "1.",                   STATUS_INVALID_PARAMETER,  2, 1 },
> +        { "1..",                  STATUS_INVALID_PARAMETER,  3, 1 },
> +        { ".1",                   STATUS_INVALID_PARAMETER,  1, 1 },
> +        { ".1.",                  STATUS_INVALID_PARAMETER,  1, 1 },
> +        { ".1.2.3",               STATUS_INVALID_PARAMETER,  1, 1 },
> +        { "::1",                  STATUS_INVALID_PARAMETER,  0, 1 },
> +        { ":1",                   STATUS_INVALID_PARAMETER,  0, 1 },
> +    }, tests_strict[] =
>      {
> -        { "",                STATUS_INVALID_PARAMETER,  0, { -1 } },
> -        { " ",               STATUS_INVALID_PARAMETER,  0, { -1 } },
> -        { "1.1.1.1",         STATUS_SUCCESS,            7, {   1,   1,   1,   1 } },
> -        { "0.0.0.0",         STATUS_SUCCESS,            7, {   0,   0,   0,   0 } },
> -        { "255.255.255.255", STATUS_SUCCESS,           15, { 255, 255, 255, 255 } },
> -        { "255.255.255.255:123",
> -                             STATUS_SUCCESS,           15, { 255, 255, 255, 255 } },
> -        { "255.255.255.256", STATUS_INVALID_PARAMETER, 15, { -1 } },
> -        { "255.255.255.4294967295",
> -                             STATUS_INVALID_PARAMETER, 22, { -1 } },
> -        { "255.255.255.4294967296",
> -                             STATUS_INVALID_PARAMETER, 21, { -1 } },
> -        { "255.255.255.4294967297",
> -                             STATUS_INVALID_PARAMETER, 21, { -1 } },
> -        { "a",               STATUS_INVALID_PARAMETER,  0, { -1 } },
> -        { "1.1.1.0xaA",      STATUS_SUCCESS,           10, {   1,   1,   1, 170 },
> -                       TRUE, STATUS_INVALID_PARAMETER,  8, { -1 } },
> -        { "1.1.1.0XaA",      STATUS_SUCCESS,           10, {   1,   1,   1, 170 },
> -                       TRUE, STATUS_INVALID_PARAMETER,  8, { -1 } },
> -        { "1.1.1.0x",        STATUS_INVALID_PARAMETER,  8, { -1 } },
> -        { "1.1.1.0xff",      STATUS_SUCCESS,           10, {   1,   1,   1, 255 },
> -                       TRUE, STATUS_INVALID_PARAMETER,  8, { -1 } },
> -        { "1.1.1.0x100",     STATUS_INVALID_PARAMETER, 11, { -1 },
> -                       TRUE, STATUS_INVALID_PARAMETER,  8, { -1 } },
> -        { "1.1.1.0xffffffff",STATUS_INVALID_PARAMETER, 16, { -1 },
> -                       TRUE, STATUS_INVALID_PARAMETER,  8, { -1 } },
> -        { "1.1.1.0x100000000",
> -                             STATUS_INVALID_PARAMETER, 16, { -1, 0, 0, 0 },
> -                       TRUE, STATUS_INVALID_PARAMETER,  8, { -1 } },
> -        { "1.1.1.010",       STATUS_SUCCESS,            9, {   1,   1,   1,   8 },
> -                       TRUE, STATUS_INVALID_PARAMETER,  7, { -1 } },
> -        { "1.1.1.00",        STATUS_SUCCESS,            8, {   1,   1,   1,   0 },
> -                       TRUE, STATUS_INVALID_PARAMETER,  7, { -1 } },
> -        { "1.1.1.007",       STATUS_SUCCESS,            9, {   1,   1,   1,   7 },
> -                       TRUE, STATUS_INVALID_PARAMETER,  7, { -1 } },
> -        { "1.1.1.08",        STATUS_INVALID_PARAMETER,  7, { -1 } },
> -        { "1.1.1.008",       STATUS_SUCCESS,            8, {   1,   1,   1,   0 },
> -                       TRUE, STATUS_INVALID_PARAMETER,  7, { -1 } },
> -        { "1.1.1.0a",        STATUS_SUCCESS,            7, {   1,   1,   1,   0 } },
> -        { "1.1.1.0o10",      STATUS_SUCCESS,            7, {   1,   1,   1,   0 } },
> -        { "1.1.1.0b10",      STATUS_SUCCESS,            7, {   1,   1,   1,   0 } },
> -        { "1.1.1.-2",        STATUS_INVALID_PARAMETER,  6, { -1 } },
> -        { "1",               STATUS_SUCCESS,            1, {   0,   0,   0,   1 },
> -                       TRUE, STATUS_INVALID_PARAMETER,  1, { -1 } },
> -        { "-1",              STATUS_INVALID_PARAMETER,  0, { -1 } },
> -        { "203569230",       STATUS_SUCCESS,            9, {  12,  34,  56,  78 },
> -                       TRUE, STATUS_INVALID_PARAMETER,  9, { -1 } },
> -        { "1.223756",        STATUS_SUCCESS,            8, {   1,   3, 106,  12 },
> -                       TRUE, STATUS_INVALID_PARAMETER,  8, { -1 } },
> -        { "3.4.756",         STATUS_SUCCESS,            7, {   3,   4,   2, 244 },
> -                       TRUE, STATUS_INVALID_PARAMETER,  7, { -1 } },
> -        { "3.4.756.1",       STATUS_INVALID_PARAMETER,  9, { -1 } },
> -        { "3.4.65536",       STATUS_INVALID_PARAMETER,  9, { -1 } },
> -        { "3.4.5.6.7",       STATUS_INVALID_PARAMETER,  7, { -1 } },
> -        { "3.4.5.+6",        STATUS_INVALID_PARAMETER,  6, { -1 } },
> -        { " 3.4.5.6",        STATUS_INVALID_PARAMETER,  0, { -1 } },
> -        { "\t3.4.5.6",       STATUS_INVALID_PARAMETER,  0, { -1 } },
> -        { "3.4.5.6 ",        STATUS_SUCCESS,            7, {   3,   4,   5,   6 } },
> -        { "3. 4.5.6",        STATUS_INVALID_PARAMETER,  2, { -1 } },
> -        { ".",               STATUS_INVALID_PARAMETER,  1, { -1 } },
> -        { "..",              STATUS_INVALID_PARAMETER,  1, { -1 } },
> -        { "1.",              STATUS_INVALID_PARAMETER,  2, { -1 } },
> -        { "1..",             STATUS_INVALID_PARAMETER,  3, { -1 } },
> -        { ".1",              STATUS_INVALID_PARAMETER,  1, { -1 } },
> -        { ".1.",             STATUS_INVALID_PARAMETER,  1, { -1 } },
> -        { ".1.2.3",          STATUS_INVALID_PARAMETER,  1, { -1 } },
> -        { "0.1.2.3",         STATUS_SUCCESS,            7, {   0,   1,   2,   3 } },
> -        { "0.1.2.3.",        STATUS_INVALID_PARAMETER,  7, { -1 } },
> -        { "[0.1.2.3]",       STATUS_INVALID_PARAMETER,  0, { -1 } },
> -        { "::1",             STATUS_INVALID_PARAMETER,  0, { -1 } },
> -        { ":1",              STATUS_INVALID_PARAMETER,  0, { -1 } },
> +        { "",                     STATUS_INVALID_PARAMETER,  0, 0},
> +        { " ",                    STATUS_INVALID_PARAMETER,  0, 0 },
> +        { "1.1.1.1",              STATUS_SUCCESS,            7, 16843009 },
> +        { "0.0.0.0",              STATUS_SUCCESS,            7, 0 },
> +        { "255.255.255.255",      STATUS_SUCCESS,           15, 4294967295UL },
> +        { "255.255.255.256",      STATUS_INVALID_PARAMETER, 15, 1 },
> +        { "255.255.255.42949672", STATUS_INVALID_PARAMETER, 22, 1 },
> +        { "1.1.1.010",            STATUS_INVALID_PARAMETER,  9, 1 },
> +        { "1.1.1.00",             STATUS_INVALID_PARAMETER,  8, 1 },
> +        { "1.1.1.007",            STATUS_INVALID_PARAMETER,  9, 1 },
> +        { "1.1.1.08",             STATUS_INVALID_PARAMETER,  7, 1 },
> +        { "1.1.1.008",            STATUS_INVALID_PARAMETER,  8, 1 },
> +        { "1.1.1.-2",             STATUS_INVALID_PARAMETER,  6, 1 },
> +        { "1",                    STATUS_INVALID_PARAMETER,  1, 1 },
> +        { "-1",                   STATUS_INVALID_PARAMETER,  0, 1 },
> +        { "203569230",            STATUS_INVALID_PARAMETER,  9, 1 },
> +        { "1.223756",             STATUS_INVALID_PARAMETER,  8, 1 },
> +        { "3.4.756",              STATUS_INVALID_PARAMETER,  7, 1 },
> +        { "3.4.756.1",            STATUS_INVALID_PARAMETER,  9, 1 },
> +        { "3.4.65536",            STATUS_INVALID_PARAMETER,  9, 1 },
> +        { "3.4.5.6.7",            STATUS_INVALID_PARAMETER,  7, 1 },
> +        { "3.4.5.+6",             STATUS_INVALID_PARAMETER,  6, 1 },
> +        { " 3.4.5.6",             STATUS_INVALID_PARAMETER,  0, 1 },
> +        { "\t3.4.5.6",            STATUS_INVALID_PARAMETER,  0, 1 },
> +        { "3.4.5.6",              STATUS_SUCCESS,            7, 100992003 },
> +        { "3. 4.5.6",             STATUS_INVALID_PARAMETER,  2, 1 },
> +        { ".",                    STATUS_INVALID_PARAMETER,  1, 1 },
> +        { "..",                   STATUS_INVALID_PARAMETER,  1, 1 },
> +        { "1.",                   STATUS_INVALID_PARAMETER,  2, 1 },
> +        { "1..",                  STATUS_INVALID_PARAMETER,  3, 1 },
> +        { ".1",                   STATUS_INVALID_PARAMETER,  1, 1 },
> +        { ".1.",                  STATUS_INVALID_PARAMETER,  1, 1 },
> +        { ".1.2.3",               STATUS_INVALID_PARAMETER,  1, 1 },
> +        { "0.1.2.3",              STATUS_SUCCESS,            7, 50462976 },
> +        { "0.1.2.3.",             STATUS_INVALID_PARAMETER,  7, 1 },
> +        { "[0.1.2.3]",            STATUS_INVALID_PARAMETER,  0, 1 },
> +        { "::1",                  STATUS_INVALID_PARAMETER,  0, 1 },
> +        { ":1",                   STATUS_INVALID_PARAMETER,  0, 1 },
>      };
>      const int testcount = sizeof(tests) / sizeof(tests[0]);
> +    const int testcount_strict = sizeof(tests_strict) / sizeof(tests_strict[0]);
>      int i;
>  
>      if (!pRtlIpv4StringToAddressA)
>      {
> -        skip("RtlIpv4StringToAddress not available\n");
> +        skip("RtlIpv4StringToAddressA not available\n");
>          return;
>      }
>  
> -    if (0)
> -    {
> -        /* leaving either parameter NULL crashes on Windows */
> -        res = pRtlIpv4StringToAddressA(NULL, FALSE, &terminator, &ip);
> -        res = pRtlIpv4StringToAddressA("1.1.1.1", FALSE, NULL, &ip);
> -        res = pRtlIpv4StringToAddressA("1.1.1.1", FALSE, &terminator, NULL);
> -        /* same for the wide char version */
> -        /*
> -        res = pRtlIpv4StringToAddressW(NULL, FALSE, &terminatorW, &ip);
> -        res = pRtlIpv4StringToAddressW(L"1.1.1.1", FALSE, NULL, &ip);
> -        res = pRtlIpv4StringToAddressW(L"1.1.1.1", FALSE, &terminatorW, NULL);
> -        */
> -    }
> -
> +    /* non-strict */
>      for (i = 0; i < testcount; i++)
>      {
> -        /* non-strict */
> -        terminator = &dummy;
> -        ip.S_un.S_addr = 0xabababab;
> +        memset(&ip, 0, sizeof(ip));
> +
>          res = pRtlIpv4StringToAddressA(tests[i].address, FALSE, &terminator, &ip);
> -        ok(res == tests[i].res,
> -           "[%s] res = 0x%08x, expected 0x%08x\n",
> -           tests[i].address, res, tests[i].res);
> -        ok(terminator == tests[i].address + tests[i].terminator_offset,
> -           "[%s] terminator = %p, expected %p\n",
> -           tests[i].address, terminator, tests[i].address + tests[i].terminator_offset);
> -        if (tests[i].ip[0] == -1)
> -            expected_ip.S_un.S_addr = 0xabababab;
> -        else
> -        {
> -            expected_ip.S_un.S_un_b.s_b1 = tests[i].ip[0];
> -            expected_ip.S_un.S_un_b.s_b2 = tests[i].ip[1];
> -            expected_ip.S_un.S_un_b.s_b3 = tests[i].ip[2];
> -            expected_ip.S_un.S_un_b.s_b4 = tests[i].ip[3];
> -        }
> -        ok(ip.S_un.S_addr == expected_ip.S_un.S_addr,
> -           "[%s] ip = %08x, expected %08x\n",
> -           tests[i].address, ip.S_un.S_addr, expected_ip.S_un.S_addr);
> +        todo_wine ok(res == tests[i].res,
> +            "#%d '%s' (Strict:FALSE) res = 0x%08x, expected 0x%08x\n", i,
> +            tests[i].address, res, tests[i].res);
> +
> +        if (res == STATUS_SUCCESS) {
> +          todo_wine ok( terminator == tests[i].address + (size_t)tests[i].terminator_offset,
> +            "#%d '%s' (Strict:FALSE) terminator = %p, expected %p for ptr %p\n", i,
> +            tests[i].address, terminator, tests[i].address + (size_t)tests[i].terminator_offset, tests[i].address);
> +
> +          todo_wine ok(ip.S_un.S_addr == tests[i].ip_ulong,
> +            "#%d '%s' (Strict:FALSE) ip = %llu, expected %llu\n", i,
> +            tests[i].address, (long long unsigned)ip.S_un.S_addr, (long long unsigned)tests[i].ip_ulong);
>  
> -        if (!tests[i].strict_is_different)
> -        {
> -            tests[i].res_strict = tests[i].res;
> -            tests[i].terminator_offset_strict = tests[i].terminator_offset;
> -            tests[i].ip_strict[0] = tests[i].ip[0];
> -            tests[i].ip_strict[1] = tests[i].ip[1];
> -            tests[i].ip_strict[2] = tests[i].ip[2];
> -            tests[i].ip_strict[3] = tests[i].ip[3];
>          }
> -        /* strict */
> -        terminator = &dummy;
> -        ip.S_un.S_addr = 0xabababab;
> -        res = pRtlIpv4StringToAddressA(tests[i].address, TRUE, &terminator, &ip);
> -        ok(res == tests[i].res_strict,
> -           "[%s] res = 0x%08x, expected 0x%08x\n",
> -           tests[i].address, res, tests[i].res_strict);
> -        ok(terminator == tests[i].address + tests[i].terminator_offset_strict,
> -           "[%s] terminator = %p, expected %p\n",
> -           tests[i].address, terminator, tests[i].address + tests[i].terminator_offset_strict);
> -        if (tests[i].ip_strict[0] == -1)
> -            expected_ip.S_un.S_addr = 0xabababab;
> -        else
> +    }
> +
> +    /* strict */
> +    for (i=0; i<testcount_strict; i++)
> +    {
> +        memset(&ip, 0, sizeof(ip));
> +
> +        res = pRtlIpv4StringToAddressA(tests_strict[i].address, TRUE, &terminator, &ip);
> +
> +        ok(res == tests_strict[i].res,
> +           "#%d '%s' (Strict:TRUE) res = 0x%08x, expected 0x%08x\n", i,
> +           tests_strict[i].address, res, tests_strict[i].res);
> +
> +        if (res == STATUS_SUCCESS)
>          {
> -            expected_ip.S_un.S_un_b.s_b1 = tests[i].ip_strict[0];
> -            expected_ip.S_un.S_un_b.s_b2 = tests[i].ip_strict[1];
> -            expected_ip.S_un.S_un_b.s_b3 = tests[i].ip_strict[2];
> -            expected_ip.S_un.S_un_b.s_b4 = tests[i].ip_strict[3];
> +          ok(terminator == tests_strict[i].address + (size_t)tests_strict[i].terminator_offset,
> +           "#%d '%s' (Strict:TRUE) terminator = %p, expected %p for ptr %p\n", i,
> +            tests_strict[i].address, terminator, tests_strict[i].address + tests_strict[i].terminator_offset, tests_strict[i].address);
> +
> +          ok(ip.S_un.S_addr == tests_strict[i].ip_ulong,
> +           "#%d '%s' (Strict:TRUE) ip = %llu, expected %llu\n", i,
> +           tests_strict[i].address, (long long unsigned)ip.S_un.S_addr, (long long unsigned)tests_strict[i].ip_ulong);
>          }
> -        ok(ip.S_un.S_addr == expected_ip.S_un.S_addr,
> -           "[%s] ip = %08x, expected %08x\n",
> -           tests[i].address, ip.S_un.S_addr, expected_ip.S_un.S_addr);
> +
> +    }
> +}
> +
> +struct ipv6_testing_data
> +{
> +    LPCSTR readable_addr;
> +    UCHAR expected_representation[16];
> +    LPCSTR readable_compact_addr; /** could differ from readable **/
> +};
> +
> +static struct ipv6_testing_data ipv6_samples[] =
> +{
> +    { "0::", { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, "::" },
> +    { "::01", { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, "::1" },
> +    { "1::2", { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 }, "1::2" },
> +    { "2002:4559:1FE2::4559:1FE2", { 32, 2, 69, 89, 31, 226, 0, 0, 0, 0, 0, 0, 69, 89, 31, 226 }, "2002:4559:1fe2::4559:1fe2" },
> +    { "2a02:6b8::3", { 42, 2, 6, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3 }, "2a02:6b8::3" },
> +    { "::192.168.001.1", { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 168, 1, 1 }, "::192.168.1.1" },
> +    { "fff::190.160.10.10", { 15, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, 160, 10, 10 }, "FFf::bea0:a0a" },
> +    { "2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d", { 32, 1, 13, 184, 17, 163, 9, 215,31, 52, 138, 46, 7, 160, 118, 93 }, "2001:db8:11a3:9d7:1f34:8a2e:7a0:765d" },
> +    { "2001:0db8::", { 32, 1, 13, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, "2001:db8::" },
> +    { "ff00::", { 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, "ff00::" }

The number of tests is most likely not sufficient. The special cases
(empty string, invalid format, ...) might be more interesting.

> +};
> +
> +
> +static void test_RtlIpv6AddressToStringA(void)
> +{
> +    const int testcount = sizeof(ipv6_samples) / sizeof(ipv6_samples[0]);
> +    int i;
> +    CHAR buffer[65];
> +    CHAR * res;
> +
> +    if ( !pRtlIpv6AddressToStringA )
> +    {
> +        win_skip("Method not supported\n");
> +        return;
> +    }
> +
> +    res = pRtlIpv6AddressToStringA((IN6_ADDR*) &ipv6_samples[0].expected_representation, (LPSTR)&buffer);
> +    if ((void *)&buffer==(void *)res) {

Please avoid unnecessary casts. buffer and res should both have the same type.
The same also applies to a couple of other places.

> +        win_skip("No conversion expected with stub without inet_ntop\n");
> +        return;
> +    }
> +
> +    for (i=0; i<testcount; i++)
> +    {
> +        CHAR buffer[65];

Did you forget to replace with the constant maybe?

> +        CHAR * res;
> +        IN6_ADDR * in6;
> +        int expected_len, result_len;
> +
> +        memset(buffer, 0, sizeof(buffer) - 1);
> +
> +        in6 = (IN6_ADDR*) &ipv6_samples[i].expected_representation;
> +
> +        res = pRtlIpv6AddressToStringA(in6, (LPSTR)&buffer);
> +
> +        ok( 0 == (CHAR)(*res),
> +           "Pointer to 0 expected, got %c at %p\n",
> +           (CHAR)(*res), res);
> +
> +        expected_len = strlen(ipv6_samples[i].readable_compact_addr);
> +        result_len = strlen(buffer);
> +
> +        ok( expected_len == result_len,
> +           "Unexpected resulting strlen, waited for %d, got %d\n",
> +           expected_len, result_len);
> +
> +        ok ( strcasecmp((const char *)ipv6_samples[i].readable_compact_addr, (const char *)&buffer) == 0,
> +            "Unexpected IPv6 address, waited '%s', got '%s'",
> +            ipv6_samples[i].readable_compact_addr, (const char *)&buffer);
> +    }
> +
> +}
> +
> +static void test_RtlIpv6AddressToStringW(void)
> +{
> +    const int testcount = sizeof(ipv6_samples) / sizeof(ipv6_samples[0]);
> +    int i;
> +    WCHAR buffer[INET6_ADDRSTRLEN];
> +    WCHAR * res;
> +
> +    if ( !pRtlIpv6AddressToStringW )
> +    {
> +        win_skip("Method not supported\n");
> +        return;
> +    }
> +
> +    res = pRtlIpv6AddressToStringW((IN6_ADDR*) &ipv6_samples[0].expected_representation, (LPWSTR)&buffer);
> +
> +    if ((void *)&buffer==(void *)res)
> +    {
> +        win_skip("No conversion expected with stub without inet_ntop\n");
> +        return;
> +    }
> +
> +    for (i=0; i<testcount; i++)
> +    {
> +        WCHAR buffer[INET6_ADDRSTRLEN];
> +        WCHAR * res;
> +        WCHAR W_readable_addr[INET6_ADDRSTRLEN];
> +
> +        IN6_ADDR * in6;
> +        int expected_len, result_len;
> +
> +        in6 = (IN6_ADDR*) &ipv6_samples[i].expected_representation;
> +
> +        expected_len = strlen(ipv6_samples[i].readable_compact_addr);
> +
> +        memset(&W_readable_addr,0, sizeof(W_readable_addr));
> +        memset(&buffer,0, sizeof(W_readable_addr));
> +
> +        MultiByteToWideChar(CP_ACP,0,ipv6_samples[i].readable_compact_addr,expected_len,(LPWSTR)&W_readable_addr,expected_len);
> +
> +        res = pRtlIpv6AddressToStringW(in6, (LPWSTR)&buffer);
> +
> +        ok( '\0' == (WCHAR)(*res),
> +           "Pointer to 0 expected, got %s at %p+%p, full string '%s'\n",
> +                      wine_dbgstr_wn(res, 1), buffer, res, wine_dbgstr_w((const WCHAR *)&buffer));
> +
> +        expected_len = lstrlenW((LPCWSTR)&W_readable_addr);
> +        result_len = lstrlenW((LPCWSTR)&buffer);
> +
> +        ok( expected_len == result_len,
> +           "Unexpected resulting strlen, waited for %d, got %d\n", expected_len, result_len);
> +
> +        ok( lstrcmpiW((LPCWSTR)&W_readable_addr, (LPCWSTR)&buffer) == 0,
> +            "IPv6 address strings are not equal, '%s' expected, got '%s'",
> +              wine_dbgstr_w((const WCHAR *)&W_readable_addr), wine_dbgstr_w((const WCHAR *)&buffer));
>      }
>  }
>  
> @@ -1779,8 +1895,8 @@ static void test_RtlDecompressBuffer(void)
>      /* regular tests for RtlDecompressBuffer */
>      for (i = 0; i < sizeof(test_lznt) / sizeof(test_lznt[0]); i++)
>      {
> -        trace("Running test %d (compressed_size=%u, uncompressed_size=%u, status=0x%08x)\n",
> -              i, test_lznt[i].compressed_size, test_lznt[i].uncompressed_size, test_lznt[i].status);
> +        /* trace("Running test %d (compressed_size=%u, uncompressed_size=%u, status=0x%08x)\n",
> +              i, test_lznt[i].compressed_size, test_lznt[i].uncompressed_size, test_lznt[i].status); */

Any reason why you comment out traces in a completely unrelated test? ;)

>  
>          /* test with very big buffer */
>          final_size = 0xdeadbeef;
> @@ -2080,6 +2196,8 @@ START_TEST(rtl)
>      test_RtlIpv4AddressToString();
>      test_RtlIpv4AddressToStringEx();
>      test_RtlIpv4StringToAddress();
> +    test_RtlIpv6AddressToStringA();
> +    test_RtlIpv6AddressToStringW();
>      test_LdrAddRefDll();
>      test_LdrLockLoaderLock();
>      test_RtlCompressBuffer();
> 




More information about the wine-devel mailing list