summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorKarsten Heimrich <karsten.heimrich@theqtcompany.com>2016-03-08 15:15:23 +0100
committerKarsten Heimrich <karsten.heimrich@theqtcompany.com>2016-03-09 09:08:23 +0000
commitd0c415d0ac9d59caf309452d2bfd7d3927fb8bba (patch)
tree1a8411c8481abd7fd25aa0d76c80be3f60a06e65 /tests
parente34bad9e5c44f0909019d06aa496ef91df3114b2 (diff)
Implement Modbus device identification processing.
Several TODO's left, because the specification is just not clear or contains broken examples. Change-Id: I16765cc5f44b0cb3d7ecebd568d98ea3564d05b0 Reviewed-by: Alex Blasche <alexander.blasche@theqtcompany.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/auto.pro3
-rw-r--r--tests/auto/qmodbusdeviceidentification/qmodbusdeviceidentification.pro7
-rw-r--r--tests/auto/qmodbusdeviceidentification/tst_qmodbusdeviceidentification.cpp172
-rw-r--r--tests/auto/qmodbusserver/tst_qmodbusserver.cpp46
4 files changed, 227 insertions, 1 deletions
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro
index 7f11ff3..838eb53 100644
--- a/tests/auto/auto.pro
+++ b/tests/auto/auto.pro
@@ -10,7 +10,8 @@ SUBDIRS += cmake \
qmodbusclient \
qmodbusserver \
qmodbuscommevent \
- qmodbusadu
+ qmodbusadu \
+ qmodbusdeviceidentification
qcanbus.depends += plugins
qcanbusdevice.depends += plugins
diff --git a/tests/auto/qmodbusdeviceidentification/qmodbusdeviceidentification.pro b/tests/auto/qmodbusdeviceidentification/qmodbusdeviceidentification.pro
new file mode 100644
index 0000000..721b521
--- /dev/null
+++ b/tests/auto/qmodbusdeviceidentification/qmodbusdeviceidentification.pro
@@ -0,0 +1,7 @@
+QT = core testlib serialbus
+TARGET = tst_qmodbusdeviceidentification
+CONFIG += testcase c++11
+
+CONFIG -= app_bundle
+
+SOURCES += tst_qmodbusdeviceidentification.cpp
diff --git a/tests/auto/qmodbusdeviceidentification/tst_qmodbusdeviceidentification.cpp b/tests/auto/qmodbusdeviceidentification/tst_qmodbusdeviceidentification.cpp
new file mode 100644
index 0000000..582b46d
--- /dev/null
+++ b/tests/auto/qmodbusdeviceidentification/tst_qmodbusdeviceidentification.cpp
@@ -0,0 +1,172 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the QtSerialBus module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** 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 The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/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 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later 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 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtSerialBus/qmodbusdeviceidentification.h>
+#include <QtSerialBus/qmodbuspdu.h>
+
+#include <QtTest/QtTest>
+
+class tst_QModbusDeviceIdentification : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void testConstructor()
+ {
+ QModbusDeviceIdentification qmdi;
+ QCOMPARE(qmdi.isValid(), false);
+ QCOMPARE(qmdi.objectIds().isEmpty(), true);
+ for (int i = QModbusDeviceIdentification::VendorNameObjectId;
+ i < QModbusDeviceIdentification::UndefinedObjectId; ++i) {
+ QCOMPARE(qmdi.contains(i), false);
+ qmdi.remove(i); // force crash if the behavior changes
+ QCOMPARE(qmdi.value(i), QByteArray());
+ }
+ QCOMPARE(qmdi.conformityLevel(), QModbusDeviceIdentification::BasicConformityLevel);
+ }
+
+ void testIsValid()
+ {
+ QModbusDeviceIdentification qmdi;
+ QCOMPARE(qmdi.isValid(), false);
+ QCOMPARE(qmdi.insert(QModbusDeviceIdentification::ReservedObjectId, "Reserved"), true);
+ QCOMPARE(qmdi.isValid(), false);
+ QCOMPARE(qmdi.insert(QModbusDeviceIdentification::VendorNameObjectId,
+ "Company identification"), true);
+ QCOMPARE(qmdi.isValid(), false);
+ QCOMPARE(qmdi.insert(QModbusDeviceIdentification::ProductCodeObjectId, "Product code"),
+ true);
+ QCOMPARE(qmdi.isValid(), false);
+ QCOMPARE(qmdi.insert(QModbusDeviceIdentification::MajorMinorRevisionObjectId, "V2.11"),
+ true);
+ QCOMPARE(qmdi.isValid(), true);
+ QCOMPARE(qmdi.insert(QModbusDeviceIdentification::MajorMinorRevisionObjectId, ""), true);
+ QCOMPARE(qmdi.isValid(), false);
+ QCOMPARE(qmdi.insert(QModbusDeviceIdentification::MajorMinorRevisionObjectId, "V2.11"),
+ true);
+ QCOMPARE(qmdi.isValid(), true);
+ }
+
+ void testRemoveAndContains()
+ {
+ QModbusDeviceIdentification qmdi;
+ QCOMPARE(qmdi.contains(QModbusDeviceIdentification::ReservedObjectId), false);
+ QCOMPARE(qmdi.insert(QModbusDeviceIdentification::ReservedObjectId, "Reserved"), true);
+ QCOMPARE(qmdi.contains(QModbusDeviceIdentification::ReservedObjectId), true);
+ qmdi.remove(QModbusDeviceIdentification::ReservedObjectId);
+ QCOMPARE(qmdi.contains(QModbusDeviceIdentification::ReservedObjectId), false);
+ }
+
+ void testInsertAndValue()
+ {
+ QModbusDeviceIdentification qmdi;
+ QCOMPARE(qmdi.insert(QModbusDeviceIdentification::ProductDependentObjectId, "Test"), true);
+ QCOMPARE(qmdi.value(QModbusDeviceIdentification::ProductDependentObjectId),
+ QByteArray("Test"));
+ QCOMPARE(qmdi.insert(QModbusDeviceIdentification::ProductDependentObjectId,
+ QByteArray(246, '@')), false);
+ QCOMPARE(qmdi.value(QModbusDeviceIdentification::ProductDependentObjectId),
+ QByteArray("Test"));
+ QCOMPARE(qmdi.insert(QModbusDeviceIdentification::ProductDependentObjectId,
+ QByteArray(245, '@')), true);
+ QCOMPARE(qmdi.value(QModbusDeviceIdentification::ProductDependentObjectId),
+ QByteArray(245, '@'));
+ QCOMPARE(qmdi.insert(QModbusDeviceIdentification::UndefinedObjectId, "Test"), false);
+ QCOMPARE(qmdi.value(QModbusDeviceIdentification::UndefinedObjectId), QByteArray());
+ }
+
+ void testConformityLevel()
+ {
+ QModbusDeviceIdentification qmdi;
+ QCOMPARE(qmdi.conformityLevel(), QModbusDeviceIdentification::BasicConformityLevel);
+ qmdi.setConformityLevel(QModbusDeviceIdentification::BasicIndividualConformityLevel);
+ QCOMPARE(qmdi.conformityLevel(), QModbusDeviceIdentification::BasicIndividualConformityLevel);
+ }
+
+ void testConstructFromByteArray()
+ {
+ const QByteArray vendorNameObject = "Company identification";
+ QModbusResponse r(QModbusResponse::EncapsulatedInterfaceTransport,
+ QByteArray::fromHex("0e01010000010016") + vendorNameObject);
+
+ {
+ QModbusDeviceIdentification qmdi = QModbusDeviceIdentification::fromByteArray(r.data());
+ QCOMPARE(qmdi.isValid(), false);
+ QCOMPARE(qmdi.objectIds(), QList<int>() << QModbusDeviceIdentification::VendorNameObjectId);
+ QCOMPARE(qmdi.contains(QModbusDeviceIdentification::VendorNameObjectId), true);
+ QCOMPARE(qmdi.value(QModbusDeviceIdentification::VendorNameObjectId), vendorNameObject);
+ QCOMPARE(qmdi.conformityLevel(), QModbusDeviceIdentification::BasicConformityLevel);
+ }
+
+ const QByteArray productCodeObject = "Product code";
+ r.setData(QByteArray::fromHex("0e01010000020016") + vendorNameObject
+ + QByteArray::fromHex("010c") + productCodeObject);
+ {
+ QModbusDeviceIdentification qmdi = QModbusDeviceIdentification::fromByteArray(r.data());
+ QCOMPARE(qmdi.isValid(), false);
+ QCOMPARE(qmdi.objectIds(), QList<int>() << QModbusDeviceIdentification::VendorNameObjectId
+ << QModbusDeviceIdentification::ProductCodeObjectId);
+ QCOMPARE(qmdi.contains(QModbusDeviceIdentification::VendorNameObjectId), true);
+ QCOMPARE(qmdi.contains(QModbusDeviceIdentification::ProductCodeObjectId), true);
+ QCOMPARE(qmdi.value(QModbusDeviceIdentification::VendorNameObjectId), vendorNameObject);
+ QCOMPARE(qmdi.value(QModbusDeviceIdentification::ProductCodeObjectId), productCodeObject);
+ QCOMPARE(qmdi.conformityLevel(), QModbusDeviceIdentification::BasicConformityLevel);
+ }
+
+ const QByteArray majorMinorRevision = "V2.11";
+ r.setData(QByteArray::fromHex("0e01010000030016") + vendorNameObject
+ + QByteArray::fromHex("010c") + productCodeObject + QByteArray::fromHex("0205")
+ + majorMinorRevision);
+ {
+ QModbusDeviceIdentification qmdi = QModbusDeviceIdentification::fromByteArray(r.data());
+ QCOMPARE(qmdi.isValid(), true);
+ QCOMPARE(qmdi.objectIds(), QList<int>() << QModbusDeviceIdentification::VendorNameObjectId
+ << QModbusDeviceIdentification::ProductCodeObjectId
+ << QModbusDeviceIdentification::MajorMinorRevisionObjectId);
+ QCOMPARE(qmdi.contains(QModbusDeviceIdentification::VendorNameObjectId), true);
+ QCOMPARE(qmdi.contains(QModbusDeviceIdentification::ProductCodeObjectId), true);
+ QCOMPARE(qmdi.contains(QModbusDeviceIdentification::MajorMinorRevisionObjectId), true);
+ QCOMPARE(qmdi.value(QModbusDeviceIdentification::VendorNameObjectId), vendorNameObject);
+ QCOMPARE(qmdi.value(QModbusDeviceIdentification::ProductCodeObjectId), productCodeObject);
+ QCOMPARE(qmdi.value(QModbusDeviceIdentification::MajorMinorRevisionObjectId), majorMinorRevision);
+ QCOMPARE(qmdi.conformityLevel(), QModbusDeviceIdentification::BasicConformityLevel);
+ }
+ }
+};
+
+QTEST_MAIN(tst_QModbusDeviceIdentification)
+
+#include "tst_qmodbusdeviceidentification.moc"
diff --git a/tests/auto/qmodbusserver/tst_qmodbusserver.cpp b/tests/auto/qmodbusserver/tst_qmodbusserver.cpp
index 114063a..2f5c231 100644
--- a/tests/auto/qmodbusserver/tst_qmodbusserver.cpp
+++ b/tests/auto/qmodbusserver/tst_qmodbusserver.cpp
@@ -37,6 +37,7 @@
#include <QtSerialBus/qmodbusserver.h>
#include <QtSerialBus/qmodbusrtuserialslave.h>
#include <QtSerialBus/qmodbustcpserver.h>
+#include <QtSerialBus/qmodbusdeviceidentification.h>
#include <QtCore/qdebug.h>
#include <QtTest/QtTest>
@@ -1198,6 +1199,51 @@ private slots:
server.processRequest(QModbusRequest(QModbusRequest::Diagnostics, quint16(0x0014), quint16(0)));
QCOMPARE(server.value(QModbusServer::DiagnosticRegister).value<quint16>(), quint16(0xfffe));
}
+
+ void testProcessEncapsulatedInterfaceTransportRequest()
+ {
+ QModbusDeviceIdentification objectPool;
+ QCOMPARE(objectPool.insert(QModbusDeviceIdentification::VendorNameObjectId,
+ "Company identification"), true);
+ QCOMPARE(objectPool.isValid(), false);
+ QCOMPARE(objectPool.insert(QModbusDeviceIdentification::ProductCodeObjectId,
+ "Product code"), true);
+ QCOMPARE(objectPool.isValid(), false);
+ QCOMPARE(objectPool.insert(QModbusDeviceIdentification::MajorMinorRevisionObjectId,
+ "V2.11"), true);
+ QCOMPARE(objectPool.isValid(), true);
+
+ QCOMPARE(server.setValue(QModbusServer::DeviceIdentification,
+ QVariant::fromValue<QModbusDeviceIdentification>(objectPool)), true);
+
+ auto response = server
+ .processRequest(QModbusRequest(QModbusRequest::EncapsulatedInterfaceTransport,
+ QByteArray::fromHex("0e0100")));
+ QCOMPARE(response.data(), QByteArray::fromHex("0e01010000030016")
+ + "Company identification" + QByteArray::fromHex("010c") + "Product code"
+ + QByteArray::fromHex("0205") + "V2.11");
+
+ QCOMPARE(objectPool.insert(QModbusDeviceIdentification::ProductCodeObjectId, QByteArray(
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")), true);
+ QCOMPARE(objectPool.isValid(), true);
+
+ QCOMPARE(server.setValue(QModbusServer::DeviceIdentification,
+ QVariant::fromValue<QModbusDeviceIdentification>(objectPool)), true);
+
+ response = server.processRequest(QModbusRequest(QModbusPdu::EncapsulatedInterfaceTransport,
+ QByteArray::fromHex("0e0100")));
+ QCOMPARE(response.data(), QByteArray::fromHex("0e0101ff02020016")
+ + "Company identification" + QByteArray::fromHex("01dc") + QByteArray(
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"));
+
+ response = server.processRequest(QModbusRequest(QModbusPdu::EncapsulatedInterfaceTransport,
+ QByteArray::fromHex("0e0102")));
+ QCOMPARE(response.data(), QByteArray::fromHex("0e01010000010205") + "V2.11");
+ }
};
QTEST_MAIN(tst_QModbusServer)