Piotr Caban : kernel32/tests: Test timeout behaviour on system clock change.
Alexandre Julliard
julliard at winehq.org
Thu Apr 9 16:04:47 CDT 2020
Module: wine
Branch: master
Commit: 2df67d56f3a36df754cd7a52d46c33981f07dbde
URL: https://source.winehq.org/git/wine.git/?a=commit;h=2df67d56f3a36df754cd7a52d46c33981f07dbde
Author: Piotr Caban <piotr at codeweavers.com>
Date: Mon Apr 6 17:21:26 2020 +0200
kernel32/tests: Test timeout behaviour on system clock change.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernel32/tests/timer.c | 188 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 188 insertions(+)
diff --git a/dlls/kernel32/tests/timer.c b/dlls/kernel32/tests/timer.c
index d2a6138c97..5e4bab4789 100644
--- a/dlls/kernel32/tests/timer.c
+++ b/dlls/kernel32/tests/timer.c
@@ -20,6 +20,8 @@
#include "wine/test.h"
#include "winbase.h"
+#include "winternl.h"
+#include "winuser.h"
static void test_timer(void)
@@ -66,7 +68,193 @@ static void test_timer(void)
CloseHandle( handle );
}
+#define TICKSPERSEC 10000000
+
+static BOOL adjust_system_time(int sec)
+{
+ ULARGE_INTEGER uli;
+ SYSTEMTIME st;
+ FILETIME ft;
+
+ GetSystemTimeAsFileTime(&ft);
+ uli.u.LowPart = ft.dwLowDateTime;
+ uli.u.HighPart = ft.dwHighDateTime;
+ uli.QuadPart += (LONGLONG)sec * TICKSPERSEC;
+ ft.dwLowDateTime = uli.u.LowPart;
+ ft.dwHighDateTime = uli.u.HighPart;
+ if (!FileTimeToSystemTime(&ft, &st))
+ return FALSE;
+ return SetSystemTime(&st);
+}
+
+static DWORD WINAPI thread_WaitForSingleObject(void *arg)
+{
+ HANDLE event;
+ DWORD t, r;
+
+ event = CreateEventW(NULL, FALSE, FALSE, NULL);
+ ok(event != NULL, "CreateEvent failed\n");
+ t = GetTickCount();
+ r = WaitForSingleObject(event, 3000);
+ ok(r == WAIT_TIMEOUT, "WiatForSingleObject returned %x\n", r);
+ CloseHandle(event);
+ t = GetTickCount() - t;
+ ok(t > 2000, "t = %d\n", t);
+ return 0;
+}
+
+static DWORD WINAPI thread_Sleep(void *arg)
+{
+ DWORD t = GetTickCount();
+
+ Sleep(3000);
+ t = GetTickCount() - t;
+ ok(t > 2000, "t = %d\n", t);
+ return 0;
+}
+
+static DWORD WINAPI thread_SleepEx(void *arg)
+{
+ DWORD t = GetTickCount();
+
+ SleepEx(3000, TRUE);
+ t = GetTickCount() - t;
+ ok(t > 2000, "t = %d\n", t);
+ return 0;
+}
+
+static DWORD WINAPI thread_WaitableTimer_rel(void *arg)
+{
+ LARGE_INTEGER li;
+ HANDLE timer;
+ DWORD t, r;
+
+ li.QuadPart = -3 * TICKSPERSEC;
+
+ timer = CreateWaitableTimerA(NULL, TRUE, NULL);
+ ok(timer != NULL, "CreateWaitableTimer failed\n");
+
+ t = GetTickCount();
+ r = SetWaitableTimer(timer, &li, 0, NULL, NULL, FALSE);
+ ok(r, "SetWaitableTimer failed\n");
+
+ r = WaitForSingleObject(timer, INFINITE);
+ ok(r == WAIT_OBJECT_0, "WaitForSingleObject returned %d\n", r);
+ CloseHandle(timer);
+ t = GetTickCount() - t;
+ ok(t > 2000, "t = %d\n", t);
+ return 0;
+}
+
+static DWORD WINAPI thread_WaitableTimer_abs(void *arg)
+{
+ LARGE_INTEGER li;
+ HANDLE timer;
+ FILETIME ft;
+ DWORD t, r;
+
+ GetSystemTimeAsFileTime(&ft);
+ li.u.LowPart = ft.dwLowDateTime;
+ li.u.HighPart = ft.dwHighDateTime;
+ li.QuadPart += 3 * TICKSPERSEC;
+
+ timer = CreateWaitableTimerA(NULL, TRUE, NULL);
+ ok(timer != NULL, "CreateWaitableTimer failed\n");
+
+ t = GetTickCount();
+ r = SetWaitableTimer(timer, &li, 0, NULL, NULL, FALSE);
+ ok(r, "SetWaitableTimer failed\n");
+
+ r = WaitForSingleObject(timer, INFINITE);
+ ok(r == WAIT_OBJECT_0, "WaitForSingleObject returned %d\n", r);
+ CloseHandle(timer);
+ t = GetTickCount() - t;
+ ok(t < 2000, "t = %d\n", t);
+ return 0;
+}
+
+static DWORD WINAPI thread_WaitableTimer_period(void *arg)
+{
+ LARGE_INTEGER li;
+ HANDLE timer;
+ DWORD t, r;
+
+ li.QuadPart = -1;
+
+ timer = CreateWaitableTimerA(NULL, FALSE, NULL);
+ ok(timer != NULL, "CreateWaitableTimer failed\n");
+
+ t = GetTickCount();
+ r = SetWaitableTimer(timer, &li, 3000, NULL, NULL, FALSE);
+ ok(r, "SetWaitableTimer failed\n");
+
+ r = WaitForSingleObject(timer, INFINITE);
+ ok(r == WAIT_OBJECT_0, "WaitForSingleObject returned %d\n", r);
+
+ r = WaitForSingleObject(timer, INFINITE);
+ ok(r == WAIT_OBJECT_0, "WaitForSingleObject returned %d\n", r);
+ CloseHandle(timer);
+ t = GetTickCount() - t;
+ ok(t > 2000, "t = %d\n", t);
+ return 0;
+}
+
+static DWORD WINAPI thread_SetTimer(void *arg)
+{
+ DWORD t = GetTickCount();
+ UINT_PTR timer;
+ MSG msg;
+
+ timer = SetTimer(NULL, 0, 3000, NULL);
+ ok(timer, "SetTimer failed (%d)\n", GetLastError());
+
+ while (GetMessageW(&msg, NULL, 0, 0))
+ {
+ DispatchMessageW(&msg);
+ if (msg.message == WM_TIMER) break;
+ }
+
+ t = GetTickCount() - t;
+ ok(t > 2000, "t = %d\n", t);
+ KillTimer(NULL, timer);
+ return 0;
+}
+
+static void test_timeouts(void)
+{
+ HANDLE threads[7];
+ DWORD i;
+
+ if (!adjust_system_time(1))
+ {
+ skip("can't adjust system clock (%d)\n", GetLastError());
+ return;
+ }
+
+
+ threads[0] = CreateThread(NULL, 0, thread_WaitForSingleObject, NULL, 0, NULL);
+ threads[1] = CreateThread(NULL, 0, thread_Sleep, NULL, 0, NULL);
+ threads[2] = CreateThread(NULL, 0, thread_SleepEx, NULL, 0, NULL);
+ threads[3] = CreateThread(NULL, 0, thread_WaitableTimer_rel, NULL, 0, NULL);
+ threads[4] = CreateThread(NULL, 0, thread_WaitableTimer_abs, NULL, 0, NULL);
+ threads[5] = CreateThread(NULL, 0, thread_WaitableTimer_period, NULL, 0, NULL);
+ threads[6] = CreateThread(NULL, 0, thread_SetTimer, NULL, 0, NULL);
+ for(i=0; i<ARRAY_SIZE(threads); i++)
+ ok(threads[i] != NULL, "CreateThread failed\n");
+
+ Sleep(500);
+ adjust_system_time(10);
+
+ for (i=0; i<ARRAY_SIZE(threads); i++)
+ {
+ WaitForSingleObject(threads[i], INFINITE);
+ CloseHandle(threads[i]);
+ }
+ adjust_system_time(-11);
+}
+
START_TEST(timer)
{
test_timer();
+ test_timeouts();
}
More information about the wine-cvs
mailing list