Commit 7e9f42f2 authored by maljac's avatar maljac Committed by ORD

[Server] Respect parentid in xml import, Add tests and fix

parent 14a33c98
...@@ -141,15 +141,19 @@ class XMLParser(object): ...@@ -141,15 +141,19 @@ class XMLParser(object):
# inserted nodes # inserted nodes
if node.parent in sorted_nodes_ids: if node.parent in sorted_nodes_ids:
insert = -1 insert = -1
if insert in [0, -1]:
if insert == 0:
sorted_nodes.insert(insert, node) sorted_nodes.insert(insert, node)
sorted_nodes_ids.insert(insert, node.nodeid) sorted_nodes_ids.insert(insert, node.nodeid)
pop_nodes.append(node) pop_nodes.append(node)
elif insert == -1:
sorted_nodes.append(node)
sorted_nodes_ids.append(node.nodeid)
pop_nodes.append(node)
# Remove inserted nodes from the list # Remove inserted nodes from the list
for node in pop_nodes: for node in pop_nodes:
_nodes.pop(_nodes.index(node)) _nodes.pop(_nodes.index(node))
return sorted_nodes return sorted_nodes
def _split_node_id(self, value): def _split_node_id(self, value):
...@@ -183,6 +187,9 @@ class XMLParser(object): ...@@ -183,6 +187,9 @@ class XMLParser(object):
return result return result
def _parse_node(self, name, child): def _parse_node(self, name, child):
"""
Parse a XML node and create a NodeData object.
"""
obj = NodeData() obj = NodeData()
obj.nodetype = name obj.nodetype = name
for key, val in child.attrib.items(): for key, val in child.attrib.items():
......
...@@ -4,6 +4,7 @@ import logging ...@@ -4,6 +4,7 @@ import logging
import io import io
from datetime import datetime from datetime import datetime
import unittest import unittest
from collections import namedtuple
from opcua import ua from opcua import ua
from opcua.ua import extensionobject_from_binary from opcua.ua import extensionobject_from_binary
...@@ -413,7 +414,7 @@ class TestUnit(unittest.TestCase): ...@@ -413,7 +414,7 @@ class TestUnit(unittest.TestCase):
n = ua.NodeId(0, 3) n = ua.NodeId(0, 3)
self.assertFalse(n.is_null()) self.assertFalse(n.is_null())
self.assertTrue(n.has_null_identifier()) self.assertTrue(n.has_null_identifier())
def test_where_clause(self): def test_where_clause(self):
cf = ua.ContentFilter() cf = ua.ContentFilter()
...@@ -458,6 +459,33 @@ class TestUnit(unittest.TestCase): ...@@ -458,6 +459,33 @@ class TestUnit(unittest.TestCase):
res4 = parser._get_node_id('ns=2;i=1001') res4 = parser._get_node_id('ns=2;i=1001')
self.assertEqual(res4, 'ns=2;i=1001') self.assertEqual(res4, 'ns=2;i=1001')
def test_xmlparser_sort_nodes_by_parentid(self):
NodeMock = namedtuple('NodeMock', 'nodeid parent')
server = None
# We actually dont need this. Thus we just pass the available file
xml_path = 'tests/custom_nodes.xml'
unordered_nodes = [
NodeMock('ns=1;i=1001', None),
NodeMock('ns=1;i=1002', 'ns=1;i=1003'),
NodeMock('ns=1;i=1003', 'ns=1;i=1001'),
NodeMock('ns=1;i=1004', 'ns=1;i=1002')
]
ordered_nodes = [
unordered_nodes[0],
unordered_nodes[2],
unordered_nodes[1],
unordered_nodes[3],
]
namespaces = {'1': (1, 'http://someuri.com')}
parser = XMLParser(xml_path, server)
parser.namespaces = namespaces
res = parser._sort_nodes_by_parentid(unordered_nodes)
self.assertEqual(res, ordered_nodes)
class TestMaskEnum(unittest.TestCase): class TestMaskEnum(unittest.TestCase):
class MyEnum(_MaskEnum): class MyEnum(_MaskEnum):
......
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