[6/6] kernel32: Add interactive WaitCommEvent tests.

Dmitry Timoshkov dmitry at baikal.ru
Thu Aug 15 02:41:13 CDT 2013


---
 dlls/kernel32/tests/comm.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 62 insertions(+)

diff --git a/dlls/kernel32/tests/comm.c b/dlls/kernel32/tests/comm.c
index b393db4..12a808d 100644
--- a/dlls/kernel32/tests/comm.c
+++ b/dlls/kernel32/tests/comm.c
@@ -1818,6 +1818,60 @@ static void test_stdio(void)
         "got error %u\n", GetLastError() );
 }
 
+static void test_WaitCommEvent(void)
+{
+    HANDLE hcom;
+    DWORD evtmask, ret, bytes, before, after, last_event_time;
+    OVERLAPPED ovl_wait;
+
+    hcom = test_OpenComm(TRUE);
+    if (hcom == INVALID_HANDLE_VALUE) return;
+
+    test_GetModemStatus(hcom);
+
+    ret = SetCommMask(hcom, 0x1fff);
+    ok(ret, "SetCommMask error %d\n", GetLastError());
+
+    S(U(ovl_wait)).Offset = 0;
+    S(U(ovl_wait)).OffsetHigh = 0;
+    ovl_wait.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+
+    trace("waiting 10 secs for com port events (turn on/off the device)...\n");
+    last_event_time = 0;
+    before = GetTickCount();
+    do
+    {
+        evtmask = 0;
+        SetLastError(0xdeadbeef);
+        ret = WaitCommEvent(hcom, &evtmask, &ovl_wait);
+        ok(!ret && GetLastError() == ERROR_IO_PENDING, "WaitCommEvent returned %d, error %d\n", ret, GetLastError());
+        if (GetLastError() != ERROR_IO_PENDING) goto done; /* no point in further testing */
+        for (;;)
+        {
+            ret = WaitForSingleObject(ovl_wait.hEvent, 500);
+            after = GetTickCount();
+            if (ret == WAIT_OBJECT_0)
+            {
+                last_event_time = after;
+                ret = GetOverlappedResult(hcom, &ovl_wait, &bytes, FALSE);
+                ok(ret, "GetOverlappedResult reported error %d\n", GetLastError());
+                ok(bytes == sizeof(evtmask), "expected %u, written %u\n", (UINT)sizeof(evtmask), bytes);
+                trace("WaitCommEvent: got events %#x\n", evtmask);
+                test_GetModemStatus(hcom);
+                break;
+            }
+            else
+            {
+                if (last_event_time || after - before >= 10000) goto done;
+            }
+        }
+    } while (after - before < 10000);
+
+done:
+    CloseHandle(ovl_wait.hEvent);
+    CloseHandle(hcom);
+}
+
 START_TEST(comm)
 {
     test_ClearCommError(); /* keep it the very first test */
@@ -1838,4 +1892,12 @@ START_TEST(comm)
     test_WaitDcd();
     test_WaitBreak();
     test_stdio();
+
+    if (!winetest_interactive)
+    {
+        skip("interactive tests (set WINETEST_INTERACTIVE=1)\n");
+        return;
+    }
+
+    test_WaitCommEvent();
 }
-- 
1.8.3.4




More information about the wine-patches mailing list