summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Shienkov <denis.shienkov@gmail.com>2014-07-11 16:32:28 +0400
committerDenis Shienkov <denis.shienkov@gmail.com>2014-07-26 11:26:43 +0200
commit76f293bfb0fd7bab391f96ac822eacc40e4c5176 (patch)
tree67d8cb9352cb4535ee72494b74ce9692125e4bdc
parent7328fe502a08ff26d70ee5d137e554a77a118f9b (diff)
downloadqtserialport-76f293bfb0fd7bab391f96ac822eacc40e4c5176.tar.gz
Add the synchronous loopback data verification test
Good reason to check of data correctness at transferring and receiving. In this test are used two serial ports, connected in a null-modem mode: http://en.wikipedia.org/wiki/Null_modem . The sender port transfers data to the receiver port. After data are received is carried out check of equivalence of the transferred and received data. Before run of testing it is necessary to set two variable environments QTEST_SERIALPORT_SENDER and QTEST_SERIALPORT_RECEIVER to specify names of used serial ports. This test can reveal errors related with the internal data processing and also errors of synchronous I/O inside of QSerialPort. This test is placed in separate "benchmarks" category not to mix-up with "manual" and "auto" categories, because this test is closer to "benchmarks" by own functionality. Tested on Windows 7/8 with the virtual com0com serial ports, using Qt4 and then Qt5. Change-Id: Ie6f87b50784bce211cf68c16cf75f79d12a8564f Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com> Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
-rw-r--r--tests/benchmarks/benchmarks.pro2
-rw-r--r--tests/benchmarks/qserialport/qserialport.pro11
-rw-r--r--tests/benchmarks/qserialport/tst_qserialport.cpp144
-rw-r--r--tests/tests.pro2
4 files changed, 158 insertions, 1 deletions
diff --git a/tests/benchmarks/benchmarks.pro b/tests/benchmarks/benchmarks.pro
new file mode 100644
index 0000000..8878128
--- /dev/null
+++ b/tests/benchmarks/benchmarks.pro
@@ -0,0 +1,2 @@
+TEMPLATE = subdirs
+SUBDIRS = qserialport
diff --git a/tests/benchmarks/qserialport/qserialport.pro b/tests/benchmarks/qserialport/qserialport.pro
new file mode 100644
index 0000000..c16cd5e
--- /dev/null
+++ b/tests/benchmarks/qserialport/qserialport.pro
@@ -0,0 +1,11 @@
+QT = core testlib
+TARGET = tst_qserialport
+#CONFIG += testcase
+
+greaterThan(QT_MAJOR_VERSION, 4) {
+ QT += serialport
+} else {
+ include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf)
+}
+
+SOURCES = tst_qserialport.cpp
diff --git a/tests/benchmarks/qserialport/tst_qserialport.cpp b/tests/benchmarks/qserialport/tst_qserialport.cpp
new file mode 100644
index 0000000..0ff2050
--- /dev/null
+++ b/tests/benchmarks/qserialport/tst_qserialport.cpp
@@ -0,0 +1,144 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Denis Shienkov <denis.shienkov@gmail.com>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSerialPort module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QtSerialPort/QSerialPort>
+
+class tst_QSerialPort : public QObject
+{
+ Q_OBJECT
+public:
+ explicit tst_QSerialPort();
+
+ static void enterLoopMsecs(int msecs)
+ {
+ ++loopLevel;
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
+ QTestEventLoop::instance().enterLoopMSecs(msecs);
+#else
+ Q_UNUSED(msecs);
+ QTestEventLoop::instance().enterLoop(1);
+#endif
+ --loopLevel;
+ }
+
+private slots:
+ void initTestCase();
+
+ void synchronousLoopbackDataVerificationTest();
+
+private:
+#ifdef Q_OS_WIN
+ void clearReceiver();
+#endif
+
+ QString m_senderPortName;
+ QString m_receiverPortName;
+
+ static int loopLevel;
+};
+
+int tst_QSerialPort::loopLevel = 0;
+
+tst_QSerialPort::tst_QSerialPort()
+{
+}
+
+#ifdef Q_OS_WIN
+// This method is a workaround for the "com0com" virtual serial port
+// driver, which is installed on CI. The problem is that the close/clear
+// methods have no effect on sender serial port. If any data didn't manage
+// to be transferred before closing, then this data will continue to be
+// transferred at next opening of sender port.
+// Thus, this behavior influences other tests and leads to the wrong results
+// (e.g. the receiver port on other test can receive some data which are
+// not expected). It is recommended to use this method for cleaning of
+// read FIFO of receiver for those tests in which reception of data is
+// required.
+void tst_QSerialPort::clearReceiver()
+{
+ QSerialPort receiver(m_receiverPortName);
+ if (receiver.open(QIODevice::ReadOnly))
+ enterLoopMsecs(100);
+}
+#endif
+
+void tst_QSerialPort::initTestCase()
+{
+ m_senderPortName = QString::fromLocal8Bit(qgetenv("QTEST_SERIALPORT_SENDER"));
+ m_receiverPortName = QString::fromLocal8Bit(qgetenv("QTEST_SERIALPORT_RECEIVER"));
+ if (m_senderPortName.isEmpty() || m_receiverPortName.isEmpty()) {
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
+ QSKIP("Test doesn't work because the names of serial ports aren't found in env.");
+#else
+ QSKIP("Test doesn't work because the names of serial ports aren't set found env.", SkipAll);
+#endif
+ }
+}
+
+void tst_QSerialPort::synchronousLoopbackDataVerificationTest()
+{
+#ifdef Q_OS_WIN
+ clearReceiver();
+#endif
+
+ QSerialPort senderPort(m_senderPortName);
+ QVERIFY(senderPort.open(QSerialPort::WriteOnly));
+
+ QSerialPort receiverPort(m_receiverPortName);
+ QVERIFY(receiverPort.open(QSerialPort::ReadOnly));
+
+ QByteArray writeData;
+ for (int i = 0; i < 1024; ++i)
+ writeData.append(static_cast<char>(i));
+
+ senderPort.write(writeData);
+ senderPort.waitForBytesWritten(-1);
+
+ QByteArray readData;
+ while ((readData.size() < writeData.size()) && receiverPort.waitForReadyRead(100))
+ readData.append(receiverPort.readAll());
+
+ QCOMPARE(writeData, readData);
+}
+
+QTEST_MAIN(tst_QSerialPort)
+#include "tst_qserialport.moc"
diff --git a/tests/tests.pro b/tests/tests.pro
index dcc8531..dc3e10c 100644
--- a/tests/tests.pro
+++ b/tests/tests.pro
@@ -1,2 +1,2 @@
TEMPLATE = subdirs
-SUBDIRS += auto manual
+SUBDIRS += auto manual benchmarks