[4/6] kernel32: Make serial tests self-contained.

Dmitry Timoshkov dmitry at baikal.ru
Thu Aug 15 02:39:45 CDT 2013


This patch was mostly inspired by fixing crashes in serial tests
with overlapped IO under Windows 7. It seems that the crashes were
caused by CloseHandle(hcom) calls which were triggering accesses to
OVERLAPPED structure in an already destroyed stack frame.
---
 dlls/kernel32/tests/comm.c | 284 ++++++++++++++++++++++++++-------------------
 1 file changed, 167 insertions(+), 117 deletions(-)

diff --git a/dlls/kernel32/tests/comm.c b/dlls/kernel32/tests/comm.c
index 765b54f..81953cb 100644
--- a/dlls/kernel32/tests/comm.c
+++ b/dlls/kernel32/tests/comm.c
@@ -41,6 +41,12 @@
  * available. For the 8250 this is equivalent to TXD->RXD, OUT2->DCD,
  * OUT1->RI, RTS->CTS and DTR->DSR
  */
+/* use variables and not #define to compile the code */
+static BOOL loopback_txd_rxd  = LOOPBACK_TXD_RXD;
+static BOOL loopback_rts_cts  = LOOPBACK_CTS_RTS;
+static BOOL loopback_dtr_dsr  = LOOPBACK_DTR_DSR;
+static BOOL loopback_dtr_ring = LOOPBACK_DTR_RING;
+static BOOL loopback_dtr_dcd  = LOOPBACK_DTR_DCD;
 
 typedef struct
 {
@@ -727,14 +733,20 @@ static void test_GetModemStatus(HANDLE hcom)
 }
 
 /* When we don't write anything, Read should time out even on a loopbacked port */
-static void test_ReadTimeOut(HANDLE hcom)
+static void test_ReadTimeOut(void)
 {
+    HANDLE hcom;
     DCB dcb;
     COMMTIMEOUTS timeouts;
     char rbuf[32];
     DWORD before, after, read, timediff, LastError;
     BOOL res;
 
+    hcom = test_OpenComm(FALSE);
+    if (hcom == INVALID_HANDLE_VALUE) return;
+
+    test_GetModemStatus(hcom);
+
     ok(GetCommState(hcom, &dcb), "GetCommState failed\n");
     dcb.BaudRate = FASTBAUD;
     dcb.ByteSize = 8;
@@ -758,10 +770,13 @@ static void test_ReadTimeOut(HANDLE hcom)
     timediff = after - before;
     ok( timediff > TIMEOUT>>2 && timediff < TIMEOUT *2,
 	"Unexpected TimeOut %d, expected %d\n", timediff, TIMEOUT);
+
+    CloseHandle(hcom);
 }
 
-static void test_waittxempty(HANDLE hcom)
+static void test_waittxempty(void)
 {
+    HANDLE hcom;
     DCB dcb;
     COMMTIMEOUTS timeouts;
     char tbuf[]="test_waittxempty";
@@ -769,7 +784,9 @@ static void test_waittxempty(HANDLE hcom)
     BOOL res_write, res;
     DWORD baud = SLOWBAUD;
 
-    trace("test_waittxempty\n");
+    hcom = test_OpenComm(FALSE);
+    if (hcom == INVALID_HANDLE_VALUE) return;
+
     /* set a low baud rate to have ample time*/
     ok(GetCommState(hcom, &dcb), "GetCommState failed\n");
     dcb.BaudRate = baud;
@@ -816,36 +833,50 @@ static void test_waittxempty(HANDLE hcom)
        nearly return immediate,
        while on wine the most time is spent here
     */
+
+    CloseHandle(hcom);
 }
 
 /* A new open handle should not return error or have bytes in the Queues */
-static void test_ClearCommErrors(HANDLE hcom)
+static void test_ClearCommError(void)
 {
-    DWORD   errors;
+    HANDLE hcom;
+    DWORD  errors;
     COMSTAT lpStat;
 
+    hcom = test_OpenComm(FALSE);
+    if (hcom == INVALID_HANDLE_VALUE) return;
+
     ok(ClearCommError(hcom, &errors, &lpStat), "ClearCommError failed\n");
     ok(lpStat.cbInQue == 0, "Unexpected %d chars in InQueue\n", lpStat.cbInQue);
     ok(lpStat.cbOutQue == 0, "Unexpected %d chars in OutQueue\n", lpStat.cbOutQue);
     ok(errors == 0, "ClearCommErrors: Unexpected error 0x%08x\n", errors);
     trace("test_ClearCommErrors done\n");
+
+    CloseHandle(hcom);
 }
 
