tests_xml.py
Go to the documentation of this file.
1 import uuid
2 import logging
3 
4 from opcua import ua
5 from opcua import uamethod
6 from opcua.ua import uaerrors
7 
8 
9 logger = logging.getLogger("opcua.common.xmlimporter")
10 logger.setLevel(logging.DEBUG)
11 logger = logging.getLogger("opcua.common.xmlparser")
12 logger.setLevel(logging.DEBUG)
13 
14 
15 @uamethod
16 def func(parent, value, string):
17  return value * 2
18 
19 
20 class XmlTests(object):
21  srv = None
22  opc = None # just to remove pylint warnings
23  assertEqual = dir
24 
25  def test_xml_import(self):
26  self.srv.import_xml("tests/custom_nodes.xml")
27  o = self.opc.get_objects_node()
28  v = o.get_child(["1:MyXMLFolder", "1:MyXMLObject", "1:MyXMLVariable"])
29  val = v.get_value()
30  self.assertEqual(val, "StringValue")
31 
32  node_path = ["Types", "DataTypes", "BaseDataType", "Enumeration",
33  "1:MyEnum", "0:EnumStrings"]
34  o = self.opc.get_root_node().get_child(node_path)
35  self.assertEqual(len(o.get_value()), 3)
36 
37  # Check if method is imported
38  node_path = ["Types", "ObjectTypes", "BaseObjectType",
39  "1:MyObjectType", "1:MyMethod"]
40  o = self.opc.get_root_node().get_child(node_path)
41  self.assertEqual(len(o.get_referenced_nodes()), 4)
42 
43  # Check if InputArgs are imported and can be read
44  node_path = ["Types", "ObjectTypes", "BaseObjectType",
45  "1:MyObjectType", "1:MyMethod", "InputArguments"]
46  o = self.opc.get_root_node().get_child(node_path)
47  input_arg = o.get_data_value().Value.Value[0]
48  self.assertEqual(input_arg.Name, 'Context')
49 
51  self.srv.register_namespace('http://placeholder.toincrease.nsindex') # if not already shift the new namespaces
52 
53  # "tests/custom_nodes.xml" isn't created with namespaces in mind, provide new test file
54  self.srv.import_xml("tests/custom_nodesns.xml") # the ns=1 in to file now should be mapped to ns=2
55 
56  ns = self.srv.get_namespace_index("http://examples.freeopcua.github.io/")
57  o = self.opc.get_objects_node()
58 
59  o2 = o.get_child(["{0:d}:MyBaseObject".format(ns)])
60 
61  self.assertIsNotNone(o2)
62 
63  v1 = o.get_child(["{0:d}:MyBaseObject".format(ns), "{0:d}:MyVar".format(ns)])
64  self.assertIsNotNone(v1)
65 
66  r1 = o2.get_references(refs=ua.ObjectIds.HasComponent)[0]
67  self.assertEqual(r1.NodeId.NamespaceIndex, ns)
68 
69  r3 = v1.get_references(refs=ua.ObjectIds.HasComponent)[0]
70  self.assertEqual(r3.NodeId.NamespaceIndex, ns)
71 
72  def test_xml_method(self):
73  self.opc.register_namespace("tititi")
74  self.opc.register_namespace("whatthefuck")
75  o = self.opc.nodes.objects.add_object(2, "xmlexportmethod")
76  m = o.add_method(2, "callme", func, [ua.VariantType.Double, ua.VariantType.String], [ua.VariantType.Float])
77  # set an arg dimension to a list to test list export
78  inputs = m.get_child("InputArguments")
79  val = inputs.get_value()
80  val[0].ArrayDimensions = [2, 2]
81  desc = b"My nce description"
82  val[0].Description = ua.LocalizedText(desc)
83  inputs.set_value(val)
84 
85  # get all nodes and export
86  nodes = [o, m]
87  nodes.extend(m.get_children())
88  self.opc.export_xml(nodes, "export.xml")
89 
90  self.opc.delete_nodes(nodes)
91  self.opc.import_xml("export.xml")
92 
93  # now see if our nodes are here
94  val = inputs.get_value()
95  self.assertEqual(len(val), 2)
96 
97  self.assertEqual(val[0].ArrayDimensions, [2, 2])
98  self.assertEqual(val[0].Description.Text, desc)
99 
100  def test_xml_vars(self):
101  self.opc.register_namespace("tititi")
102  self.opc.register_namespace("whatthexxx")
103  o = self.opc.nodes.objects.add_object(2, "xmlexportobj")
104  v = o.add_variable(3, "myxmlvar", 6.78, ua.VariantType.Float)
105  a = o.add_variable(3, "myxmlvar-array", [6, 1], ua.VariantType.UInt16)
106  a2 = o.add_variable(3, "myxmlvar-2dim", [[1, 2], [3, 4]], ua.VariantType.UInt32)
107  a3 = o.add_variable(3, "myxmlvar-2dim", [[]], ua.VariantType.ByteString)
108 
109  nodes = [o, v, a, a2, a3]
110  self.opc.export_xml(nodes, "export-vars.xml")
111  self.opc.delete_nodes(nodes)
112  self.opc.import_xml("export-vars.xml")
113 
114  self.assertEqual(v.get_value(), 6.78)
115  self.assertEqual(v.get_data_type(), ua.NodeId(ua.ObjectIds.Float))
116 
117  self.assertEqual(a.get_data_type(), ua.NodeId(ua.ObjectIds.UInt16))
118  self.assertIn(a.get_value_rank(), (0, 1))
119  self.assertEqual(a.get_value(), [6, 1])
120 
121  self.assertEqual(a2.get_value(), [[1, 2], [3, 4]])
122  self.assertEqual(a2.get_data_type(), ua.NodeId(ua.ObjectIds.UInt32))
123  self.assertIn(a2.get_value_rank(), (0, 2))
124  self.assertEqual(a2.get_attribute(ua.AttributeIds.ArrayDimensions).Value.Value, [2, 2])
125  # self.assertEqual(a3.get_value(), [[]]) # would require special code ...
126  self.assertEqual(a3.get_data_type(), ua.NodeId(ua.ObjectIds.ByteString))
127  self.assertIn(a3.get_value_rank(), (0, 2))
128  self.assertEqual(a3.get_attribute(ua.AttributeIds.ArrayDimensions).Value.Value, [1, 0])
129 
130  def test_xml_ns(self):
131  """
132  This test is far too complicated but catches a lot of things...
133  """
134  ns_array = self.opc.get_namespace_array()
135  if len(ns_array) < 3:
136  self.opc.register_namespace("dummy_ns")
137  print("ARRAY", self.opc.get_namespace_array())
138 
139  ref_ns = self.opc.register_namespace("ref_namespace")
140  new_ns = self.opc.register_namespace("my_new_namespace")
141  bname_ns = self.opc.register_namespace("bname_namespace")
142 
143  o = self.opc.nodes.objects.add_object(0, "xmlns0")
144  o50 = self.opc.nodes.objects.add_object(50, "xmlns20")
145  o200 = self.opc.nodes.objects.add_object(200, "xmlns200")
146  onew = self.opc.nodes.objects.add_object(new_ns, "xmlns_new")
147  vnew = onew.add_variable(new_ns, "xmlns_new_var", 9.99)
148  o_no_export = self.opc.nodes.objects.add_object(ref_ns, "xmlns_parent")
149  v_no_parent = o_no_export.add_variable(new_ns, "xmlns_new_var_no_parent", 9.99)
150  o_bname = onew.add_object("ns={0};i=4000".format(new_ns), "{0}:BNAME".format(bname_ns))
151 
152  nodes = [o, o50, o200, onew, vnew, v_no_parent, o_bname]
153  print("CREATED", nodes, o_no_export)
154  self.opc.export_xml(nodes, "export-ns.xml")
155  # delete node and change index og new_ns before re-importing
156  self.opc.delete_nodes(nodes)
157  ns_node = self.opc.get_node(ua.NodeId(ua.ObjectIds.Server_NamespaceArray))
158  nss = ns_node.get_value()
159  nss.remove("my_new_namespace")
160  # nss.remove("ref_namespace")
161  nss.remove("bname_namespace")
162  ns_node.set_value(nss)
163  new_ns = self.opc.register_namespace("my_new_namespace_offsett")
164  new_ns = self.opc.register_namespace("my_new_namespace")
165 
166  new_nodes = self.opc.import_xml("export-ns.xml")
167  print("NEW NODES", new_nodes)
168 
169  for i in [o, o50, o200]:
170  print(i)
171  i.get_browse_name()
172  with self.assertRaises(uaerrors.BadNodeIdUnknown):
173  onew.get_browse_name()
174 
175  # since my_new_namesspace2 is referenced byt a node it should have been reimported
176  nss = self.opc.get_namespace_array()
177  self.assertIn("bname_namespace", nss)
178  # get index of namespaces after import
179  new_ns = self.opc.register_namespace("my_new_namespace")
180  bname_ns = self.opc.register_namespace("bname_namespace")
181  print("ARRAY 2", self.opc.get_namespace_array())
182 
183  print("NEW NS", new_ns, onew)
184  onew.nodeid.NamespaceIndex = new_ns
185  print("OENE", onew)
186  onew.get_browse_name()
187  vnew2 = onew.get_children()[0]
188  self.assertEqual(new_ns, vnew2.nodeid.NamespaceIndex)
189 
190  def test_xml_float(self):
191  o = self.opc.nodes.objects.add_variable(2, "xmlfloat", 5.67)
192  dtype = o.get_data_type()
193  dv = o.get_data_value()
194 
195  self.opc.export_xml([o], "export-float.xml")
196  self.opc.delete_nodes([o])
197  new_nodes = self.opc.import_xml("export-float.xml")
198  o2 = self.opc.get_node(new_nodes[0])
199 
200  self.assertEqual(o, o2)
201  self.assertEqual(dtype, o2.get_data_type())
202  self.assertEqual(dv.Value, o2.get_data_value().Value)
203 
204  def test_xml_bool(self):
205  o = self.opc.nodes.objects.add_variable(2, "xmlbool", True)
206  self._test_xml_var_type(o, "bool")
207 
208  def test_xml_string(self):
209  o = self.opc.nodes.objects.add_variable(2, "xmlstring", "mystring")
210  self._test_xml_var_type(o, "string")
211 
213  o = self.opc.nodes.objects.add_variable(2, "xmlstringarray", ["mystring2", "mystring3"])
214  node2 = self._test_xml_var_type(o, "stringarray")
215  dv = node2.get_data_value()
216 
217  def test_xml_guid(self):
218  o = self.opc.nodes.objects.add_variable(2, "xmlguid", uuid.uuid4())
219  self._test_xml_var_type(o, "guid")
220 
222  o = self.opc.nodes.objects.add_variable(2, "xmlltext", ua.LocalizedText("mytext"))
223  self._test_xml_var_type(o, "localized_text")
224 
226  o = self.opc.nodes.objects.add_variable(2, "xmlltext_array", [ua.LocalizedText("erert"), ua.LocalizedText("erert33")])
227  self._test_xml_var_type(o, "localized_text_array")
228 
229  def test_xml_nodeid(self):
230  o = self.opc.nodes.objects.add_variable(2, "xmlnodeid", ua.NodeId("mytext", 1))
231  self._test_xml_var_type(o, "nodeid")
232 
233  def test_xml_ext_obj(self):
234  arg = ua.Argument()
235  arg.DataType = ua.NodeId(ua.ObjectIds.Float)
236  arg.Description = ua.LocalizedText(b"Nice description")
237  arg.ArrayDimensions = [1, 2, 3]
238  arg.Name = "MyArg"
239 
240  node = self.opc.nodes.objects.add_variable(2, "xmlexportobj2", arg)
241  node2 = self._test_xml_var_type(node, "ext_obj", test_equality=False)
242  arg2 = node2.get_value()
243 
244  self.assertEqual(arg.Name, arg2.Name)
245  self.assertEqual(arg.ArrayDimensions, arg2.ArrayDimensions)
246  self.assertEqual(arg.Description, arg2.Description)
247  self.assertEqual(arg.DataType, arg2.DataType)
248 
249  def test_xml_enum(self):
250  o = self.opc.nodes.objects.add_variable(2, "xmlenum", 0, varianttype=ua.VariantType.Int32, datatype=ua.ObjectIds.ApplicationType)
251  self._test_xml_var_type(o, "enum")
252 
254  o = self.opc.nodes.objects.add_variable(2, "xmlenumvalues", 0, varianttype=ua.VariantType.Int32, datatype=ua.ObjectIds.AttributeWriteMask)
255  self._test_xml_var_type(o, "enumvalues")
256 
258  t = self.opc.create_custom_data_type(2, 'MyCustomUint32', ua.ObjectIds.UInt32)
259  o = self.opc.nodes.objects.add_variable(2, "xmlcustomunit32", 0, varianttype=ua.VariantType.UInt32, datatype=t.nodeid)
260  self._test_xml_var_type(o, "cuint32")
261 
262  def _test_xml_var_type(self, node, typename, test_equality=True):
263  dtype = node.get_data_type()
264  dv = node.get_data_value()
265  rank = node.get_value_rank()
266  dim = node.get_array_dimensions()
267  nclass = node.get_node_class()
268 
269  path = "export-{0}.xml".format(typename)
270  self.opc.export_xml([node], path)
271  self.opc.delete_nodes([node])
272  new_nodes = self.opc.import_xml(path)
273  node2 = self.opc.get_node(new_nodes[0])
274 
275  self.assertEqual(node, node2)
276  self.assertEqual(dtype, node2.get_data_type())
277  if test_equality:
278  self.assertEqual(dv.Value, node2.get_data_value().Value)
279  self.assertEqual(rank, node2.get_value_rank())
280  self.assertEqual(dim, node2.get_array_dimensions())
281  self.assertEqual(nclass, node2.get_node_class())
282  return node2
def test_xml_localizedtext(self)
Definition: tests_xml.py:221
def test_xml_custom_uint32(self)
Definition: tests_xml.py:257
def test_xml_vars(self)
Definition: tests_xml.py:100
def test_xml_import_additional_ns(self)
Definition: tests_xml.py:50
def test_xml_guid(self)
Definition: tests_xml.py:217
def test_xml_method(self)
Definition: tests_xml.py:72
def _test_xml_var_type(self, node, typename, test_equality=True)
Definition: tests_xml.py:262
def test_xml_nodeid(self)
Definition: tests_xml.py:229
def test_xml_string_array(self)
Definition: tests_xml.py:212
def test_xml_string(self)
Definition: tests_xml.py:208
def test_xml_ext_obj(self)
Definition: tests_xml.py:233
def test_xml_import(self)
Definition: tests_xml.py:25
def test_xml_enum(self)
Definition: tests_xml.py:249
def func(parent, value, string)
Definition: tests_xml.py:16
def test_xml_ns(self)
Definition: tests_xml.py:130
def test_xml_localizedtext_array(self)
Definition: tests_xml.py:225
def test_xml_float(self)
Definition: tests_xml.py:190
def test_xml_enumvalues(self)
Definition: tests_xml.py:253
def test_xml_bool(self)
Definition: tests_xml.py:204


ros_opcua_impl_python_opcua
Author(s): Denis Štogl , Daniel Draper
autogenerated on Tue Jan 19 2021 03:12:44