Andrew Nguyen : advapi32/tests: Add tests for GetUserNameA/W.

Alexandre Julliard julliard at winehq.org
Tue May 31 13:08:20 CDT 2011


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

Author: Andrew Nguyen <anguyen at codeweavers.com>
Date:   Tue May 31 11:05:25 2011 -0500

advapi32/tests: Add tests for GetUserNameA/W.

---

 dlls/advapi32/tests/security.c |  155 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 155 insertions(+), 0 deletions(-)

diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c
index 4b7473f..1d677ac 100644
--- a/dlls/advapi32/tests/security.c
+++ b/dlls/advapi32/tests/security.c
@@ -3723,6 +3723,159 @@ static void test_EqualSid(void)
     FreeSid(sid2);
 }
 
+static void test_GetUserNameA(void)
+{
+    char buffer[UNLEN + 1], filler[UNLEN + 1];
+    DWORD required_len, buffer_len;
+    BOOL ret;
+
+    /* Test crashes on Windows. */
+    if (0)
+    {
+        SetLastError(0xdeadbeef);
+        GetUserNameA(NULL, NULL);
+    }
+
+    SetLastError(0xdeadbeef);
+    required_len = 0;
+    ret = GetUserNameA(NULL, &required_len);
+    ok(ret == FALSE, "GetUserNameA returned %d\n", ret);
+    ok(required_len != 0, "Outputted buffer length was %u\n", required_len);
+    todo_wine
+    ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %u\n", GetLastError());
+
+    SetLastError(0xdeadbeef);
+    required_len = 1;
+    ret = GetUserNameA(NULL, &required_len);
+    ok(ret == FALSE, "GetUserNameA returned %d\n", ret);
+    ok(required_len != 0 && required_len != 1, "Outputted buffer length was %u\n", required_len);
+    todo_wine
+    ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %u\n", GetLastError());
+
+    /* Tests crashes on Windows. */
+    if (0)
+    {
+        SetLastError(0xdeadbeef);
+        required_len = UNLEN + 1;
+        GetUserNameA(NULL, &required_len);
+
+        SetLastError(0xdeadbeef);
+        GetUserNameA(buffer, NULL);
+    }
+
+    memset(filler, 'x', sizeof(filler));
+
+    /* Note that GetUserNameA on XP and newer outputs the number of bytes
+     * required for a Unicode string, which affects a test in the next block. */
+    SetLastError(0xdeadbeef);
+    memcpy(buffer, filler, sizeof(filler));
+    required_len = 0;
+    ret = GetUserNameA(buffer, &required_len);
+    ok(ret == FALSE, "GetUserNameA returned %d\n", ret);
+    ok(!memcmp(buffer, filler, sizeof(filler)), "Output buffer was altered\n");
+    ok(required_len != 0, "Outputted buffer length was %u\n", required_len);
+    todo_wine
+    ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %u\n", GetLastError());
+
+    SetLastError(0xdeadbeef);
+    memcpy(buffer, filler, sizeof(filler));
+    buffer_len = required_len;
+    ret = GetUserNameA(buffer, &buffer_len);
+    ok(ret == TRUE, "GetUserNameA returned %d, last error %u\n", ret, GetLastError());
+    ok(memcmp(buffer, filler, sizeof(filler)) != 0, "Output buffer was untouched\n");
+    todo_wine
+    ok(buffer_len == required_len ||
+       broken(buffer_len == required_len / sizeof(WCHAR)), /* XP+ */
+       "Outputted buffer length was %u\n", buffer_len);
+
+    /* Use the reported buffer size from the last GetUserNameA call and pass
+     * a length that is one less than the required value. */
+    SetLastError(0xdeadbeef);
+    memcpy(buffer, filler, sizeof(filler));
+    buffer_len--;
+    ret = GetUserNameA(buffer, &buffer_len);
+    ok(ret == FALSE, "GetUserNameA returned %d\n", ret);
+    todo_wine {
+    ok(!memcmp(buffer, filler, sizeof(filler)), "Output buffer was untouched\n");
+    ok(buffer_len == required_len, "Outputted buffer length was %u\n", buffer_len);
+    ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %u\n", GetLastError());
+    }
+}
+
+static void test_GetUserNameW(void)
+{
+    WCHAR buffer[UNLEN + 1], filler[UNLEN + 1];
+    DWORD required_len, buffer_len;
+    BOOL ret;
+
+    /* Test crashes on Windows. */
+    if (0)
+    {
+        SetLastError(0xdeadbeef);
+        GetUserNameW(NULL, NULL);
+    }
+
+    SetLastError(0xdeadbeef);
+    required_len = 0;
+    ret = GetUserNameW(NULL, &required_len);
+    ok(ret == FALSE, "GetUserNameW returned %d\n", ret);
+    ok(required_len != 0, "Outputted buffer length was %u\n", required_len);
+    todo_wine
+    ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %u\n", GetLastError());
+
+    SetLastError(0xdeadbeef);
+    required_len = 1;
+    ret = GetUserNameW(NULL, &required_len);
+    ok(ret == FALSE, "GetUserNameW returned %d\n", ret);
+    ok(required_len != 0 && required_len != 1, "Outputted buffer length was %u\n", required_len);
+    todo_wine
+    ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %u\n", GetLastError());
+
+    /* Tests crash on Windows. */
+    if (0)
+    {
+        SetLastError(0xdeadbeef);
+        required_len = UNLEN + 1;
+        GetUserNameW(NULL, &required_len);
+
+        SetLastError(0xdeadbeef);
+        GetUserNameW(buffer, NULL);
+    }
+
+    memset(filler, 'x', sizeof(filler));
+
+    SetLastError(0xdeadbeef);
+    memcpy(buffer, filler, sizeof(filler));
+    required_len = 0;
+    ret = GetUserNameW(buffer, &required_len);
+    ok(ret == FALSE, "GetUserNameW returned %d\n", ret);
+    ok(!memcmp(buffer, filler, sizeof(filler)), "Output buffer was altered\n");
+    ok(required_len != 0, "Outputted buffer length was %u\n", required_len);
+    todo_wine
+    ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %u\n", GetLastError());
+
+    SetLastError(0xdeadbeef);
+    memcpy(buffer, filler, sizeof(filler));
+    buffer_len = required_len;
+    ret = GetUserNameW(buffer, &buffer_len);
+    ok(ret == TRUE, "GetUserNameW returned %d, last error %u\n", ret, GetLastError());
+    ok(memcmp(buffer, filler, sizeof(filler)) != 0, "Output buffer was untouched\n");
+    ok(buffer_len == required_len, "Outputted buffer length was %u\n", buffer_len);
+
+    /* GetUserNameW on XP and newer writes a truncated portion of the username string to the buffer. */
+    SetLastError(0xdeadbeef);
+    memcpy(buffer, filler, sizeof(filler));
+    buffer_len--;
+    ret = GetUserNameW(buffer, &buffer_len);
+    ok(ret == FALSE, "GetUserNameW returned %d\n", ret);
+    ok(!memcmp(buffer, filler, sizeof(filler)) ||
+       broken(memcmp(buffer, filler, sizeof(filler)) != 0), /* XP+ */
+       "Output buffer was altered\n");
+    ok(buffer_len == required_len, "Outputted buffer length was %u\n", buffer_len);
+    todo_wine
+    ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %u\n", GetLastError());
+}
+
 START_TEST(security)
 {
     init();
@@ -3756,4 +3909,6 @@ START_TEST(security)
     test_GetSidSubAuthority();
     test_CheckTokenMembership();
     test_EqualSid();
+    test_GetUserNameA();
+    test_GetUserNameW();
 }




More information about the wine-cvs mailing list