-static void test_non_pending_errors(HANDLE hcom)
+static void test_non_pending_errors(void)
 {
+    HANDLE hcom;
     DCB dcb;
     DWORD err;
 
+    hcom = test_OpenComm(FALSE);
+    if (hcom == INVALID_HANDLE_VALUE) return;
+
     ok(GetCommState(hcom, &dcb), "GetCommState failed\n");
     dcb.ByteSize = 255; /* likely bogus */
     ok(!SetCommState(hcom, &dcb), "SetCommState should have failed\n");
     ok(ClearCommError(hcom, &err, NULL), "ClearCommError should succeed\n");
     ok(!(err & CE_MODE), "ClearCommError shouldn't set CE_MODE byte in this case (%x)\n", err);
+
+    CloseHandle(hcom);
 }
 
-/**/
-static void test_LoopbackRead(HANDLE hcom)
+static void test_LoopbackRead(void)
 {
+    HANDLE hcom;
     DCB dcb;
     COMMTIMEOUTS timeouts;
     char rbuf[32];
@@ -853,6 +884,11 @@ static void test_LoopbackRead(HANDLE hcom)
     BOOL res;
     char tbuf[]="test_LoopbackRead";
 
+    if (!loopback_txd_rxd) return;
+
+    hcom = test_OpenComm(FALSE);
+    if (hcom == INVALID_HANDLE_VALUE) return;
+
     trace("Starting test_LoopbackRead\n");
     ok(GetCommState(hcom, &dcb), "GetCommState failed\n");
     dcb.BaudRate = FASTBAUD;
@@ -940,18 +976,27 @@ static void test_LoopbackRead(HANDLE hcom)
     after =  GetTickCount();
     ok( read == sizeof(tbuf),"ReadFile read %d bytes\n", read);
     trace("Plain Read for %d char at %d baud took %d ms\n", read, SLOWBAUD, after-before);
+
+    CloseHandle(hcom);
 }
 
-static void test_LoopbackCtsRts(HANDLE hcom)
+static void test_LoopbackCtsRts(void)
 {
+    HANDLE hcom;
     DWORD ModemStat = 0, defaultStat = 0;
     DCB dcb;
 
+    if (!loopback_rts_cts) return;
+
+    hcom = test_OpenComm(FALSE);
+    if (hcom == INVALID_HANDLE_VALUE) return;
+
     memset (&dcb, 0, sizeof (dcb));
     ok(GetCommState(hcom, &dcb), "GetCommState failed\n");
     if (dcb.fRtsControl == RTS_CONTROL_HANDSHAKE)
     {
 	trace("RTS_CONTROL_HANDSHAKE is set, so don't manipulate RTS\n");
+        CloseHandle(hcom);
 	return;
     }
     ok(GetCommModemStatus(hcom, &defaultStat), "GetCommModemStatus failed\n");
@@ -980,17 +1025,26 @@ static void test_LoopbackCtsRts(HANDLE hcom)
 	ok (ModemStat ==  defaultStat, "Failed to restore CTS: 0x%04x, expected 0x%04x\n",
 	    ModemStat, defaultStat);
     }
+
+    CloseHandle(hcom);
 }
 
-static void test_LoopbackDtrDcd(HANDLE hcom)
+static void test_LoopbackDtrDcd(void)
 {
+    HANDLE hcom;
     DWORD ModemStat = 0, defaultStat = 0;
     DCB dcb;
 
+    if (!loopback_dtr_dcd) return;
+
+    hcom = test_OpenComm(FALSE);
+    if (hcom == INVALID_HANDLE_VALUE) return;
+
     ok(GetCommState(hcom, &dcb), "GetCommState failed\n");
     if (dcb.fDtrControl == DTR_CONTROL_HANDSHAKE)
     {
 	trace("DTR_CONTROL_HANDSHAKE is set, so don't manipulate DTR\n");
+        CloseHandle(hcom);
 	return;
     }
     ok(GetCommModemStatus(hcom, &defaultStat), "GetCommModemStatus failed\n");
@@ -1019,17 +1073,26 @@ static void test_LoopbackDtrDcd(HANDLE hcom)
 	ok (ModemStat ==  defaultStat, "Failed to restore RLSD: 0x%04x, expected 0x%04x\n",
 	    ModemStat, defaultStat);
     }
