6 from tests_common
import CommonTests, add_server_methods
7 from tests_xml
import XmlTests
8 from tests_subscriptions
import SubscriptionTests
9 from datetime
import timedelta, datetime
10 from tempfile
import NamedTemporaryFile
13 from opcua
import Server
14 from opcua
import Client
16 from opcua
import uamethod
22 port_discovery = 48550
28 Run common tests on server side 29 Tests that can only be run on server side must be defined here 34 cls.srv.set_endpoint(
'opc.tcp://localhost:{0:d}'.format(port_num))
39 cls.discovery.set_application_uri(
"urn:freeopcua:python:discovery")
40 cls.discovery.set_endpoint(
'opc.tcp://localhost:{0:d}'.format(port_discovery))
49 client = Client(self.discovery.endpoint.geturl())
52 servers = client.find_servers()
53 new_app_uri =
"urn:freeopcua:python:server:test_discovery" 54 self.srv.application_uri = new_app_uri
55 self.srv.register_to_discovery(self.discovery.endpoint.geturl(), 0)
57 new_servers = client.find_servers()
58 self.
assertEqual(len(new_servers) - len(servers) , 1)
59 self.assertFalse(new_app_uri
in [s.ApplicationUri
for s
in servers])
60 self.assertTrue(new_app_uri
in [s.ApplicationUri
for s
in new_servers])
65 client = Client(self.discovery.endpoint.geturl())
68 servers = client.find_servers()
69 new_app_uri1 =
"urn:freeopcua:python:server:test_discovery1" 70 self.srv.application_uri = new_app_uri1
71 self.srv.register_to_discovery(self.discovery.endpoint.geturl(), period=0)
72 new_app_uri2 =
"urn:freeopcua:python:test_discovery2" 73 self.srv.application_uri = new_app_uri2
74 self.srv.register_to_discovery(self.discovery.endpoint.geturl(), period=0)
76 new_servers = client.find_servers()
77 self.
assertEqual(len(new_servers) - len(servers) , 2)
78 self.assertFalse(new_app_uri1
in [s.ApplicationUri
for s
in servers])
79 self.assertFalse(new_app_uri2
in [s.ApplicationUri
for s
in servers])
80 self.assertTrue(new_app_uri1
in [s.ApplicationUri
for s
in new_servers])
81 self.assertTrue(new_app_uri2
in [s.ApplicationUri
for s
in new_servers])
83 new_servers = client.find_servers([
"urn:freeopcua:python:server"])
84 self.
assertEqual(len(new_servers) - len(servers) , 0)
85 self.assertTrue(new_app_uri1
in [s.ApplicationUri
for s
in new_servers])
86 self.assertFalse(new_app_uri2
in [s.ApplicationUri
for s
in new_servers])
88 new_servers = client.find_servers([
"urn:freeopcua:python"])
89 self.
assertEqual(len(new_servers) - len(servers) , 2)
90 self.assertTrue(new_app_uri1
in [s.ApplicationUri
for s
in new_servers])
91 self.assertTrue(new_app_uri2
in [s.ApplicationUri
for s
in new_servers])
97 # not sure if this test is necessary, and there is a lot repetition with previous test 98 def test_discovery_server_side(self): 99 servers = self.discovery.find_servers() 100 self.assertEqual(len(servers), 1) 101 self.srv.register_to_discovery(self.discovery.endpoint.geturl(), 1) 102 time.sleep(1) # let server register registration 103 servers = self.discovery.find_servers() 104 print("SERVERS 2", servers) 105 self.assertEqual(len(servers), 2) 111 uri =
'http://mycustom.Namespace.com' 112 idx1 = self.opc.register_namespace(uri)
113 idx2 = self.opc.get_namespace_index(uri)
117 uri =
'http://mycustom.Namespace.com' 118 idx1 = self.opc.register_namespace(uri)
119 idx2 = self.opc.register_namespace(uri)
120 idx3 = self.opc.get_namespace_index(uri)
125 uri =
'http://my_very_custom.Namespace.com' 126 idx = self.opc.register_namespace(uri)
127 root = self.opc.get_root_node()
128 myvar = root.add_variable(idx,
'var_in_custom_namespace', [5])
133 def func(parent, variant):
136 o = self.opc.get_objects_node()
137 v = o.add_method(3,
'Method1', func, [ua.VariantType.Int64], [ua.VariantType.Int64])
138 result = o.call_method(v, ua.Variant(2.1))
142 o = self.opc.get_objects_node()
143 var = o.add_variable(3,
"test_hist", 1.0)
144 self.srv.iserver.enable_history_data_change(var, timedelta(days=1))
148 self.srv.iserver.disable_history_data_change(var)
151 srv_node = self.srv.get_node(ua.ObjectIds.Server)
152 srvevgen = self.srv.get_event_generator()
153 self.srv.iserver.enable_history_event(srv_node, period=
None)
154 srvevgen.trigger(message=
"Message")
155 self.srv.iserver.disable_history_event(srv_node)
158 objects = self.opc.get_objects_node()
159 o = objects.add_object(3,
'MyObject')
160 nodes = objects.get_referenced_nodes(refs=ua.ObjectIds.Organizes, direction=ua.BrowseDirection.Forward, includesubtypes=
False)
161 self.assertTrue(o
in nodes)
162 nodes = o.get_referenced_nodes(refs=ua.ObjectIds.Organizes, direction=ua.BrowseDirection.Inverse, includesubtypes=
False)
163 self.assertTrue(objects
in nodes)
165 self.
assertEqual(o.get_type_definition().Identifier, ua.ObjectIds.BaseObjectType)
168 def callback(parent):
171 m = o.add_method(3,
'MyMethod', callback)
172 nodes = o.get_referenced_nodes(refs=ua.ObjectIds.HasComponent, direction=ua.BrowseDirection.Forward, includesubtypes=
False)
173 self.assertTrue(m
in nodes)
174 nodes = m.get_referenced_nodes(refs=ua.ObjectIds.HasComponent, direction=ua.BrowseDirection.Inverse, includesubtypes=
False)
175 self.assertTrue(o
in nodes)
176 self.assertEqual(m.get_parent(), o)
185 self.assertIsNot(ev,
None)
186 self.assertIsInstance(ev, BaseEvent)
187 self.assertIsInstance(ev, AuditEvent)
188 self.
assertEqual(ev.EventType, ua.NodeId(ua.ObjectIds.AuditEventType))
197 evgen = self.opc.get_event_generator()
202 evgen = self.opc.get_event_generator(
BaseEvent())
207 evgen = self.opc.get_event_generator(
opcua.Node(self.opc.iserver.isession, ua.NodeId(ua.ObjectIds.BaseEventType)))
212 evgen = self.opc.get_event_generator(ua.NodeId(ua.ObjectIds.BaseEventType))
217 evgen = self.opc.get_event_generator(ua.ObjectIds.BaseEventType)
222 evgen = self.opc.get_event_generator(2041)
227 evgen = self.opc.get_event_generator(source=
opcua.Node(self.opc.iserver.isession, ua.NodeId(ua.ObjectIds.Server)))
232 evgen = self.opc.get_event_generator(source=ua.NodeId(ua.ObjectIds.Server))
237 evgen = self.opc.get_event_generator(source=ua.ObjectIds.Server)
242 objects = self.opc.get_objects_node()
243 o = objects.add_object(3,
'MyObject')
244 evgen = self.opc.get_event_generator(source=o)
249 objects = self.opc.get_objects_node()
250 o = objects.add_object(3,
'MyObject')
252 evgen = self.opc.get_event_generator(event, ua.ObjectIds.Server)
257 evgen = self.opc.get_event_generator(ua.ObjectIds.AuditEventType)
261 self.assertIsNot(ev,
None)
262 self.assertIsInstance(ev, BaseEvent)
263 self.assertIsInstance(ev, AuditEvent)
264 self.
assertEqual(ev.EventType, ua.NodeId(ua.ObjectIds.AuditEventType))
274 type = self.opc.create_custom_data_type(2,
'MyDataType', ua.ObjectIds.BaseDataType, [(
'PropertyNum', ua.VariantType.Int32), (
'PropertyString', ua.VariantType.String)])
278 type = self.opc.create_custom_event_type(2,
'MyEvent', ua.ObjectIds.BaseEventType, [(
'PropertyNum', ua.VariantType.Int32), (
'PropertyString', ua.VariantType.String)])
282 def func(parent, variant):
283 return [ua.Variant(ret, ua.VariantType.Boolean)]
285 properties = [(
'PropertyNum', ua.VariantType.Int32),
286 (
'PropertyString', ua.VariantType.String)]
287 variables = [(
'VariableString', ua.VariantType.String),
288 (
'MyEnumVar', ua.VariantType.Int32, ua.NodeId(ua.ObjectIds.ApplicationType))]
289 methods = [(
'MyMethod', func, [ua.VariantType.Int64], [ua.VariantType.Boolean])]
291 node_type = self.opc.create_custom_object_type(2,
'MyObjectType', ua.ObjectIds.BaseObjectType, properties, variables, methods)
294 variables = node_type.get_variables()
295 self.assertTrue(node_type.get_child(
"2:VariableString")
in variables)
296 self.
assertEqual(node_type.get_child(
"2:VariableString").get_data_value().Value.VariantType, ua.VariantType.String)
297 self.assertTrue(node_type.get_child(
"2:MyEnumVar")
in variables)
298 self.
assertEqual(node_type.get_child(
"2:MyEnumVar").get_data_value().Value.VariantType, ua.VariantType.Int32)
299 self.
assertEqual(node_type.get_child(
"2:MyEnumVar").get_data_type(), ua.NodeId(ua.ObjectIds.ApplicationType))
300 methods = node_type.get_methods()
301 self.assertTrue(node_type.get_child(
"2:MyMethod")
in methods)
308 type = self.opc.create_custom_variable_type(2,
'MyVariableType', ua.ObjectIds.BaseVariableType, [(
'PropertyNum', ua.VariantType.Int32), (
'PropertyString', ua.VariantType.String)])
312 etype = self.opc.create_custom_event_type(2,
'MyEvent', ua.NodeId(ua.ObjectIds.BaseEventType), [(
'PropertyNum', ua.VariantType.Int32), (
'PropertyString', ua.VariantType.String)])
316 etype = self.opc.create_custom_event_type(2,
'MyEvent',
opcua.Node(self.opc.iserver.isession, ua.NodeId(ua.ObjectIds.BaseEventType)), [(
'PropertyNum', ua.VariantType.Int32), (
'PropertyString', ua.VariantType.String)])
320 etype = self.opc.create_custom_event_type(2,
'MyEvent', ua.ObjectIds.BaseEventType, [(
'PropertyNum', ua.VariantType.Int32), (
'PropertyString', ua.VariantType.String)])
328 etype = self.opc.create_custom_event_type(2,
'MyEvent', ua.ObjectIds.BaseEventType, [(
'PropertyNum', ua.VariantType.Int32), (
'PropertyString', ua.VariantType.String)])
330 evgen = self.opc.get_event_generator(etype, ua.ObjectIds.Server)
338 event1 = self.opc.create_custom_event_type(3,
'MyEvent1', ua.ObjectIds.BaseEventType, [(
'PropertyNum', ua.VariantType.Int32), (
'PropertyString', ua.VariantType.String)])
340 event2 = self.opc.create_custom_event_type(4,
'MyEvent2', event1, [(
'PropertyBool', ua.VariantType.Boolean), (
'PropertyInt', ua.VariantType.Int32)])
342 evgen = self.opc.get_event_generator(event2, ua.ObjectIds.Server)
355 objects = self.opc.get_objects_node()
356 o = objects.add_object(3,
'MyObject')
357 etype = self.opc.create_custom_event_type(2,
'MyEvent', ua.ObjectIds.BaseEventType, [(
'PropertyNum', ua.VariantType.Int32), (
'PropertyString', ua.VariantType.String)])
359 evgen = self.opc.get_event_generator(etype, o)
367 """ Context manager calls start() and stop() 370 def increment_state(self, *args, **kwargs):
375 server.start = increment_state.__get__(server)
376 server.stop = increment_state.__get__(server)
387 def get_ns_of_nodes(nodes):
390 ns_list.add(node.nodeid.NamespaceIndex)
394 _idx_d = self.opc.register_namespace(
'dummy1')
395 _idx_d = self.opc.register_namespace(
'dummy2')
396 _idx_d = self.opc.register_namespace(
'dummy3')
399 idx_a = self.opc.register_namespace(
'a')
400 idx_b = self.opc.register_namespace(
'b')
401 idx_c = self.opc.register_namespace(
'c')
402 o = self.opc.get_objects_node()
403 _myvar2 = o.add_variable(idx_a,
"MyBoolVar2",
True)
404 _myvar3 = o.add_variable(idx_b,
"MyBoolVar3",
True)
405 _myvar4 = o.add_variable(idx_c,
"MyBoolVar4",
True)
408 nodes = ua_utils.get_nodes_of_namespace(self.
opc, namespaces=[idx_a, idx_b, idx_c])
410 self.
assertEqual(get_ns_of_nodes(nodes), set([idx_a, idx_b, idx_c]))
412 nodes = ua_utils.get_nodes_of_namespace(self.
opc, namespaces=[idx_a])
414 self.
assertEqual(get_ns_of_nodes(nodes), set([idx_a]))
416 nodes = ua_utils.get_nodes_of_namespace(self.
opc, namespaces=[idx_b])
418 self.
assertEqual(get_ns_of_nodes(nodes), set([idx_b]))
420 nodes = ua_utils.get_nodes_of_namespace(self.
opc, namespaces=[
'a'])
422 self.
assertEqual(get_ns_of_nodes(nodes), set([idx_a]))
424 nodes = ua_utils.get_nodes_of_namespace(self.
opc, namespaces=[
'a',
'c'])
426 self.
assertEqual(get_ns_of_nodes(nodes), set([idx_a, idx_c]))
428 nodes = ua_utils.get_nodes_of_namespace(self.
opc, namespaces=
'b')
430 self.
assertEqual(get_ns_of_nodes(nodes), set([idx_b]))
432 nodes = ua_utils.get_nodes_of_namespace(self.
opc, namespaces=idx_b)
434 self.
assertEqual(get_ns_of_nodes(nodes), set([idx_b]))
436 self.assertRaises(ValueError, ua_utils.get_nodes_of_namespace, self.
opc, namespaces=
'non_existing_ns')
439 server = test.opc.get_server_node()
440 test.assertEqual(evgen.event.SourceName, server.get_browse_name().Name)
441 test.assertEqual(evgen.event.SourceNode, ua.NodeId(ua.ObjectIds.Server))
444 server.get_event_notifier(),
445 {ua.EventNotifier.SubscribeToEvents, ua.EventNotifier.HistoryRead}
448 refs = server.get_referenced_nodes(ua.ObjectIds.GeneratesEvent, ua.BrowseDirection.Forward, ua.NodeClass.ObjectType,
False)
449 test.assertGreaterEqual(len(refs), 1)
453 test.assertEqual(evgen.event.SourceName, obj.get_browse_name().Name)
454 test.assertEqual(evgen.event.SourceNode, obj.nodeid)
457 obj.get_event_notifier(),
458 {ua.EventNotifier.SubscribeToEvents, ua.EventNotifier.HistoryRead}
461 refs = obj.get_referenced_nodes(ua.ObjectIds.GeneratesEvent, ua.BrowseDirection.Forward, ua.NodeClass.ObjectType,
False)
462 test.assertEqual(len(refs), 1)
463 test.assertEqual(refs[0].nodeid, evgen.event.EventType)
467 test.assertIsNot(evgen,
None)
468 test.assertIs(evgen.isession, test.opc.iserver.isession)
473 test.assertIsNot(ev,
None)
474 test.assertIsInstance(ev, BaseEvent)
475 test.assertEqual(ev.EventType, ua.NodeId(ua.ObjectIds.BaseEventType))
476 test.assertEqual(ev.Severity, 1)
480 test.assertIsNot(evgen,
None)
481 test.assertIs(evgen.isession, test.opc.iserver.isession)
486 test.assertIsNot(ev,
None)
487 test.assertIsInstance(ev, BaseEvent)
488 test.assertEqual(ev.EventType, etype.nodeid)
489 test.assertEqual(ev.Severity, 1)
493 base =
opcua.Node(test.opc.iserver.isession, ua.NodeId(base_type))
494 test.assertTrue(type
in base.get_children())
495 nodes = type.get_referenced_nodes(refs=ua.ObjectIds.HasSubtype, direction=ua.BrowseDirection.Inverse, includesubtypes=
True)
496 test.assertEqual(base, nodes[0])
497 properties = type.get_properties()
498 test.assertIsNot(properties,
None)
499 test.assertEqual(len(properties), 2)
500 test.assertTrue(type.get_child(
"2:PropertyNum")
in properties)
501 test.assertEqual(type.get_child(
"2:PropertyNum").get_data_value().Value.VariantType, ua.VariantType.Int32)
502 test.assertTrue(type.get_child(
"2:PropertyString")
in properties)
503 test.assertEqual(type.get_child(
"2:PropertyString").get_data_value().Value.VariantType, ua.VariantType.String)
509 tmpfile = NamedTemporaryFile()
514 server = Server(shelffile=path)
517 id = ua.NodeId(ua.ObjectIds.Server_ServerStatus_SecondsTillShutdown)
518 s = shelve.open(path,
"w", writeback=
True)
519 s[id.to_string()].attributes[ua.AttributeIds.Value].value = ua.DataValue(123)
523 server = Server(shelffile=path)
524 self.assertEqual(server.get_node(id).get_value(), 123)
def test_context_manager(self)
def check_eventgenerator_BaseEvent(test, evgen)
def check_custom_event(test, ev, etype)
def test_eventgenerator_BaseEvent_NodeId(self)
def test_eventgenerator_InheritedEvent(self)
def test_get_event_from_type_node_BaseEvent(self)
def test_register_namespace(self)
def test_eventgenerator_BaseEvent_object(self)
def test_create_custom_event_type_Node(self)
def test_eventgenerator_customEvent_MyObject(self)
def test_get_node_by_ns(self)
def test_historize_events(self)
def test_create_custom_data_type_ObjectId(self)
def test_get_event_from_type_node_CustomEvent(self)
def test_eventgenerator_BaseEvent_ObjectIds(self)
def check_eventgenerator_CustomEvent(test, evgen, etype)
def test_server_method(self)
def test_eventgenerator_default(self)
def test_eventgenerator_BaseEvent_Identifier(self)
def add_server_methods(srv)
def test_create_custom_event_type_NodeId(self)
def test_eventgenerator_customEvent(self)
def check_eventgenerator_SourceServer(test, evgen)
def test_get_event_from_type_node_Inhereted_AuditEvent(self)
def test_create_custom_object_type_ObjectId(self)
def check_event_generator_object(test, evgen, obj)
def check_custom_type(test, type, base_type)
def test_create_custom_variable_type_ObjectId(self)
def test_historize_variable(self)
def get_event_obj_from_type_node(node)
def test_eventgenerator_source_collision(self)
def test_eventgenerator_sourceMyObject(self)
def func(parent, variant)
def test_eventgenerator_sourceServer_Node(self)
def test_find_servers2(self)
def check_base_event(test, ev)
def test_references_for_added_nodes_method(self)
def test_eventgenerator_sourceServer_ObjectIds(self)
def test_eventgenerator_BaseEvent_Node(self)
def test_eventgenerator_sourceServer_NodeId(self)
def test_register_use_namespace(self)
def test_create_custom_event_type_ObjectId(self)
def test_register_existing_namespace(self)
def test_eventgenerator_double_customEvent(self)