[ADVAPI32_APITESTS]
authorJérôme Gardou <jerome.gardou@reactos.org>
Mon, 13 Oct 2014 18:49:09 +0000 (18:49 +0000)
committerJérôme Gardou <jerome.gardou@reactos.org>
Mon, 13 Oct 2014 18:49:09 +0000 (18:49 +0000)
 - Add a few tests for DuplicateTokenEx

svn path=/trunk/; revision=64736

rostests/apitests/advapi32/CMakeLists.txt
rostests/apitests/advapi32/DuplicateTokenEx.c [new file with mode: 0644]
rostests/apitests/advapi32/testlist.c

index f148e22..dd88029 100644 (file)
@@ -1,6 +1,7 @@
 
 list(APPEND SOURCE
     CreateService.c
 
 list(APPEND SOURCE
     CreateService.c
+    DuplicateTokenEx.c
     HKEY_CLASSES_ROOT.c
     LockDatabase.c
     QueryServiceConfig2.c
     HKEY_CLASSES_ROOT.c
     LockDatabase.c
     QueryServiceConfig2.c
diff --git a/rostests/apitests/advapi32/DuplicateTokenEx.c b/rostests/apitests/advapi32/DuplicateTokenEx.c
new file mode 100644 (file)
index 0000000..b8e64c6
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * PROJECT:         ReactOS api tests
+ * LICENSE:         GPLv2+ - See COPYING in the top level directory
+ * PURPOSE:         Test for DupicateTokenEx
+ * PROGRAMMER:      Jérôme Gardou <jerome.gardou@reactos.org>
+ */
+
+#include <apitest.h>
+#include <winbase.h>
+#include <rtlfuncs.h>
+
+#define ok_luid_equal(Luid, Expected)                                                                             \
+    ok(RtlEqualLuid((Luid), (Expected)), "Got wrong LUID %08lx%08lx, expected (%08lx%08lx).\n", \
+        (Luid)->HighPart, (Luid)->LowPart, (Expected)->HighPart, (Expected)->LowPart)
+#define ok_luid_notequal(Luid, Comparand)                                                                             \
+    ok(!RtlEqualLuid((Luid), (Comparand)), "LUID is %08lx%08lx and should not be.\n", \
+        (Luid)->HighPart, (Luid)->LowPart)
+
+START_TEST(DuplicateTokenEx)
+{
+    HANDLE ProcessToken, TokenDup;
+    TOKEN_STATISTICS ProcessTokenStats, TokenDupStats;
+    BOOL Result;
+    DWORD ReturnLength;
+
+    /* Get the current process token */
+    Result = OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_QUERY, &ProcessToken);
+    ok(Result, "OpenProcessToken failed. GLE: %lu.\n", GetLastError());
+    /* And its statistics */
+    Result = GetTokenInformation(ProcessToken,
+        TokenStatistics,
+        &ProcessTokenStats,
+        sizeof(ProcessTokenStats),
+        &ReturnLength);
+    ok(Result, "GetTokenInformation failed. GLE: %lu.\n", GetLastError());
+    ok_size_t(ReturnLength, sizeof(ProcessTokenStats));
+
+    /* Duplicate it as primary token with the same access rights. */
+    Result = DuplicateTokenEx(ProcessToken, 0, NULL, SecurityImpersonation, TokenPrimary, &TokenDup);
+    ok(Result, "DuplicateTokenEx failed. GLE: %lu.\n", GetLastError());
+    /* Get the stats */
+    Result = GetTokenInformation(TokenDup,
+        TokenStatistics,
+        &TokenDupStats,
+        sizeof(ProcessTokenStats),
+        &ReturnLength);
+    ok(Result, "GetTokenInformation failed. GLE: %lu.\n", GetLastError());
+    ok_size_t(ReturnLength, sizeof(ProcessTokenStats));
+    /* And test them */
+    ok_luid_notequal(&TokenDupStats.TokenId, &ProcessTokenStats.TokenId);
+    ok_luid_equal(&TokenDupStats.AuthenticationId, &ProcessTokenStats.AuthenticationId);
+    ok(TokenDupStats.TokenType == TokenPrimary, "Duplicate token type is %d.\n", TokenDupStats.TokenType);
+    ok(TokenDupStats.ImpersonationLevel == SecurityImpersonation,
+        "Duplicate token impersonation level is %d.\n", TokenDupStats.ImpersonationLevel);
+    ok_dec(TokenDupStats.DynamicCharged, ProcessTokenStats.DynamicCharged);
+    ok_dec(TokenDupStats.DynamicAvailable, ProcessTokenStats.DynamicAvailable);
+    ok_dec(TokenDupStats.GroupCount, ProcessTokenStats.GroupCount);
+    ok_dec(TokenDupStats.PrivilegeCount, ProcessTokenStats.PrivilegeCount);
+    ok_luid_equal(&TokenDupStats.ModifiedId, &ProcessTokenStats.ModifiedId);
+
+    CloseHandle(ProcessToken);
+    CloseHandle(TokenDup);
+}
index 80ad3d3..4c35a7b 100644 (file)
@@ -4,6 +4,7 @@
 #include <apitest.h>
 
 extern void func_CreateService(void);
 #include <apitest.h>
 
 extern void func_CreateService(void);
+extern void func_DuplicateTokenEx(void);
 extern void func_HKEY_CLASSES_ROOT(void);
 extern void func_LockDatabase(void);
 extern void func_QueryServiceConfig2(void);
 extern void func_HKEY_CLASSES_ROOT(void);
 extern void func_LockDatabase(void);
 extern void func_QueryServiceConfig2(void);
@@ -14,6 +15,7 @@ extern void func_SaferIdentifyLevel(void);
 const struct test winetest_testlist[] =
 {
     { "CreateService", func_CreateService },
 const struct test winetest_testlist[] =
 {
     { "CreateService", func_CreateService },
+    { "DuplicateTokenEx", func_DuplicateTokenEx },
     { "HKEY_CLASSES_ROOT", func_HKEY_CLASSES_ROOT },
     { "LockDatabase" , func_LockDatabase },
     { "QueryServiceConfig2", func_QueryServiceConfig2 },
     { "HKEY_CLASSES_ROOT", func_HKEY_CLASSES_ROOT },
     { "LockDatabase" , func_LockDatabase },
     { "QueryServiceConfig2", func_QueryServiceConfig2 },