+
+    CloseHandle(hcom);
 }
 
-static void test_LoopbackDtrDsr(HANDLE hcom)
+static void test_LoopbackDtrDsr(void)
 {
+    HANDLE hcom;
     DWORD ModemStat = 0, defaultStat = 0;
     DCB dcb;
 
+    if (!loopback_dtr_dsr) return;
+
+    hcom = test_OpenComm(FALSE);
+    if (hcom == INVALID_HANDLE_VALUE) return;
+
     ok(GetCommState(hcom, &dcb), "GetCommState failed\n");
     if (dcb.fDtrControl == DTR_CONTROL_DISABLE)
     {
 	trace("DTR_CONTROL_HANDSHAKE is set, so don't manipulate DTR\n");
+        CloseHandle(hcom);
 	return;
     }
     ok(GetCommModemStatus(hcom, &defaultStat), "GetCommModemStatus failed\n");
@@ -1058,13 +1121,21 @@ static void test_LoopbackDtrDsr(HANDLE hcom)
 	ok (ModemStat ==  defaultStat, "Failed to restore DSR: 0x%04x, expected 0x%04x\n",
 	    ModemStat, defaultStat);
     }
+
+    CloseHandle(hcom);
 }
 
-static void test_LoopbackDtrRing(HANDLE hcom)
+static void test_LoopbackDtrRing(void)
 {
+    HANDLE hcom;
     DWORD ModemStat = 0, defaultStat = 0;
     DCB dcb;
 
+    if (!loopback_dtr_ring) return;
+
+    hcom = test_OpenComm(FALSE);
+    if (hcom == INVALID_HANDLE_VALUE) return;
+
     ok(GetCommState(hcom, &dcb), "GetCommState failed\n");
     if (dcb.fDtrControl == DTR_CONTROL_HANDSHAKE)
     {
@@ -1097,6 +1168,8 @@ static void test_LoopbackDtrRing(HANDLE hcom)
 	ok (ModemStat ==  defaultStat, "Failed to restore RING: 0x%04x, expected 0x%04x\n",
 	    ModemStat, defaultStat);
     }
+
+    CloseHandle(hcom);
 }
 
 /*
@@ -1106,13 +1179,18 @@ static void test_LoopbackDtrRing(HANDLE hcom)
  * Need Loopback TX->RX
 */
 
-static void  test_WaitRx(HANDLE hcom)
+static void test_WaitRx(void)
 {
     OVERLAPPED overlapped, overlapped_w;
-    HANDLE hComPortEvent, hComWriteEvent;
+    HANDLE hcom, hComPortEvent, hComWriteEvent;
     DWORD before, after, after1, diff, success_wait = FALSE, success_write;
     DWORD err_wait, err_write, written, evtmask=0;
 
+    if (!loopback_txd_rxd) return;
+
+    hcom = test_OpenComm(TRUE);
+    if (hcom == INVALID_HANDLE_VALUE) return;
+
     ok(SetCommMask(hcom, EV_RXCHAR), "SetCommMask failed\n");
     hComPortEvent =  CreateEvent( NULL, TRUE, FALSE, NULL );
     ok(hComPortEvent != 0, "CreateEvent failed\n");
@@ -1125,7 +1203,7 @@ static void  test_WaitRx(HANDLE hcom)
     overlapped_w.hEvent = hComWriteEvent;
 
     before = GetTickCount();
-    {success_wait = WaitCommEvent(hcom, &evtmask, &overlapped);}
+    success_wait = WaitCommEvent(hcom, &evtmask, &overlapped);
     err_wait = GetLastError();
     after = GetTickCount();
     trace("Success 0x%08x err %d evtmask 0x%08x\n", success_wait, err_wait, evtmask);
@@ -1170,6 +1248,7 @@ static void  test_WaitRx(HANDLE hcom)
     ok ((diff > (TIMEOUT>>1) -TIMEDELTA) && (diff < (TIMEOUT>>1) + TIMEDELTA),
 	"Unexpected time %d, expected around %d\n", diff, TIMEOUT>>1);
 
+    CloseHandle(hcom);
 }
 
 /* Change the controlling line after the given timeout to the given state
@@ -1199,15 +1278,19 @@ static DWORD CALLBACK toggle_ctlLine(LPVOID arg)
  * Wait for a change in CTS
  * Needs Loopback from DTR to CTS
  */
