diff options
author | Jannis Voelker <jannis.voelker@basyskom.com> | 2018-05-04 15:28:05 +0200 |
---|---|---|
committer | Jannis Völker <jannis.voelker@basyskom.com> | 2018-05-14 12:42:30 +0000 |
commit | 78d016e79ed8bc3d2d3f1c2dac90a4c75392d35b (patch) | |
tree | 089b938199b3f8221f77613be1f6c823d9d7d1cf /tests | |
parent | 4c5bb1a2e043bc64ac6df54fd0d547ce41012f00 (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.cpp | 63 |
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); |