[WINMM] timer patch with test

Robert Reif reif at earthlink.net
Fri Feb 11 10:18:09 CST 2005


Added parameter checking to timeGetDevCaps.
Added timer tests.

Tested on xp only.
-------------- next part --------------
diff -u -N wine.cvs/dlls/winmm/time.c wine/dlls/winmm/time.c
--- wine.cvs/dlls/winmm/time.c	2004-12-28 12:21:58.000000000 -0500
+++ wine/dlls/winmm/time.c	2005-02-11 10:29:46.000000000 -0500
@@ -408,9 +408,19 @@
 {
     TRACE("(%p, %u)\n", lpCaps, wSize);
 
+    if (lpCaps == 0) {
+        WARN("invalid lpCaps\n");
+        return TIMERR_NOCANDO;
+    }
+
+    if (wSize < sizeof(TIMECAPS)) {
+        WARN("invalid wSize\n");
+        return TIMERR_NOCANDO;
+    }
+
     lpCaps->wPeriodMin = MMSYSTIME_MININTERVAL;
     lpCaps->wPeriodMax = MMSYSTIME_MAXINTERVAL;
-    return 0;
+    return TIMERR_NOERROR;
 }
 
 /**************************************************************************
diff -u -N wine.cvs/dlls/winmm/tests/.cvsignore wine/dlls/winmm/tests/.cvsignore
--- wine.cvs/dlls/winmm/tests/.cvsignore	2004-08-15 15:23:11.000000000 -0400
+++ wine/dlls/winmm/tests/.cvsignore	2005-02-11 11:11:46.000000000 -0500
@@ -2,4 +2,5 @@
 capture.ok
 mixer.ok
 testlist.c
+timer.ok
 wave.ok
diff -u -N wine.cvs/dlls/winmm/tests/Makefile.in wine/dlls/winmm/tests/Makefile.in
--- wine.cvs/dlls/winmm/tests/Makefile.in	2004-08-15 15:23:11.000000000 -0400
+++ wine/dlls/winmm/tests/Makefile.in	2005-02-11 07:58:52.000000000 -0500
@@ -8,6 +8,7 @@
 CTESTS = \
 	capture.c \
 	mixer.c \
+	timer.c \
 	wave.c
 
 @MAKE_TEST_RULES@
diff -u -N wine.cvs/dlls/winmm/tests/timer.c wine/dlls/winmm/tests/timer.c
--- wine.cvs/dlls/winmm/tests/timer.c	1969-12-31 19:00:00.000000000 -0500
+++ wine/dlls/winmm/tests/timer.c	2005-02-11 10:36:32.000000000 -0500
@@ -0,0 +1,160 @@
+/*
+ * Test winmm timer
+ *
+ * Copyright (c) 2005 Robert Reif
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include "wine/test.h"
+#include "windef.h"
+#include "winbase.h"
+#include "winnls.h"
+#include "mmsystem.h"
+#define NOBITMAP
+#include "mmreg.h"
+
+#include "winmm_test.h"
+
+TIMECAPS tc;
+
+void test_timeGetDevCaps()
+{
+   MMRESULT rc;
+
+    rc = timeGetDevCaps(&tc, 0);
+    ok(rc == TIMERR_NOCANDO, "timeGetDevCaps() returned %s, "
+       "should have returned TIMERR_NOCANDO\n", mmsys_error(rc));
+
+    rc = timeGetDevCaps(0, sizeof(tc));
+    ok(rc == TIMERR_NOCANDO, "timeGetDevCaps() returned %s, "
+       "should have returned TIMERR_NOCANDO\n", mmsys_error(rc));
+
+    rc = timeGetDevCaps(0, 0);
+    ok(rc == TIMERR_NOCANDO, "timeGetDevCaps() returned %s, "
+       "should have returned TIMERR_NOCANDO\n", mmsys_error(rc));
+
+    rc = timeGetDevCaps(&tc, sizeof(tc));
+    ok(rc == TIMERR_NOERROR, "timeGetDevCaps() returned %s, "
+       "should have returned TIMERR_NOERROR\n", mmsys_error(rc));
+
+    if (rc == TIMERR_NOERROR)
+        trace("wPeriodMin = %u, wPeriodMax = %u\n",
+              tc.wPeriodMin, tc.wPeriodMax);
+}
+
+#define NUM_SAMPLES    100
+
+static DWORD count = 0;
+static DWORD times[NUM_SAMPLES];
+
+void CALLBACK testTimeProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
+{
+    if (count < NUM_SAMPLES)
+        times[count++] = timeGetTime();
+}
+
+void test_timer(UINT period, UINT resolution)
+{
+    MMRESULT rc;
+    UINT i, id, delta;
+    DWORD dwMin = 0xffffffff, dwMax = 0;
+    double sum = 0.0;
+
+    count = 0;
+
+    for (i = 0; i < NUM_SAMPLES; i++)
+        times[i] = 0;
+
+    rc = timeBeginPeriod(period);
+    ok(rc == TIMERR_NOERROR, "timeBeginPeriod(%u) returned %s, "
+       "should have returned TIMERR_NOERROR", period, mmsys_error(rc));
+    if (rc != TIMERR_NOERROR)
+        return;
+
+    id = timeSetEvent(period, resolution, testTimeProc, 0, TIME_PERIODIC);
+    ok(id != 0, "timeSetEvent(%u, %u, %p, 0, TIME_PERIODIC) returned %d, "
+       "should have returned id > 0", period, resolution, testTimeProc, id);
+    if (id == 0)
+        return;
+
+    Sleep((NUM_SAMPLES * period) + (2 * period));
+
+    rc = timeEndPeriod(period);
+    ok(rc == TIMERR_NOERROR, "timeEndPeriod(%u) returned %s, "
+       "should have returned TIMERR_NOERROR", period, mmsys_error(rc));
+    if (rc != TIMERR_NOERROR)
+        return;
+
+    rc = timeKillEvent(id);
+    ok(rc == TIMERR_NOERROR, "timeKillEvent(%u) returned %s, "
+       "should have returned TIMERR_NOERROR", id, mmsys_error(rc));
+
+    trace("period = %u, resolution = %u\n", period, resolution);
+
+    for (i = 0; i < count; i++)
+    {
+        if (i == 0)
+        {
+            if (winetest_debug > 1)
+                trace("time[%d] = %lu\n", i, times[i]);
+        }
+        else
+        {
+            delta = times[i] - times[i - 1];
+
+            if (winetest_debug > 1)
+                trace("time[%d] = %lu delta = %d\n", i, times[i], delta);
+
+            sum += delta;
+
+            if (delta < dwMin)
+                dwMin = delta;
+
+            if (delta > dwMax)
+                dwMax = delta;
+        }
+    }
+
+    trace("min = %lu, max = %lu, average = %f\n", dwMin, dwMax, sum / (count - 1));
+}
+
+START_TEST(timer)
+{
+    test_timeGetDevCaps();
+
+    if (tc.wPeriodMin <= 1) {
+        test_timer(1, 0);
+        test_timer(1, 1);
+    }
+
+    if (tc.wPeriodMin <= 10) {
+        test_timer(10, 0);
+        test_timer(10, 1);
+        test_timer(10, 10);
+    }
+
+    if (tc.wPeriodMin <= 20) {
+        test_timer(20, 0);
+        test_timer(20, 1);
+        test_timer(20, 10);
+        test_timer(20, 20);
+    }
+}


More information about the wine-patches mailing list