-static void  test_WaitCts(HANDLE hcom)
+static void test_WaitCts(void)
 {
     DCB dcb;
     OVERLAPPED overlapped;
-    HANDLE hComPortEvent;
-    HANDLE alarmThread;
+    HANDLE hcom, hComPortEvent, alarmThread;
     DWORD_PTR args[4];
     DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0, defaultStat = 0;
 
+    if (!loopback_rts_cts) return;
+
+    hcom = test_OpenComm(TRUE);
+    if (hcom == INVALID_HANDLE_VALUE) return;
+
     ok(GetCommState(hcom, &dcb), "GetCommState failed\n");
     dcb.fRtsControl=RTS_CONTROL_ENABLE;
     dcb.fDtrControl=DTR_CONTROL_ENABLE;
@@ -1215,6 +1298,7 @@ static void  test_WaitCts(HANDLE hcom)
     if (dcb.fDtrControl == RTS_CONTROL_DISABLE)
     {
 	trace("RTS_CONTROL_HANDSHAKE is set, so don't manipulate DTR\n");
+        CloseHandle(hcom);
 	return;
     }
     args[0]= TIMEOUT >>1;
@@ -1273,6 +1357,8 @@ static void  test_WaitCts(HANDLE hcom)
 	args[1] = SETRTS;
     else
 	args[1] = CLRRTS;
+
+    CloseHandle(hcom);
 }
 
 /* Change the  Comm Mask while a Wait is going on
@@ -1296,19 +1382,22 @@ static DWORD CALLBACK reset_CommMask(LPVOID arg)
    reset the CommMask and expect the wait to return with a mask of 0
    No special port connections needed
 */
-static void  test_AbortWaitCts(HANDLE hcom)
+static void test_AbortWaitCts(void)
 {
     DCB dcb;
     OVERLAPPED overlapped;
-    HANDLE hComPortEvent;
-    HANDLE alarmThread;
+    HANDLE hcom, hComPortEvent, alarmThread;
     DWORD_PTR args[2];
     DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0;
 
+    hcom = test_OpenComm(TRUE);
+    if (hcom == INVALID_HANDLE_VALUE) return;
+
     ok(GetCommState(hcom, &dcb), "GetCommState failed\n");
     if (dcb.fDtrControl == RTS_CONTROL_DISABLE)
     {
 	trace("RTS_CONTROL_HANDSHAKE is set, so don't manipulate DTR\n");
+        CloseHandle(hcom);
 	return;
     }
     args[0]= TIMEOUT >>1;
@@ -1351,25 +1440,31 @@ static void  test_AbortWaitCts(HANDLE hcom)
     ok ((diff > (TIMEOUT>>1) -TIMEDELTA) && (diff < (TIMEOUT>>1) + TIMEDELTA),
                   "Unexpected time %d, expected around %d\n", diff, TIMEOUT>>1);
 
+    CloseHandle(hcom);
 }
 
 /*
  * Wait for a change in DSR
  * Needs Loopback from DTR to DSR
  */
-static void  test_WaitDsr(HANDLE hcom)
+static void test_WaitDsr(void)
 {
     DCB dcb;
     OVERLAPPED overlapped;
-    HANDLE hComPortEvent;
-    HANDLE alarmThread;
+    HANDLE hcom, hComPortEvent, alarmThread;
     DWORD_PTR args[3];
     DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0, defaultStat = 0;
 
+    if (!loopback_dtr_dsr) return;
+
+    hcom = test_OpenComm(TRUE);
+    if (hcom == INVALID_HANDLE_VALUE) return;
+
     ok(GetCommState(hcom, &dcb), "GetCommState failed\n");
     if (dcb.fDtrControl == DTR_CONTROL_DISABLE)
     {
 	trace("DTR_CONTROL_HANDSHAKE is set, so don't manipulate DTR\n");
+        CloseHandle(hcom);
 	return;
     }
     args[0]= TIMEOUT >>1;
@@ -1424,26 +1519,33 @@ static void  test_WaitDsr(HANDLE hcom)
 	args[1] = SETDTR;
     else
 	args[1] = CLRDTR;
+
+    CloseHandle(hcom);
 }
 
 /*
  * Wait for a Ring
  * Needs Loopback from DTR to RING
  */
