summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorJannis Voelker <jannis.voelker@basyskom.com>2017-10-20 08:37:52 +0200
committerFrank Meerkoetter <frank.meerkoetter@basyskom.com>2017-12-05 19:11:15 +0000
commit9d77bd195dbb4e830663f9b67487ed811bece887 (patch)
treec90ec9d0a250fdf79c61bf4e8ceb940cfa156eb7 /tests
parentc7ae6774e50d3e0a9180eaa1b67f92087dd833e0 (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.cpp31
-rw-r--r--tests/open62541-testserver/main.cpp2
-rw-r--r--tests/open62541-testserver/testserver.cpp33
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);