Dmitry Timoshkov : kernel32/tests: Add a test to show that WaitCommEvent should succeed after SetCommMask( EV_TXEMPTY)+WriteFile+FlushFileBuffers.
Alexandre Julliard
julliard at winehq.org
Tue Sep 3 13:38:03 CDT 2013
Module: wine
Branch: master
Commit: 663dbd9f1c4ce1c26f07e52749a2a697fa403a05
URL: http://source.winehq.org/git/wine.git/?a=commit;h=663dbd9f1c4ce1c26f07e52749a2a697fa403a05
Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date: Mon Sep 2 18:25:31 2013 +0900
kernel32/tests: Add a test to show that WaitCommEvent should succeed after SetCommMask(EV_TXEMPTY)+WriteFile+FlushFileBuffers.
---
dlls/kernel32/tests/comm.c | 97 +++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 95 insertions(+), 2 deletions(-)
diff --git a/dlls/kernel32/tests/comm.c b/dlls/kernel32/tests/comm.c
index 6970cf9..882b652 100644
--- a/dlls/kernel32/tests/comm.c
+++ b/dlls/kernel32/tests/comm.c
@@ -780,10 +780,11 @@ static void test_waittxempty(void)
DCB dcb;
COMMTIMEOUTS timeouts;
char tbuf[]="test_waittxempty";
- DWORD before, after, bytes, timediff, evtmask;
+ DWORD before, after, bytes, timediff, evtmask, errors, i;
BOOL res;
DWORD baud = SLOWBAUD;
OVERLAPPED ovl_write, ovl_wait;
+ COMSTAT stat;
hcom = test_OpenComm(TRUE);
if (hcom == INVALID_HANDLE_VALUE) return;
@@ -855,7 +856,19 @@ todo_wine
ok(bytes == sizeof(evtmask), "expected %u, written %u\n", (UINT)sizeof(evtmask), bytes);
res = TRUE;
}
- else res = FALSE;
+ else
+ {
+ /* unblock pending wait */
+ trace("recovering after WAIT_TIMEOUT...\n");
+ /* FIXME: Wine fails to unblock with new mask being equal to the old one */
+ res = SetCommMask(hcom, 0);
+ ok(res, "SetCommMask error %d\n", GetLastError());
+
+ res = WaitForSingleObject(ovl_wait.hEvent, TIMEOUT);
+ ok(res == WAIT_OBJECT_0, "WaitCommEvent failed with a timeout\n");
+
+ res = FALSE;
+ }
after = GetTickCount();
todo_wine
ok(res, "WaitCommEvent error %d\n", GetLastError());
@@ -876,6 +889,86 @@ todo_wine
CloseHandle(ovl_write.hEvent);
CloseHandle(hcom);
+
+ for (i = 0; i < 2; i++)
+ {
+ hcom = test_OpenComm(TRUE);
+ if (hcom == INVALID_HANDLE_VALUE) return;
+
+ res = SetCommMask(hcom, EV_TXEMPTY);
+ ok(res, "SetCommMask error %d\n", GetLastError());
+
+ if (i == 0)
+ {
+ S(U(ovl_write)).Offset = 0;
+ S(U(ovl_write)).OffsetHigh = 0;
+ ovl_write.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+ before = GetTickCount();
+ SetLastError(0xdeadbeef);
+ res = WriteFile(hcom, tbuf, sizeof(tbuf), &bytes, &ovl_write);
+todo_wine
+ ok(!res && GetLastError() == ERROR_IO_PENDING, "WriteFile returned %d, error %d\n", res, GetLastError());
+todo_wine
+ ok(!bytes, "expected 0, got %u\n", bytes);
+
+ ClearCommError(hcom, &errors, &stat);
+ ok(stat.cbInQue == 0, "InQueue should be empty, got %d bytes\n", stat.cbInQue);
+ ok(stat.cbOutQue != 0 || broken(stat.cbOutQue == 0) /* VM */, "OutQueue should not be empty\n");
+ ok(errors == 0, "ClearCommErrors: Unexpected error 0x%08x\n", errors);
+
+ res = GetOverlappedResult(hcom, &ovl_write, &bytes, TRUE);
+ ok(res, "GetOverlappedResult reported error %d\n", GetLastError());
+ ok(bytes == sizeof(tbuf), "expected %u, written %u\n", (UINT)sizeof(tbuf), bytes);
+ CloseHandle(ovl_write.hEvent);
+
+ res = FlushFileBuffers(hcom);
+ ok(res, "FlushFileBuffers error %d\n", GetLastError());
+ }
+
+ ClearCommError(hcom, &errors, &stat);
+ ok(stat.cbInQue == 0, "InQueue should be empty, got %d bytes\n", stat.cbInQue);
+ ok(stat.cbOutQue == 0, "OutQueue should be empty, got %d bytes\n", stat.cbOutQue);
+ ok(errors == 0, "ClearCommErrors: Unexpected error 0x%08x\n", errors);
+
+ S(U(ovl_wait)).Offset = 0;
+ S(U(ovl_wait)).OffsetHigh = 0;
+ ovl_wait.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+ evtmask = 0;
+ SetLastError(0xdeadbeef);
+ res = WaitCommEvent(hcom, &evtmask, &ovl_wait);
+ ok(!res && GetLastError() == ERROR_IO_PENDING, "%d: WaitCommEvent error %d\n", i, GetLastError());
+
+ res = WaitForSingleObject(ovl_wait.hEvent, TIMEOUT);
+ if (i == 0)
+todo_wine
+ ok(res == WAIT_OBJECT_0, "WaitCommEvent failed with a timeout\n");
+ else
+ ok(res == WAIT_TIMEOUT, "WaitCommEvent should fail with a timeout\n");
+ if (res == WAIT_OBJECT_0)
+ {
+ res = GetOverlappedResult(hcom, &ovl_wait, &bytes, FALSE);
+ ok(res, "GetOverlappedResult reported error %d\n", GetLastError());
+ ok(bytes == sizeof(evtmask), "expected %u, written %u\n", (UINT)sizeof(evtmask), bytes);
+ ok(res, "WaitCommEvent error %d\n", GetLastError());
+ ok(evtmask & EV_TXEMPTY, "WaitCommEvent: expected EV_TXEMPTY, got %#x\n", evtmask);
+ }
+ else
+ {
+ ok(!evtmask, "WaitCommEvent: expected 0, got %#x\n", evtmask);
+
+ /* unblock pending wait */
+ trace("recovering after WAIT_TIMEOUT...\n");
+ /* FIXME: Wine fails to unblock with new mask being equal to the old one */
+ res = SetCommMask(hcom, 0);
+ ok(res, "SetCommMask error %d\n", GetLastError());
+
+ res = WaitForSingleObject(ovl_wait.hEvent, TIMEOUT);
+ ok(res == WAIT_OBJECT_0, "WaitCommEvent failed with a timeout\n");
+ CloseHandle(ovl_wait.hEvent);
+ }
+
+ CloseHandle(hcom);
+ }
}
/* A new open handle should not return error or have bytes in the Queues */
More information about the wine-cvs
mailing list