-static void  test_WaitRing(HANDLE hcom)
+static void test_WaitRing(void)
 {
     DCB dcb;
     OVERLAPPED overlapped;
-    HANDLE hComPortEvent;
-    HANDLE alarmThread;
+    HANDLE hcom, hComPortEvent, alarmThread;
     DWORD_PTR args[3];
     DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0, defaultStat;
     BOOL ret;
 
+    if (!loopback_dtr_ring) return;
+
+    hcom = test_OpenComm(TRUE);
+    if (hcom == INVALID_HANDLE_VALUE) return;
+
     ok(GetCommState(hcom, &dcb), "GetCommState failed\n");
     if (dcb.fDtrControl == DTR_CONTROL_DISABLE)
     {
 	trace("DTR_CONTROL_HANDSHAKE is set, so don't manipulate DTR\n");
+        CloseHandle(hcom);
 	return;
     }
     args[0]= TIMEOUT >>1;
@@ -1486,7 +1588,7 @@ static void  test_WaitRing(HANDLE hcom)
 	  success, err, evtmask, after-before, after1-before);
 
     ok(evtmask & EV_RING, "Failed to detect  EV_RING: 0x%08x, expected 0x%08x\n",
-       evtmask, EV_RING);
+       evtmask, EV_CTS);
     ok(GetCommModemStatus(hcom, &evtmask), "GetCommModemStatus failed\n");
     if(defaultStat & MS_RING_ON)
 	ok((evtmask & MS_RING_ON) == 0,"DTR didn't change state!\n");
@@ -1502,24 +1604,31 @@ static void  test_WaitRing(HANDLE hcom)
 	args[1] = SETDTR;
     else
 	args[1] = CLRDTR;
+
+    CloseHandle(hcom);
 }
 /*
  * Wait for a change in DCD
  * Needs Loopback from DTR to DCD
  */
-static void  test_WaitDcd(HANDLE hcom)
+static void test_WaitDcd(void)
 {
     DCB dcb;
     OVERLAPPED overlapped;
-    HANDLE hComPortEvent;
-    HANDLE alarmThread;
+    HANDLE hcom, hComPortEvent, alarmThread;
     DWORD_PTR args[3];
     DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0, defaultStat = 0;
 
+    if (!loopback_dtr_dcd) return;
+
+    hcom = test_OpenComm(TRUE);
+    if (hcom == INVALID_HANDLE_VALUE) return;
+
     ok(GetCommState(hcom, &dcb), "GetCommState failed\n");
     if (dcb.fDtrControl == DTR_CONTROL_DISABLE)
     {
 	trace("DTR_CONTROL_HANDSHAKE is set, so don't manipulate DTR\n");
+        CloseHandle(hcom);
 	return;
     }
     args[0]= TIMEOUT >>1;
@@ -1574,6 +1683,8 @@ static void  test_WaitDcd(HANDLE hcom)
 	args[1] = SETDTR;
     else
 	args[1] = CLRDTR;
+
+    CloseHandle(hcom);
 }
 
 /* 
@@ -1597,14 +1708,18 @@ static DWORD CALLBACK set_CommBreak(LPVOID arg)
    Wait for the Break condition (TX resp. RX active)
    Needs Loopback TX-RX
 */
-static void  test_WaitBreak(HANDLE hcom)
+static void test_WaitBreak(void)
 {
     OVERLAPPED overlapped;
-    HANDLE hComPortEvent;
-    HANDLE alarmThread;
+    HANDLE hcom, hComPortEvent, alarmThread;
     DWORD_PTR args[2];
     DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0;
 
+    if (!loopback_txd_rxd) return;
+
+    hcom = test_OpenComm(TRUE);
+    if (hcom == INVALID_HANDLE_VALUE) return;
+
     ok(SetCommMask(hcom, EV_BREAK), "SetCommMask failed\n");
     hComPortEvent =  CreateEvent( NULL, TRUE, FALSE, NULL );
     ok(hComPortEvent != 0, "CreateEvent failed\n");
@@ -1649,6 +1764,8 @@ static void  test_WaitBreak(HANDLE hcom)
 	"Unexpected time %d, expected around %d\n", diff, TIMEOUT>>1);
 
     ok(ClearCommBreak(hcom), "ClearCommBreak failed\n");
+
+    CloseHandle(hcom);
 }
 
 static void test_stdio(void)
