From 54a07b350895b4fdd4143ac2ce9d2d99d86bba42 Mon Sep 17 00:00:00 2001 From: Denis Shienkov Date: Sat, 27 Sep 2014 23:22:04 +0400 Subject: Fix order of passed parameters into QCOMPARE According to documentation the QCOMPARE should accept to the first parameter an actual value, and to the second parameter an expected value. Change-Id: I64e762e779fa6a61401f358c4dd6097dacf7a33a Reviewed-by: Sergey Belyashov --- tests/auto/qserialport/tst_qserialport.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'tests') diff --git a/tests/auto/qserialport/tst_qserialport.cpp b/tests/auto/qserialport/tst_qserialport.cpp index af767dd..9feccd4 100644 --- a/tests/auto/qserialport/tst_qserialport.cpp +++ b/tests/auto/qserialport/tst_qserialport.cpp @@ -470,27 +470,27 @@ void tst_QSerialPort::twoStageSynchronousLoopback() senderPort.waitForBytesWritten(waitMsecs); QTest::qSleep(waitMsecs); receiverPort.waitForReadyRead(waitMsecs); - QCOMPARE(qint64(newlineArray.size()), receiverPort.bytesAvailable()); + QCOMPARE(receiverPort.bytesAvailable(), qint64(newlineArray.size())); receiverPort.write(receiverPort.readAll()); receiverPort.waitForBytesWritten(waitMsecs); QTest::qSleep(waitMsecs); senderPort.waitForReadyRead(waitMsecs); - QCOMPARE(qint64(newlineArray.size()), receiverPort.bytesAvailable()); - QCOMPARE(newlineArray, senderPort.readAll()); + QCOMPARE(receiverPort.bytesAvailable(), qint64(newlineArray.size())); + QCOMPARE(senderPort.readAll(), newlineArray); // second stage senderPort.write(newlineArray); senderPort.waitForBytesWritten(waitMsecs); QTest::qSleep(waitMsecs); receiverPort.waitForReadyRead(waitMsecs); - QCOMPARE(qint64(newlineArray.size()), receiverPort.bytesAvailable()); + QCOMPARE(receiverPort.bytesAvailable(), qint64(newlineArray.size())); receiverPort.write(receiverPort.readAll()); receiverPort.waitForBytesWritten(waitMsecs); QTest::qSleep(waitMsecs); senderPort.waitForReadyRead(waitMsecs); - QCOMPARE(qint64(newlineArray.size()), receiverPort.bytesAvailable()); - QCOMPARE(newlineArray, senderPort.readAll()); + QCOMPARE(receiverPort.bytesAvailable(), qint64(newlineArray.size())); + QCOMPARE(senderPort.readAll(), newlineArray); } void tst_QSerialPort::synchronousReadWrite() @@ -516,7 +516,7 @@ void tst_QSerialPort::synchronousReadWrite() while ((readData.size() < writeData.size()) && receiverPort.waitForReadyRead(100)) readData.append(receiverPort.readAll()); - QCOMPARE(writeData, readData); + QCOMPARE(readData, writeData); } class AsyncReader : public QObject -- cgit v1.2.1 From 3a967ff35979196c8c97a066b5aa68c1b5d13494 Mon Sep 17 00:00:00 2001 From: Denis Shienkov Date: Sun, 28 Sep 2014 00:00:22 +0400 Subject: Fix typo in twoStageSynchronousLoopback test Commit f1761c1236edce428278f7a9e8aa1091097eaa57 introduce a typo for receiverPort and senderPort variables, that lead to failure of test. Change-Id: I18ecad78bb11d7bb218a674c3c3bf9c863a2b33c Reviewed-by: Samuel Gaist Reviewed-by: Sergey Belyashov --- tests/auto/qserialport/tst_qserialport.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'tests') diff --git a/tests/auto/qserialport/tst_qserialport.cpp b/tests/auto/qserialport/tst_qserialport.cpp index 9feccd4..2b8de92 100644 --- a/tests/auto/qserialport/tst_qserialport.cpp +++ b/tests/auto/qserialport/tst_qserialport.cpp @@ -476,7 +476,7 @@ void tst_QSerialPort::twoStageSynchronousLoopback() receiverPort.waitForBytesWritten(waitMsecs); QTest::qSleep(waitMsecs); senderPort.waitForReadyRead(waitMsecs); - QCOMPARE(receiverPort.bytesAvailable(), qint64(newlineArray.size())); + QCOMPARE(senderPort.bytesAvailable(), qint64(newlineArray.size())); QCOMPARE(senderPort.readAll(), newlineArray); // second stage @@ -489,7 +489,7 @@ void tst_QSerialPort::twoStageSynchronousLoopback() receiverPort.waitForBytesWritten(waitMsecs); QTest::qSleep(waitMsecs); senderPort.waitForReadyRead(waitMsecs); - QCOMPARE(receiverPort.bytesAvailable(), qint64(newlineArray.size())); + QCOMPARE(senderPort.bytesAvailable(), qint64(newlineArray.size())); QCOMPARE(senderPort.readAll(), newlineArray); } -- cgit v1.2.1 From ac0422e8c9e74f2275129e3c7c69ef64299f07a9 Mon Sep 17 00:00:00 2001 From: Denis Shienkov Date: Mon, 29 Sep 2014 18:44:36 +0400 Subject: Fix reading on Windows at limited read buffer size In case the read buffer has a limited size then are impossible to read remainder which is still can be in driver's queue, since no readyRead signal emmitted and reading are stalled. Problem is that Windows does not fire the EV_RXCHAR event in case a driver's queue has ready to read remainder; this event will be triggered only when a new data are received. The solution is to start of asynchronous read operation for reading of possible remainder from the queue after doing QSP::read() from the user. Besides is necessary to meet conditions: - do not start reading in case a reading already is started - do not start reading in case is not in limited buffer size - do not start reading in case is a previous reading returns a less data than read buffer size or are not in the hardware flow control mode Tested on Windows 8 with virtual com0com serial ports using Qt5 and then Qt4. Task-number: QTBUG-41295 Change-Id: I01797e6f8d6006751244144fead3616b1de1b811 Reviewed-by: Robert Kurjata Reviewed-by: Sergey Belyashov --- tests/auto/qserialport/tst_qserialport.cpp | 35 ++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'tests') diff --git a/tests/auto/qserialport/tst_qserialport.cpp b/tests/auto/qserialport/tst_qserialport.cpp index 2b8de92..0fdde48 100644 --- a/tests/auto/qserialport/tst_qserialport.cpp +++ b/tests/auto/qserialport/tst_qserialport.cpp @@ -115,6 +115,10 @@ private slots: void asynchronousWriteByTimer_data(); void asynchronousWriteByTimer(); +#ifdef Q_OS_WIN + void readBufferOverflow(); +#endif + protected slots: void handleBytesWrittenAndExitLoopSlot(qint64 bytesWritten); void handleBytesWrittenAndExitLoopSlot2(qint64 bytesWritten); @@ -667,5 +671,36 @@ void tst_QSerialPort::asynchronousWriteByTimer() QCOMPARE(receiverPort.readAll(), alphabetArray); } +#ifdef Q_OS_WIN +void tst_QSerialPort::readBufferOverflow() +{ + clearReceiver(); + + QSerialPort senderPort(m_senderPortName); + QVERIFY(senderPort.open(QSerialPort::WriteOnly)); + + QSerialPort receiverPort(m_receiverPortName); + QVERIFY(receiverPort.open(QSerialPort::ReadOnly)); + + const int readBufferSize = alphabetArray.size() / 2; + receiverPort.setReadBufferSize(readBufferSize); + QCOMPARE(receiverPort.readBufferSize(), qint64(readBufferSize)); + + QCOMPARE(senderPort.write(alphabetArray), qint64(alphabetArray.size())); + QVERIFY2(senderPort.waitForBytesWritten(100), "Waiting for bytes written failed"); + + QByteArray readData; + while (receiverPort.waitForReadyRead(100)) { + QVERIFY(receiverPort.bytesAvailable() > 0); + readData += receiverPort.readAll(); + } + + QCOMPARE(readData, alphabetArray); + + // No more bytes available + QVERIFY(receiverPort.bytesAvailable() == 0); +} +#endif + QTEST_MAIN(tst_QSerialPort) #include "tst_qserialport.moc" -- cgit v1.2.1 From 9c88ad89801596e1d94acc4f32ff55c34118a66f Mon Sep 17 00:00:00 2001 From: Denis Shienkov Date: Fri, 3 Oct 2014 13:21:17 +0400 Subject: Restart of async reading when a QSP::clear() is called The method QSP::clear() can stall reading in case of following situations: - at the moment when PurgeComm abort of previously started asynchronous reading operation - when a serial port is in hardware flow control mode - when a serial port has a limited read buffer size Therefore is necessary restart of asynchronous reading to enable of the read sequence. Change-Id: I7a722a1ee20ecba0dd631da96ca81d2937d7ca6b Reviewed-by: Robert Kurjata Reviewed-by: Sergey Belyashov --- tests/auto/qserialport/tst_qserialport.cpp | 42 ++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'tests') diff --git a/tests/auto/qserialport/tst_qserialport.cpp b/tests/auto/qserialport/tst_qserialport.cpp index 0fdde48..a7dc5f3 100644 --- a/tests/auto/qserialport/tst_qserialport.cpp +++ b/tests/auto/qserialport/tst_qserialport.cpp @@ -117,6 +117,7 @@ private slots: #ifdef Q_OS_WIN void readBufferOverflow(); + void readAfterInputClear(); #endif protected slots: @@ -700,6 +701,47 @@ void tst_QSerialPort::readBufferOverflow() // No more bytes available QVERIFY(receiverPort.bytesAvailable() == 0); } + +void tst_QSerialPort::readAfterInputClear() +{ + clearReceiver(); + + QSerialPort senderPort(m_senderPortName); + QVERIFY(senderPort.open(QSerialPort::WriteOnly)); + + QSerialPort receiverPort(m_receiverPortName); + QVERIFY(receiverPort.open(QSerialPort::ReadOnly)); + + const int readBufferSize = alphabetArray.size() / 2; + receiverPort.setReadBufferSize(readBufferSize); + QCOMPARE(receiverPort.readBufferSize(), qint64(readBufferSize)); + + const int waitMsecs = 100; + + // First write more than read buffer size + QCOMPARE(senderPort.write(alphabetArray), qint64(alphabetArray.size())); + QVERIFY2(senderPort.waitForBytesWritten(waitMsecs), "Waiting for bytes written failed"); + + // Wait for first part of data into read buffer + while (receiverPort.waitForReadyRead(waitMsecs)); + QCOMPARE(receiverPort.bytesAvailable(), qint64(readBufferSize)); + // Wait for second part of data into driver's FIFO + QTest::qSleep(waitMsecs); + + QVERIFY(receiverPort.clear(QSerialPort::Input)); + QCOMPARE(receiverPort.bytesAvailable(), qint64(0)); + + // Second write less than read buffer size + QCOMPARE(senderPort.write(newlineArray), qint64(newlineArray.size())); + QVERIFY2(senderPort.waitForBytesWritten(waitMsecs), "Waiting for bytes written failed"); + + while (receiverPort.waitForReadyRead(waitMsecs)); + QCOMPARE(receiverPort.bytesAvailable(), qint64(newlineArray.size())); + QCOMPARE(receiverPort.readAll(), newlineArray); + + // No more bytes available + QVERIFY(receiverPort.bytesAvailable() == 0); +} #endif QTEST_MAIN(tst_QSerialPort) -- cgit v1.2.1