summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorJannis Voelker <jannis.voelker@basyskom.com>2018-05-04 15:28:05 +0200
committerJannis Völker <jannis.voelker@basyskom.com>2018-05-14 12:42:30 +0000
commit78d016e79ed8bc3d2d3f1c2dac90a4c75392d35b (patch)
tree089b938199b3f8221f77613be1f6c823d9d7d1cf /tests
parent4c5bb1a2e043bc64ac6df54fd0d547ce41012f00 (diff)
Fix subscription sharing for revised publishing intervalsv5.11.0-rc2v5.11.0
The current implementation uses an existing subscription for sharing if a subscription with the requested publishing interval exists. If the publishing interval of a subscription is revised by the server, the lookup for a second monitoring with the same requested interval fails and a new subscription is created. This patch adds a member variable which stores the last revised publishing interval to each backend. Requests with a publishing interval < last revised publishing interval are "revised" by the backend to ensure subscription sharing. A test case which checks for correct subscription sharing is added to tst_client.cpp. Change-Id: I5e433501f23bf99e841c5c41e750ed8631ea7162 Reviewed-by: Rainer Keller <Rainer.Keller@qt.io>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/qopcuaclient/tst_client.cpp63
1 files changed, 63 insertions, 0 deletions
diff --git a/tests/auto/qopcuaclient/tst_client.cpp b/tests/auto/qopcuaclient/tst_client.cpp
index aa601dd..7bf8736 100644
--- a/tests/auto/qopcuaclient/tst_client.cpp
+++ b/tests/auto/qopcuaclient/tst_client.cpp
@@ -206,6 +206,8 @@ private slots:
void dataChangeSubscription();
defineDataMethod(dataChangeSubscriptionInvalidNode_data)
void dataChangeSubscriptionInvalidNode();
+ defineDataMethod(dataChangeSubscriptionSharing_data)
+ void dataChangeSubscriptionSharing();
defineDataMethod(methodCall_data)
void methodCall();
defineDataMethod(methodCallInvalid_data)
@@ -743,6 +745,67 @@ void Tst_QOpcUaClient::dataChangeSubscriptionInvalidNode()
QVERIFY(noDataNode->monitoringStatus(QOpcUa::NodeAttribute::Value).subscriptionId() == 0);
}
+void Tst_QOpcUaClient::dataChangeSubscriptionSharing()
+{
+ // The open62541 test server has a minimum publishing interval of 100ms.
+ // This test verifies that monitorings with smaller requested publishing interval and shared flag
+ // share the same subscription.
+
+ QFETCH(QOpcUaClient *, opcuaClient);
+ OpcuaConnector connector(opcuaClient, m_endpoint);
+
+ QScopedPointer<QOpcUaNode> node(opcuaClient->node(readWriteNode));
+ QVERIFY(node != 0);
+ QSignalSpy monitoringEnabledSpy(node.data(), &QOpcUaNode::enableMonitoringFinished);
+
+ node->enableMonitoring(QOpcUa::NodeAttribute::Value, QOpcUaMonitoringParameters(50));
+ monitoringEnabledSpy.wait();
+
+ QVERIFY(monitoringEnabledSpy.size() == 1);
+ QVERIFY(monitoringEnabledSpy.at(0).at(0).value<QOpcUa::NodeAttribute>() == QOpcUa::NodeAttribute::Value);
+ QVERIFY(node->monitoringStatus(QOpcUa::NodeAttribute::Value).statusCode() == QOpcUa::UaStatusCode::Good);
+
+ QOpcUaMonitoringParameters valueStatus = node->monitoringStatus(QOpcUa::NodeAttribute::Value);
+ QVERIFY(valueStatus.subscriptionId() != 0);
+ QVERIFY(valueStatus.statusCode() == QOpcUa::UaStatusCode::Good);
+
+ monitoringEnabledSpy.clear();
+
+ node->enableMonitoring(QOpcUa::NodeAttribute::DisplayName, QOpcUaMonitoringParameters(25));
+ monitoringEnabledSpy.wait();
+
+ QVERIFY(monitoringEnabledSpy.size() == 1);
+ QVERIFY(monitoringEnabledSpy.at(0).at(0).value<QOpcUa::NodeAttribute>() == QOpcUa::NodeAttribute::DisplayName);
+ QVERIFY(node->monitoringStatus(QOpcUa::NodeAttribute::DisplayName).statusCode() == QOpcUa::UaStatusCode::Good);
+
+ QOpcUaMonitoringParameters displayNameStatus = node->monitoringStatus(QOpcUa::NodeAttribute::DisplayName);
+ QVERIFY(displayNameStatus.subscriptionId() == valueStatus.subscriptionId());
+ QVERIFY(displayNameStatus.statusCode() == QOpcUa::UaStatusCode::Good);
+
+ QVERIFY(valueStatus.subscriptionId() == displayNameStatus.subscriptionId());
+ QCOMPARE(valueStatus.publishingInterval(), displayNameStatus.publishingInterval());
+ QCOMPARE(valueStatus.publishingInterval(), 100.0);
+
+ QSignalSpy monitoringDisabledSpy(node.data(), &QOpcUaNode::disableMonitoringFinished);
+
+ node->disableMonitoring(QOpcUa::NodeAttribute::Value | QOpcUa::NodeAttribute::DisplayName | QOpcUa::NodeAttribute::NodeId);
+ monitoringDisabledSpy.wait();
+ if (monitoringDisabledSpy.size() < 2)
+ monitoringDisabledSpy.wait();
+
+ QVERIFY(monitoringDisabledSpy.size() == 2);
+
+ QVector<QOpcUa::NodeAttribute> attrs = {QOpcUa::NodeAttribute::Value, QOpcUa::NodeAttribute::DisplayName};
+ for (auto it : qAsConst(monitoringDisabledSpy)) {
+ auto temp = it.at(0).value<QOpcUa::NodeAttribute>();
+ QVERIFY(attrs.contains(temp));
+ QVERIFY(node->monitoringStatus(temp).subscriptionId() == 0);
+ QVERIFY(node->monitoringStatus(temp).statusCode() == QOpcUa::UaStatusCode::BadAttributeIdInvalid);
+ attrs.removeOne(temp);
+ }
+ QVERIFY(attrs.size() == 0);
+}
+
void Tst_QOpcUaClient::methodCall()
{
QFETCH(QOpcUaClient *, opcuaClient);