@@ -1663,89 +1780,22 @@ static void test_stdio(void)
 
 START_TEST(comm)
 {
-    HANDLE hcom;
-    /* use variables and not #define to compile the code */
-    BOOL loopback_txd_rxd  = LOOPBACK_TXD_RXD;
-    BOOL loopback_rts_cts  = LOOPBACK_CTS_RTS;
-    BOOL loopback_dtr_dsr  = LOOPBACK_DTR_DSR;
-    BOOL loopback_dtr_ring = LOOPBACK_DTR_RING;
-    BOOL loopback_dtr_dcd  = LOOPBACK_DTR_DCD;
-
+    test_ClearCommError(); /* keep it the very first test */
     test_BuildCommDCB();
-    hcom = test_OpenComm(FALSE);
-    if (hcom != INVALID_HANDLE_VALUE)
-    {
-	test_ClearCommErrors(hcom); /* keep it the very first test */
-	test_GetModemStatus(hcom);
-	test_ReadTimeOut(hcom);
-	test_waittxempty(hcom);
-	CloseHandle(hcom);
-    }
-    hcom = test_OpenComm(FALSE);
-    if (hcom != INVALID_HANDLE_VALUE)
-    {
-        test_non_pending_errors(hcom);
-	CloseHandle(hcom);
-    }
-    if((loopback_txd_rxd) && ((hcom = test_OpenComm(FALSE))!=INVALID_HANDLE_VALUE))
-    {
-	test_LoopbackRead(hcom);
-	CloseHandle(hcom);
-    }
-    if((loopback_rts_cts) && ((hcom = test_OpenComm(FALSE))!=INVALID_HANDLE_VALUE))
-    {
-	test_LoopbackCtsRts(hcom);
-	CloseHandle(hcom);
-    }
-    if((loopback_dtr_dsr) && ((hcom = test_OpenComm(FALSE))!=INVALID_HANDLE_VALUE))
-    {
-	test_LoopbackDtrDsr(hcom);
-	CloseHandle(hcom);
-    }
-    if((loopback_dtr_ring) && ((hcom = test_OpenComm(FALSE))!=INVALID_HANDLE_VALUE))
-    {
-	test_LoopbackDtrRing(hcom);
-	CloseHandle(hcom);
-    }
-    if((loopback_dtr_dcd) && ((hcom = test_OpenComm(FALSE))!=INVALID_HANDLE_VALUE))
-    {
-	test_LoopbackDtrDcd(hcom);
-	CloseHandle(hcom);
-    }
-    if((loopback_txd_rxd) && ((hcom = test_OpenComm(TRUE))!=INVALID_HANDLE_VALUE))
-    {
-        test_WaitRx(hcom);
-        CloseHandle(hcom);
-    }
-    if((loopback_rts_cts) && ((hcom = test_OpenComm(TRUE))!=INVALID_HANDLE_VALUE))
-    {
-	test_WaitCts(hcom);
-	CloseHandle(hcom);
-    }
-    if((hcom = test_OpenComm(TRUE))!=INVALID_HANDLE_VALUE)
-    {
-	test_AbortWaitCts(hcom);
-	CloseHandle(hcom);
-    }
-    if((loopback_dtr_dsr) && ((hcom = test_OpenComm(TRUE))!=INVALID_HANDLE_VALUE))
-    {
-	test_WaitDsr(hcom);
-	CloseHandle(hcom);
-    }
-    if((loopback_dtr_ring) && ((hcom = test_OpenComm(TRUE))!=INVALID_HANDLE_VALUE))
-    {
-	test_WaitRing(hcom);
-	CloseHandle(hcom);
-    }
-    if((loopback_dtr_dcd) && ((hcom = test_OpenComm(TRUE))!=INVALID_HANDLE_VALUE))
-    {
-	test_WaitDcd(hcom);
-	CloseHandle(hcom);
-    }
-    if(loopback_txd_rxd && (hcom = test_OpenComm(TRUE))!=INVALID_HANDLE_VALUE)
-    {
-	test_WaitBreak(hcom);
-	CloseHandle(hcom);
-    }
+    test_ReadTimeOut();
+    test_waittxempty();
+    test_non_pending_errors();
+    test_LoopbackRead();
+    test_LoopbackCtsRts();
+    test_LoopbackDtrDsr();
+    test_LoopbackDtrRing();
+    test_LoopbackDtrDcd();
+    test_WaitRx();
+    test_WaitCts();
+    test_AbortWaitCts();
+    test_WaitDsr();
+    test_WaitRing();
+    test_WaitDcd();
+    test_WaitBreak();
     test_stdio();
 }
-- 
1.8.3.4




More information about the wine-patches mailing list