[ROSTESTS]
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Mon, 19 Aug 2013 21:44:26 +0000 (21:44 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Mon, 19 Aug 2013 21:44:26 +0000 (21:44 +0000)
Add a test for NtQueryTimerResolution and NtSetTimerResolution, by Aleksander Andrejevic.
See CORE-7387 for more information.

svn path=/trunk/; revision=59786

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

index 7e51573..4fa5026 100644 (file)
@@ -18,6 +18,7 @@ list(APPEND SOURCE
     RtlGetLongestNtPathLength.c
     RtlInitializeBitMap.c
     SystemInfo.c
+    Timer.c
     ZwContinue.c
     testlist.c)
 
diff --git a/rostests/apitests/ntdll/Timer.c b/rostests/apitests/ntdll/Timer.c
new file mode 100644 (file)
index 0000000..1bda9d0
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * PROJECT:         ReactOS API tests
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * PURPOSE:         Test for NtQueryTimerResolution and NtSetTimerResolution.
+ * PROGRAMMER:      Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
+ */
+
+#define WIN32_NO_STATUS
+#include <wine/test.h>
+#include <ndk/ketypes.h>
+#include <ndk/kefuncs.h>
+
+#include <stdio.h>
+
+START_TEST(TimerResolution)
+{
+    NTSTATUS Status;
+    ULONG CurrentResolution;
+    ULONG MinimumResolution;
+    ULONG MaximumResolution;
+    ULONG CurrentResolution2;
+
+    /* Get the current timer resolution */
+    Status = NtSetTimerResolution(0,        /* Ignored */
+                                  FALSE,    /* Don't change resolution */
+                                  &CurrentResolution);
+
+    /*
+     * When not setting the resolution, it always
+     * returns STATUS_TIMER_RESOLUTION_NOT_SET
+     */
+    ok_hex(Status, STATUS_TIMER_RESOLUTION_NOT_SET);
+
+    /*
+     * Get the timer resolution limits and current timer resolution
+     * using a different method
+     */
+    Status = NtQueryTimerResolution(&MinimumResolution,
+                                    &MaximumResolution,
+                                    &CurrentResolution2);
+
+    /* This function should always return STATUS_SUCCESS */
+    ok_hex(Status, STATUS_SUCCESS);
+
+    /* These two values should be the same */
+    ok_hex(CurrentResolution, CurrentResolution2);
+
+    /*
+     * Even if you give it invalid values,
+     * NtSetTimerResolution will return STATUS_SUCCESS,
+     * but it will not change the resolution.
+     */
+    Status = NtSetTimerResolution(MinimumResolution - 1,
+                                  TRUE,
+                                  &CurrentResolution);
+    ok_hex(Status, STATUS_SUCCESS);
+    printf("Current resolution: %d ; minimum resolution: %d\n", CurrentResolution, MinimumResolution);
+    ok(CurrentResolution >= MinimumResolution, "Current resolution: %d became too low! (minimum resolution: %d)\n", CurrentResolution, MinimumResolution);
+
+    Status = NtSetTimerResolution(MaximumResolution + 1,
+                                  TRUE,
+                                  &CurrentResolution);
+    ok_hex(Status, STATUS_SUCCESS);
+    printf("Current resolution: %d ; maximum resolution: %d\n", CurrentResolution, MaximumResolution);
+    ok(CurrentResolution <= MaximumResolution, "Current resolution: %d became too high! (maximum resolution: %d)\n", CurrentResolution, MaximumResolution);
+}
index 56e15ab..4279fdb 100644 (file)
@@ -22,6 +22,7 @@ extern void func_RtlGetFullPathName_UstrEx(void);
 extern void func_RtlGetLongestNtPathLength(void);
 extern void func_RtlInitializeBitMap(void);
 extern void func_ZwContinue(void);
+extern void func_TimerResolution(void);
 
 const struct test winetest_testlist[] =
 {
@@ -44,6 +45,7 @@ const struct test winetest_testlist[] =
     { "RtlGetLongestNtPathLength",      func_RtlGetLongestNtPathLength },
     { "RtlInitializeBitMap",            func_RtlInitializeBitMap },
     { "ZwContinue",                     func_ZwContinue },
+    { "TimerResolution",                func_TimerResolution },
 
     { 0, 0 }
 };