libwinpr-synch: add unit test for waitable timer asynchronous procedure calls
authorMarc-André Moreau <marcandre.moreau@gmail.com>
Fri, 24 Jan 2014 23:08:06 +0000 (18:08 -0500)
committerMarc-André Moreau <marcandre.moreau@gmail.com>
Fri, 24 Jan 2014 23:08:06 +0000 (18:08 -0500)
client/X11/generate_argument_docbook.c
winpr/libwinpr/synch/test/CMakeLists.txt
winpr/libwinpr/synch/test/TestSynchWaitableTimerAPC.c [new file with mode: 0644]

index 75bef5f..dd7b9d9 100644 (file)
@@ -11,7 +11,7 @@
 
 LPSTR tmp = NULL;
 
-LPSTR tr_esc_str(LPSTR arg)
+LPSTR tr_esc_str(LPCSTR arg)
 {
        size_t cs = 0, x, ds;
        size_t s;
index cdda383..1d21af0 100644 (file)
@@ -11,7 +11,8 @@ set(${MODULE_PREFIX}_TESTS
        TestSynchSemaphore.c
        TestSynchThread.c
        TestSynchTimerQueue.c
-       TestSynchWaitableTimer.c)
+       TestSynchWaitableTimer.c
+       TestSynchWaitableTimerAPC.c)
 
 create_test_sourcelist(${MODULE_PREFIX}_SRCS
        ${${MODULE_PREFIX}_DRIVER}
diff --git a/winpr/libwinpr/synch/test/TestSynchWaitableTimerAPC.c b/winpr/libwinpr/synch/test/TestSynchWaitableTimerAPC.c
new file mode 100644 (file)
index 0000000..ed34b3e
--- /dev/null
@@ -0,0 +1,55 @@
+
+#include <winpr/crt.h>
+#include <winpr/synch.h>
+
+HANDLE gDoneEvent;
+
+VOID CALLBACK TimerAPCProc(LPVOID lpArg, DWORD dwTimerLowValue, DWORD dwTimerHighValue)
+{
+       int param;
+
+       if (!lpArg)
+               return;
+
+       param = *((int*) lpArg);
+
+       printf("TimerAPCProc: %d\n", param);
+
+       SetEvent(gDoneEvent);
+}
+
+int TestSynchWaitableTimerAPC(int argc, char* argv[])
+{
+       int arg = 123;
+       HANDLE hTimer;
+       BOOL bSuccess;
+       INT64 qwDueTime;
+       LARGE_INTEGER liDueTime;
+
+       hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
+
+       if (!hTimer)
+               return -1;
+
+       qwDueTime = -5 * 10000000;
+       liDueTime.LowPart = (DWORD) (qwDueTime & 0xFFFFFFFF);
+       liDueTime.HighPart = (LONG) (qwDueTime >> 32);
+
+       bSuccess = SetWaitableTimer(hTimer, &liDueTime, 2000, TimerAPCProc, &arg, FALSE);
+
+       if (!bSuccess)
+               return -1;
+
+       if (WaitForSingleObject(gDoneEvent, INFINITE) != WAIT_OBJECT_0)
+       {
+               printf("WaitForSingleObject failed (%d)\n", GetLastError());
+               return -1;
+       }
+
+       CloseHandle(gDoneEvent);
+
+       CloseHandle(hTimer);
+
+       return 0;
+}
+