Commit 03c76516 authored by oroulet's avatar oroulet Committed by oroulet

fix bad bug in custom struct creation due to last retsructuring and disable outdated tests

parent a50f73a0
from asyncua import ua
from enum import Enum
import logging
import xml.etree.ElementTree as Et
import re
logger = logging.getLogger(__name__)
# Indicates which type should be OPC build in types
_ua_build_in_types = [ua_type for ua_type in ua.VariantType.__members__ if ua_type != 'ExtensionObject']
......@@ -137,23 +140,28 @@ class DataTypeDictionaryBuilder:
self._type_dictionary = OPCTypeDictionaryBuilder(self.ns_urn)
async def _add_dictionary(self, name):
node = ua.AddNodesItem()
node.RequestedNewNodeId = ua.NodeId(0, self._idx)
node.BrowseName = ua.QualifiedName(name, self._idx)
node.NodeClass = ua.NodeClass.Variable
node.ParentNodeId = ua.NodeId(ua.ObjectIds.OPCBinarySchema_TypeSystem, 0)
node.ReferenceTypeId = ua.NodeId(ua.ObjectIds.HasComponent, 0)
node.TypeDefinition = ua.NodeId(ua.ObjectIds.DataTypeDictionaryType, 0)
attrs = ua.VariableAttributes()
attrs.DisplayName = ua.LocalizedText(name)
attrs.DataType = ua.NodeId(ua.ObjectIds.ByteString)
# Value should be set after all data types created by calling set_dict_byte_string
attrs.Value = ua.Variant(None, ua.VariantType.Null)
attrs.ValueRank = -1
node.NodeAttributes = attrs
res = await self._session_server.add_nodes([node])
return res[0].AddedNodeId
try:
node = await self._server.nodes.opc_binary.get_child(f"{self._idx}:{name}")
except ua.uaerrors.BadNoMatch:
node = ua.AddNodesItem()
node.RequestedNewNodeId = ua.NodeId(0, self._idx)
node.BrowseName = ua.QualifiedName(name, self._idx)
node.NodeClass = ua.NodeClass.Variable
node.ParentNodeId = ua.NodeId(ua.ObjectIds.OPCBinarySchema_TypeSystem, 0)
node.ReferenceTypeId = ua.NodeId(ua.ObjectIds.HasComponent, 0)
node.TypeDefinition = ua.NodeId(ua.ObjectIds.DataTypeDictionaryType, 0)
attrs = ua.VariableAttributes()
attrs.DisplayName = ua.LocalizedText(name)
attrs.DataType = ua.NodeId(ua.ObjectIds.ByteString)
# Value should be set after all data types created by calling set_dict_byte_string
attrs.Value = ua.Variant(None, ua.VariantType.Null)
attrs.ValueRank = -1
node.NodeAttributes = attrs
res = await self._session_server.add_nodes([node])
return res[0].AddedNodeId
logger.warning("Making %s object for node %s which already exist, its data will be overriden", self, node)
#FIXME: we have an issue
return node.nodeid
async def _link_nodes(self, linked_obj_node_id, data_type_node_id, description_node_id):
"""link the three node by their node ids according to UA standard"""
......@@ -189,10 +197,9 @@ class DataTypeDictionaryBuilder:
name = type_name
if nodeid is None:
data_type_node_id = ua.NodeId(0, self._idx)
# create data type node
dt_node = ua.AddNodisItem()
dt_node.RequestedNewNodeId = data_type_node_id
dt_node = ua.AddNodesItem()
dt_node.RequestedNewNodeId = ua.NodeId(0, self._idx)
dt_node.BrowseName = ua.QualifiedName(name, self._idx)
dt_node.NodeClass = ua.NodeClass.DataType
dt_node.ParentNodeId = ua.NodeId(ua.ObjectIds.Structure, 0)
......@@ -202,6 +209,7 @@ class DataTypeDictionaryBuilder:
dt_node.NodeAttributes = dt_attributes
res = await self._session_server.add_nodes([dt_node])
data_type_node_id = res[0].AddedNodeId
else:
data_type_node_id = nodeid
......@@ -209,9 +217,8 @@ class DataTypeDictionaryBuilder:
if init:
# create description node
description_node_id = ua.NodeId(0, self._idx)
desc_node = ua.AddNodesItem()
desc_node.RequestedNewNodeId = description_node_id
desc_node.RequestedNewNodeId = ua.NodeId(0, self._idx)
desc_node.BrowseName = ua.QualifiedName(name, self._idx)
desc_node.NodeClass = ua.NodeClass.Variable
desc_node.ParentNodeId = self.dict_id
......@@ -229,9 +236,8 @@ class DataTypeDictionaryBuilder:
added.append(description_node_id)
# create object node which the loaded python class should link to
bind_obj_node_id = ua.NodeId(0, self._idx)
obj_node = ua.AddNodesItem()
obj_node.RequestedNewNodeId = bind_obj_node_id
obj_node.RequestedNewNodeId = ua.NodeId(0, self._idx)
obj_node.BrowseName = ua.QualifiedName('Default Binary', 0)
obj_node.NodeClass = ua.NodeClass.Object
obj_node.ParentNodeId = data_type_node_id
......
......@@ -53,13 +53,7 @@ async def srv(_srv):
_srv.opc_type_builder = OPCTypeDictionaryBuilder(ns_urn)
_srv.dict_builder = DataTypeDictionaryBuilder(_srv.srv, _srv.idx, ns_urn, 'TestDict')
await _srv.dict_builder.init()
_srv.init_counter = getattr(_srv.dict_builder, '_id_counter')
yield _srv
curr_counter = getattr(_srv.dict_builder, '_id_counter')
trash_nodes = []
for counter in range(_srv.init_counter, curr_counter + 1):
trash_nodes.append(_srv.srv.get_node('ns={0};i={1}'.format(_srv.idx, str(counter))))
await _srv.srv.delete_nodes(trash_nodes)
async def test_camel_case_1():
......@@ -93,6 +87,7 @@ async def test_opc_type_dict_append_struct_1(srv):
assert result.attrib == case
@pytest.mark.skip("support for theat currently removed")
async def test_opc_type_dict_append_struct_2(srv):
case = {'BaseType': 'ua:ExtensionObject',
'Name': 'CustomizedStruct'}
......@@ -183,15 +178,6 @@ async def test_data_type_dict_general(srv):
assert getattr(srv.dict_builder, '_type_dictionary') is not None
async def test_data_type_dict_nodeid_generator(srv):
nodeid_generator = getattr(srv.dict_builder, '_nodeid_generator')
result = nodeid_generator()
assert isinstance(result, ua.NodeId)
assert str(result.Identifier).isdigit()
assert result.NamespaceIndex == srv.idx
setattr(srv.dict_builder, '_id_counter', srv.init_counter)
async def test_data_type_dict_add_dictionary(srv):
add_dictionary = getattr(srv.dict_builder, '_add_dictionary')
dict_name = 'TestDict'
......@@ -207,7 +193,7 @@ async def test_data_type_dict_add_dictionary(srv):
async def test_data_type_dict_create_data_type(srv):
type_name = 'CustomizedStruct'
type_name = 'CustomizedStruct2'
created_type = await srv.dict_builder.create_data_type(type_name)
assert isinstance(created_type, StructNode)
# Test data type node
......@@ -219,7 +205,8 @@ async def test_data_type_dict_create_data_type(srv):
assert await type_node.get_display_name() == ua.LocalizedText(type_name)
# Test description node
desc_node = (await srv.srv.get_node(srv.dict_builder.dict_id).get_children())[0]
n = srv.srv.get_node(srv.dict_builder.dict_id)
desc_node = await n.get_child(f"{srv.dict_builder._idx}:{type_name}")
assert await desc_node.get_browse_name() == ua.QualifiedName(type_name, srv.idx)
assert await desc_node.get_node_class() == ua.NodeClass.Variable
assert (await desc_node.get_parent()).nodeid == srv.dict_builder.dict_id
......@@ -331,6 +318,7 @@ async def test_get_ua_class_1(srv):
pass
@pytest.mark.skip("support for theat currently removed")
async def test_get_ua_class_2(srv):
struct_name = '*c*u_stom-ized&Stru#ct'
struct_node = await srv.dict_builder.create_data_type(struct_name)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment