diff options
author | Jannis Voelker <jannis.voelker@basyskom.com> | 2017-10-20 08:37:52 +0200 |
---|---|---|
committer | Frank Meerkoetter <frank.meerkoetter@basyskom.com> | 2017-12-05 19:11:15 +0000 |
commit | 9d77bd195dbb4e830663f9b67487ed811bece887 (patch) | |
tree | c90ec9d0a250fdf79c61bf4e8ceb940cfa156eb7 /tests | |
parent | c7ae6774e50d3e0a9180eaa1b67f92087dd833e0 (diff) |
Add support for the StatusCode type
This change enables reading and writing scalar and array status code
values in both backends.
Variable nodes with scalar and array values of the StatusCode type
have been added to the test server, the test client has been
extended to check for correct reading and writing of StatusCode
values.
Change-Id: Icdcf03d36f33bc38a73c2295d471af33ff6afc9a
Reviewed-by: Frank Meerkoetter <frank.meerkoetter@basyskom.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/qopcuaclient/tst_client.cpp | 31 | ||||
-rw-r--r-- | tests/open62541-testserver/main.cpp | 2 | ||||
-rw-r--r-- | tests/open62541-testserver/testserver.cpp | 33 |
3 files changed, 66 insertions, 0 deletions
diff --git a/tests/auto/qopcuaclient/tst_client.cpp b/tests/auto/qopcuaclient/tst_client.cpp index cbb511b..cbac3a3 100644 --- a/tests/auto/qopcuaclient/tst_client.cpp +++ b/tests/auto/qopcuaclient/tst_client.cpp @@ -918,6 +918,15 @@ void Tst_QOpcUaClient::writeArray() success = node->setValue(list, QOpcUa::QualifiedName); QVERIFY(success == true); + list.clear(); + list.append(QOpcUa::UaStatusCode::Good); + list.append(QOpcUa::UaStatusCode::BadUnexpectedError); + list.append(QOpcUa::UaStatusCode::BadInternalError); + node.reset(opcuaClient->node("ns=2;s=Demo.Static.Arrays.StatusCode")); + QVERIFY(node != 0); + success = node->setValue(list, QOpcUa::Types::StatusCode); + QVERIFY(success == true); + if (opcuaClient->backend() == QLatin1String("freeopcua")) QSKIP("XmlElement support is not yet implemented in the freeopcua library"); @@ -1129,6 +1138,16 @@ void Tst_QOpcUaClient::readArray() QVERIFY(qualifiedNameArray.toList()[1].value<QOpcUa::QQualifiedName>() == QOpcUa::QQualifiedName(1, "Test1")); QVERIFY(qualifiedNameArray.toList()[2].value<QOpcUa::QQualifiedName>() == QOpcUa::QQualifiedName(2, "Test2")); + QScopedPointer<QOpcUaNode> statusCodeArrayNode(opcuaClient->node("ns=2;s=Demo.Static.Arrays.StatusCode")); + QVERIFY(statusCodeArrayNode != 0); + READ_MANDATORY_VARIABLE_NODE(statusCodeArrayNode); + QVariant statusCodeArray = statusCodeArrayNode->attribute(QOpcUaNode::NodeAttribute::Value); + QVERIFY(statusCodeArray.type() == QVariant::List); + QVERIFY(statusCodeArray.toList().length() == 3); + QCOMPARE(statusCodeArray.toList()[0].value<QOpcUa::UaStatusCode>(), QOpcUa::UaStatusCode::Good); + QCOMPARE(statusCodeArray.toList()[1].value<QOpcUa::UaStatusCode>(), QOpcUa::UaStatusCode::BadUnexpectedError); + QCOMPARE(statusCodeArray.toList()[2].value<QOpcUa::UaStatusCode>(), QOpcUa::UaStatusCode::BadInternalError); + if (opcuaClient->backend() == QLatin1String("freeopcua")) QSKIP("XmlElement support is not yet implemented in the freeopcua backend"); @@ -1247,6 +1266,11 @@ void Tst_QOpcUaClient::writeScalar() success = qualifiedNameNode->setValue(QVariant::fromValue(QOpcUa::QQualifiedName(0, QLatin1String("Test0"))), QOpcUa::QualifiedName); QVERIFY(success == true); + QScopedPointer<QOpcUaNode> statusCodeNode(opcuaClient->node("ns=2;s=Demo.Static.Scalar.StatusCode")); + QVERIFY(statusCodeNode != 0); + success = statusCodeNode->setValue(QOpcUa::UaStatusCode::BadInternalError, QOpcUa::StatusCode); + QVERIFY(success == true); + if (opcuaClient->backend() == QLatin1String("freeopcua")) QSKIP("XmlElement support is not yet implemented in the freeopcua backend"); @@ -1404,6 +1428,13 @@ void Tst_QOpcUaClient::readScalar() QVariant qualifiedNameScalar = node->attribute(QOpcUaNode::NodeAttribute::Value); QVERIFY(qualifiedNameScalar.value<QOpcUa::QQualifiedName>() == QOpcUa::QQualifiedName(0, "Test0")); + node.reset(opcuaClient->node("ns=2;s=Demo.Static.Scalar.StatusCode")); + QVERIFY(node != 0); + READ_MANDATORY_VARIABLE_NODE(node); + QVariant statusCodeScalar = node->attribute(QOpcUaNode::NodeAttribute::Value); + QVERIFY(statusCodeScalar.isValid()); + QCOMPARE(statusCodeScalar.value<QOpcUa::UaStatusCode>(), QOpcUa::UaStatusCode::BadInternalError); + if (opcuaClient->backend() == QLatin1String("freeopcua")) QSKIP("XmlElement support is not yet implemented in the freeopcua backend"); diff --git a/tests/open62541-testserver/main.cpp b/tests/open62541-testserver/main.cpp index f703dc3..9821784 100644 --- a/tests/open62541-testserver/main.cpp +++ b/tests/open62541-testserver/main.cpp @@ -95,6 +95,7 @@ int main(int argc, char **argv) server.addVariable<UA_Guid, QUuid, UA_TYPES_GUID>(testFolder, "ns=2;s=Demo.Static.Arrays.Guid", "GuidArrayTest", QUuid()); server.addVariable<UA_XmlElement, QString, UA_TYPES_XMLELEMENT>(testFolder, "ns=2;s=Demo.Static.Arrays.XmlElement", "XmlElementArrayTest", QString()); server.addVariable<UA_QualifiedName, QPair<quint16, QString>, UA_TYPES_QUALIFIEDNAME>(testFolder, "ns=2;s=Demo.Static.Arrays.QualifiedName", "QualifiedNameArrayTest", QPair<quint16, QString>()); + server.addVariable<UA_StatusCode, UA_StatusCode, UA_TYPES_STATUSCODE>(testFolder, "ns=2;s=Demo.Static.Arrays.StatusCode", "StatusCodeArrayTest", UA_STATUSCODE_GOOD); server.addVariable<UA_Boolean, bool, UA_TYPES_BOOLEAN>(testFolder, "ns=2;s=Demo.Static.Scalar.Boolean", "BoolScalarTest", true); server.addVariable<UA_Byte, uchar, UA_TYPES_BYTE>(testFolder, "ns=2;s=Demo.Static.Scalar.Byte", "ByteScalarTest", 0); @@ -117,6 +118,7 @@ int main(int argc, char **argv) server.addVariable<UA_Guid, QUuid, UA_TYPES_GUID>(testFolder, "ns=2;s=Demo.Static.Scalar.Guid", "GuidScalarTest", QUuid()); server.addVariable<UA_XmlElement, QString, UA_TYPES_XMLELEMENT>(testFolder, "ns=2;s=Demo.Static.Scalar.XmlElement", "XmlElementScalarTest", QString()); server.addVariable<UA_QualifiedName, QPair<quint16, QString>, UA_TYPES_QUALIFIEDNAME>(testFolder, "ns=2;s=Demo.Static.Scalar.QualifiedName", "QualifiedNameScalarTest", QPair<quint16, QString>()); + server.addVariable<UA_StatusCode, UA_StatusCode, UA_TYPES_STATUSCODE>(testFolder, "ns=2;s=Demo.Static.Scalar.StatusCode", "StatusCodeScalarTest", UA_STATUSCODE_GOOD); UA_NodeId testGuidIdsFolder = server.addFolder("ns=3;s=testGuidIdsFolder", "testGuidIdsFolder"); server.addVariable<UA_String, QString, UA_TYPES_STRING>(testGuidIdsFolder, "ns=3;g=08081e75-8e5e-319b-954f-f3a7613dc29b", "theGuidId", QString()); diff --git a/tests/open62541-testserver/testserver.cpp b/tests/open62541-testserver/testserver.cpp index ec6332a..1c5d96d 100644 --- a/tests/open62541-testserver/testserver.cpp +++ b/tests/open62541-testserver/testserver.cpp @@ -462,6 +462,39 @@ UA_NodeId TestServer::addVariable<UA_QualifiedName, QPair<quint16, QString>, UA_ return resultId; } +template <> +UA_NodeId TestServer::addVariable<UA_StatusCode, UA_StatusCode, UA_TYPES_STATUSCODE>(const UA_NodeId &folder, const QString &variableNode, + const QString &description, uint32_t value) +{ + UA_NodeId variableNodeId = Open62541Utils::nodeIdFromQString(variableNode); + + UA_VariableAttributes attr = UA_VariableAttributes_default; + UA_StatusCode uaValue = value; + UA_Variant_setScalar(&attr.value, &uaValue, &UA_TYPES[UA_TYPES_STATUSCODE]); + attr.description = UA_LOCALIZEDTEXT_ALLOC("en_US", description.toLocal8Bit().constData()); + attr.displayName = UA_LOCALIZEDTEXT_ALLOC("en_US", variableNode.toLocal8Bit().constData()); + attr.dataType = UA_TYPES[UA_TYPES_STATUSCODE].typeId; + attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE; + + UA_QualifiedName variableName = UA_QUALIFIEDNAME_ALLOC(variableNodeId.namespaceIndex, variableNode.toLocal8Bit().constData()); + + UA_NodeId resultId; + UA_StatusCode result = UA_Server_addVariableNode(m_server, + variableNodeId, + folder, + UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), + variableName, + UA_NODEID_NULL, + attr, + NULL, + &resultId); + if (result != UA_STATUSCODE_GOOD) { + qWarning() << "Could not add variable:" << result; + return UA_NODEID_NULL; + } + return resultId; +} + template UA_NodeId TestServer::addVariable<UA_Double, double, UA_TYPES_DOUBLE>(const UA_NodeId &, const QString &, const QString &, double); template UA_NodeId TestServer::addVariable<UA_Boolean, bool, UA_TYPES_BOOLEAN>(const UA_NodeId &, const QString &, const QString &, bool); template UA_NodeId TestServer::addVariable<UA_Byte, uchar, UA_TYPES_BYTE>(const UA_NodeId &, const QString &, const QString &, uchar); |