Completed
Pull Request — master (#179)
by Olivier
01:57
created

test_eventgenerator_double_customEvent()   A

Complexity

Conditions 1

Size

Total Lines 16

Duplication

Lines 7
Ratio 43.75 %

Code Coverage

Tests 9
CRAP Score 1
Metric Value
cc 1
dl 7
loc 16
ccs 9
cts 9
cp 1
crap 1
rs 9.4285
1 1
import unittest
2 1
from tests_common import CommonTests, add_server_methods
3 1
from tests_subscriptions import SubscriptionTests
4 1
import time
5
from datetime import timedelta, datetime
6 1
7 1
import opcua
8 1
from opcua import Server
9 1
from opcua import Client
10 1
from opcua import ua
11
from opcua import uamethod
12
13 1
14 1
port_num = 485140
15
port_discovery = 48550
16
17 1
18
class TestServer(unittest.TestCase, CommonTests, SubscriptionTests):
19
20
    '''
21
    Run common tests on server side
22
    Tests that can only be run on server side must be defined here
23 1
    '''
24
    @classmethod
25 1
    def setUpClass(self):
26 1
        self.srv = Server()
27 1
        self.srv.set_endpoint('opc.tcp://localhost:%d' % port_num)
28 1
        add_server_methods(self.srv)
29 1
        self.srv.start()
30 1
        self.opc = self.srv
31 1
        self.discovery = Server()
32 1
        self.discovery.set_application_uri("urn:freeopcua:python:discovery")
33 1
        self.discovery.set_endpoint('opc.tcp://localhost:%d' % port_discovery)
34
        self.discovery.start()
35 1
36
    @classmethod
37 1
    def tearDownClass(self):
38 1
        self.srv.stop()
39
        self.discovery.stop()
40 1
41 1
    def test_discovery(self):
42 1
        client = Client(self.discovery.endpoint.geturl())
43 1
        client.connect()
44 1
        try:
45 1
            servers = client.find_servers()
46 1
            new_app_uri = "urn:freeopcua:python:server:test_discovery"
47 1
            self.srv.application_uri = new_app_uri
48 1
            self.srv.register_to_discovery(self.discovery.endpoint.geturl(), 0)
49 1
            time.sleep(0.1) # let server register registration
50 1
            new_servers = client.find_servers()
51 1
            self.assertEqual(len(new_servers) - len(servers) , 1)
52 1
            self.assertFalse(new_app_uri in [s.ApplicationUri for s in servers])
53
            self.assertTrue(new_app_uri in [s.ApplicationUri for s in new_servers])
54 1
        finally:
55
            client.disconnect()
56 1
57 1
    def test_find_servers2(self):
58 1
        client = Client(self.discovery.endpoint.geturl())
59 1
        client.connect()
60 1
        try:
61 1
            servers = client.find_servers()
62 1
            new_app_uri1 = "urn:freeopcua:python:server:test_discovery1"
63 1
            self.srv.application_uri = new_app_uri1
64 1
            self.srv.register_to_discovery(self.discovery.endpoint.geturl(), period=0)
65 1
            new_app_uri2 = "urn:freeopcua:python:test_discovery2"
66 1
            self.srv.application_uri = new_app_uri2
67 1
            self.srv.register_to_discovery(self.discovery.endpoint.geturl(), period=0)
68 1
            time.sleep(0.1) # let server register registration
69 1
            new_servers = client.find_servers()
70 1
            self.assertEqual(len(new_servers) - len(servers) , 2)
71 1
            self.assertFalse(new_app_uri1 in [s.ApplicationUri for s in servers])
72 1
            self.assertFalse(new_app_uri2 in [s.ApplicationUri for s in servers])
73 1
            self.assertTrue(new_app_uri1 in [s.ApplicationUri for s in new_servers])
74
            self.assertTrue(new_app_uri2 in [s.ApplicationUri for s in new_servers])
75 1
            # now do a query with filer
76 1
            new_servers = client.find_servers(["urn:freeopcua:python:server"])
77 1
            self.assertEqual(len(new_servers) - len(servers) , 0)
78 1
            self.assertTrue(new_app_uri1 in [s.ApplicationUri for s in new_servers])
79
            self.assertFalse(new_app_uri2 in [s.ApplicationUri for s in new_servers])
80 1
            # now do a query with filer
81 1
            new_servers = client.find_servers(["urn:freeopcua:python"])
82 1
            self.assertEqual(len(new_servers) - len(servers) , 2)
83 1
            self.assertTrue(new_app_uri1 in [s.ApplicationUri for s in new_servers])
84
            self.assertTrue(new_app_uri2 in [s.ApplicationUri for s in new_servers])
85 1
        finally:
86
            client.disconnect()
87
88
89
    """
90
    # not sure if this test is necessary, and there is a lot repetition with previous test
91
    def test_discovery_server_side(self):
92
        servers = self.discovery.find_servers()
93
        self.assertEqual(len(servers), 1)
94
        self.srv.register_to_discovery(self.discovery.endpoint.geturl(), 1)
95
        time.sleep(1) # let server register registration
96
        servers = self.discovery.find_servers()
97
        print("SERVERS 2", servers)
98
        self.assertEqual(len(servers), 2)
99
    """
100
    #def test_register_server2(self):
101
        #servers = self.opc.register_server()
102 1
103 1
    def test_register_namespace(self):
104 1
        uri = 'http://mycustom.Namespace.com'
105 1
        idx1 = self.opc.register_namespace(uri)
106 1
        idx2 = self.opc.get_namespace_index(uri)
107
        self.assertEqual(idx1, idx2)
108 1
109 1
    def test_register_use_namespace(self):
110 1
        uri = 'http://my_very_custom.Namespace.com'
111 1
        idx = self.opc.register_namespace(uri)
112 1
        root = self.opc.get_root_node()
113 1
        myvar = root.add_variable(idx, 'var_in_custom_namespace', [5])
114 1
        myid = myvar.nodeid
115
        self.assertEqual(idx, myid.NamespaceIndex)
116 1
117 1
    def test_server_method(self):
118 1
        def func(parent, variant):
119 1
            variant.Value *= 2
120 1
            return [variant]
121 1
        o = self.opc.get_objects_node()
122 1
        v = o.add_method(3, 'Method1', func, [ua.VariantType.Int64], [ua.VariantType.Int64])
123 1
        result = o.call_method(v, ua.Variant(2.1))
124
        self.assertEqual(result, 4.2)
125 1
126 1
    def test_xml_import(self):
127 1
        self.srv.import_xml("tests/custom_nodes.xml")
128 1
        o = self.opc.get_objects_node()
129 1
        v = o.get_child(["MyXMLFolder", "MyXMLObject", "MyXMLVariable"])
130 1
        val = v.get_value()
131
        self.assertEqual(val, "StringValue")
132 1
133 1
    def test_historize_variable(self):
134 1
        o = self.opc.get_objects_node()
135 1
        var = o.add_variable(3, "test_hist", 1.0)
136 1
        self.srv.iserver.enable_history_data_change(var, timedelta(days=1))
137 1
        time.sleep(1)
138 1
        var.set_value(2.0)
139 1
        var.set_value(3.0)
140
        self.srv.iserver.disable_history_data_change(var)
141 1
142 1
    def test_historize_events(self):
143 1
        srv_node = self.srv.get_node(ua.ObjectIds.Server)
144 1
        srvevgen = self.srv.get_event_generator()
145 1
        self.srv.iserver.enable_history_event(srv_node, period=None)
146 1
        srvevgen.trigger(message="Message")
147
        self.srv.iserver.disable_history_event(srv_node)
148 1
149 1
    def test_references_for_added_nodes_method(self):
150 1
        objects = self.opc.get_objects_node()
151 1
        o = objects.add_object(3, 'MyObject')
152 1
        nodes = objects.get_referenced_nodes(refs=ua.ObjectIds.Organizes, direction=ua.BrowseDirection.Forward, includesubtypes=False)
153 1
        self.assertTrue(o in nodes)
154 1
        nodes = o.get_referenced_nodes(refs=ua.ObjectIds.Organizes, direction=ua.BrowseDirection.Inverse, includesubtypes=False)
155 1
        self.assertTrue(objects in nodes)
156 1
        self.assertEqual(o.get_parent(), objects)
157
        self.assertEqual(o.get_type_definition(), ua.ObjectIds.BaseObjectType)
158 1
159
        @uamethod
160
        def callback(parent):
161
            return
162 1
163 1
        m = o.add_method(3, 'MyMethod', callback)
164 1
        nodes = o.get_referenced_nodes(refs=ua.ObjectIds.HasComponent, direction=ua.BrowseDirection.Forward, includesubtypes=False)
165 1
        self.assertTrue(m in nodes)
166 1
        nodes = m.get_referenced_nodes(refs=ua.ObjectIds.HasComponent, direction=ua.BrowseDirection.Inverse, includesubtypes=False)
167 1 View Code Duplication
        self.assertTrue(o in nodes)
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
168
        self.assertEqual(m.get_parent(), o)
169
170 1
    # This should work for following BaseEvent tests to work (maybe to write it a bit differentlly since they are not independent)
171 1
    def test_get_event_from_type_node_BaseEvent(self):
172 1
        ev = opcua.server.event.get_event_from_type_node(opcua.Node(self.opc.iserver.isession, ua.NodeId(ua.ObjectIds.BaseEventType)))
173
        check_base_event(self, ev)
174 1
175 1
    def test_get_event_from_type_node_Inhereted_AuditEvent(self):
176 1
        ev = opcua.server.event.get_event_from_type_node(opcua.Node(self.opc.iserver.isession, ua.NodeId(ua.ObjectIds.AuditEventType)))
177 1
        self.assertIsNot(ev, None)  # we did not receive event
178 1
        self.assertIsInstance(ev, ua.BaseEvent)
179 1
        self.assertIsInstance(ev, ua.AuditEvent)
180 1
        self.assertEqual(ev.EventType, ua.NodeId(ua.ObjectIds.AuditEventType))
181 1
        self.assertEqual(ev.Severity, ua.Variant(1, ua.VariantType.UInt16))
182 1
        self.assertEqual(ev.ActionTimeStamp, None)
183 1
        self.assertEqual(ev.Status, False)
184 1
        self.assertEqual(ev.ServerId, None)
185 1
        self.assertEqual(ev.ClientAuditEntryId, None)
186 1
        self.assertEqual(ev.ClientUserId, None)
187
        self.assertEqual(ev._freeze, True)
188 1
189 1
    def test_eventgenerator_default(self):
190 1
        evgen = self.opc.get_event_generator()
191 1
        check_eventgenerator_BaseEvent(self, evgen)
192
        check_eventgenerator_SourceServer(self, evgen)
193 1
194 1
    def test_eventgenerator_BaseEvent_object(self):
195 1
        evgen = self.opc.get_event_generator(ua.BaseEvent())
196 1
        check_eventgenerator_BaseEvent(self, evgen)
197
        check_eventgenerator_SourceServer(self, evgen)
198 1
199 1
    def test_eventgenerator_BaseEvent_Node(self):
200 1
        evgen = self.opc.get_event_generator(opcua.Node(self.opc.iserver.isession, ua.NodeId(ua.ObjectIds.BaseEventType)))
201 1
        check_eventgenerator_BaseEvent(self, evgen)
202
        check_eventgenerator_SourceServer(self, evgen)
203 1
204 1
    def test_eventgenerator_BaseEvent_NodeId(self):
205 1
        evgen = self.opc.get_event_generator(ua.NodeId(ua.ObjectIds.BaseEventType))
206 1
        check_eventgenerator_BaseEvent(self, evgen)
207
        check_eventgenerator_SourceServer(self, evgen)
208 1
209 1
    def test_eventgenerator_BaseEvent_ObjectIds(self):
210 1
        evgen = self.opc.get_event_generator(ua.ObjectIds.BaseEventType)
211 1
        check_eventgenerator_BaseEvent(self, evgen)
212
        check_eventgenerator_SourceServer(self, evgen)
213 1
214 1
    def test_eventgenerator_BaseEvent_Identifier(self):
215 1
        evgen = self.opc.get_event_generator(2041)
216 1
        check_eventgenerator_BaseEvent(self, evgen)
217
        check_eventgenerator_SourceServer(self, evgen)
218 1
219 1
    def test_eventgenerator_sourceServer_Node(self):
220 1
        evgen = self.opc.get_event_generator(source=opcua.Node(self.opc.iserver.isession, ua.NodeId(ua.ObjectIds.Server)))
221 1
        check_eventgenerator_BaseEvent(self, evgen)
222
        check_eventgenerator_SourceServer(self, evgen)
223 1
224 1
    def test_eventgenerator_sourceServer_NodeId(self):
225 1
        evgen = self.opc.get_event_generator(source=ua.NodeId(ua.ObjectIds.Server))
226 1
        check_eventgenerator_BaseEvent(self, evgen)
227
        check_eventgenerator_SourceServer(self, evgen)
228 1
229 1
    def test_eventgenerator_sourceServer_ObjectIds(self):
230 1
        evgen = self.opc.get_event_generator(source=ua.ObjectIds.Server)
231 1
        check_eventgenerator_BaseEvent(self, evgen)
232
        check_eventgenerator_SourceServer(self, evgen)
233 1
234 1
    def test_eventgenerator_sourceMyObject(self):
235 1
        objects = self.opc.get_objects_node()
236 1
        o = objects.add_object(3, 'MyObject')
237 1
        evgen = self.opc.get_event_generator(source=o)
238 1
        check_eventgenerator_BaseEvent(self, evgen)
239
        check_event_generator_object(self, evgen, o)
240 1
241 1 View Code Duplication
    def test_eventgenerator_source_collision(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
242 1
        objects = self.opc.get_objects_node()
243 1
        o = objects.add_object(3, 'MyObject')
244 1
        event = ua.BaseEvent(sourcenode=o.nodeid)
245 1
        evgen = self.opc.get_event_generator(event, ua.ObjectIds.Server)
246 1
        check_eventgenerator_BaseEvent(self, evgen)
247
        check_event_generator_object(self, evgen, o)
248 1
249 1
    def test_eventgenerator_InheritedEvent(self):
250 1
        evgen = self.opc.get_event_generator(ua.ObjectIds.AuditEventType)
251
        check_eventgenerator_SourceServer(self, evgen)
252 1
253 1
        ev = evgen.event
254 1
        self.assertIsNot(ev, None)  # we did not receive event
255 1
        self.assertIsInstance(ev, ua.BaseEvent)
256 1
        self.assertIsInstance(ev, ua.AuditEvent)
257 1
        self.assertEqual(ev.EventType, ua.NodeId(ua.ObjectIds.AuditEventType))
258 1
        self.assertEqual(ev.Severity, ua.Variant(1, ua.VariantType.UInt16))
259 1
        self.assertEqual(ev.ActionTimeStamp, None)
260 1
        self.assertEqual(ev.Status, False)
261 1
        self.assertEqual(ev.ServerId, None)
262 1
        self.assertEqual(ev.ClientAuditEntryId, None)
263 1
        self.assertEqual(ev.ClientUserId, None)
264
        self.assertEqual(ev._freeze, True)
265 1
266 1
    def test_create_custom_event_type_ObjectId(self):
267 1
        etype = self.opc.create_custom_event_type(2, 'MyEvent', ua.ObjectIds.BaseEventType, [('PropertyNum', ua.VariantType.Float), ('PropertyString', ua.VariantType.String)])
268
        check_custom_event_type(self, etype)
269 1
270 1
    def test_create_custom_event_type_NodeId(self):
271 1
        etype = self.opc.create_custom_event_type(2, 'MyEvent', ua.NodeId(ua.ObjectIds.BaseEventType), [('PropertyNum', ua.VariantType.Float), ('PropertyString', ua.VariantType.String)])
272
        check_custom_event_type(self, etype)
273 1
274 1
    def test_create_custom_event_type_Node(self):
275 1
        etype = self.opc.create_custom_event_type(2, 'MyEvent', opcua.Node(self.opc.iserver.isession, ua.NodeId(ua.ObjectIds.BaseEventType)), [('PropertyNum', ua.VariantType.Float), ('PropertyString', ua.VariantType.String)])
276
        check_custom_event_type(self, etype)
277 1
278 1 View Code Duplication
    def test_get_event_from_type_node_CustomEvent(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
279
        etype = self.opc.create_custom_event_type(2, 'MyEvent', ua.ObjectIds.BaseEventType, [('PropertyNum', ua.VariantType.Float), ('PropertyString', ua.VariantType.String)])
280 1
281 1
        ev = opcua.server.event.get_event_from_type_node(etype)
282 1
        check_custom_event(self, ev, etype)
283 1
        self.assertEqual(ev.PropertyNum, None)
284
        self.assertEqual(ev.PropertyString, None)
285 1
286 1
    def test_eventgenerator_customEvent(self):
287
        etype = self.opc.create_custom_event_type(2, 'MyEvent', ua.ObjectIds.BaseEventType, [('PropertyNum', ua.VariantType.Float), ('PropertyString', ua.VariantType.String)])
288 1
289 1
        evgen = self.opc.get_event_generator(etype, ua.ObjectIds.Server)
290 1
        check_eventgenerator_CustomEvent(self, evgen, etype)
291
        check_eventgenerator_SourceServer(self, evgen)
292 1
293 1
        self.assertEqual(evgen.event.PropertyNum, None)
294
        self.assertEqual(evgen.event.PropertyString, None)
295 1
296 1
    def test_eventgenerator_double_customEvent(self):
297
        event1 = self.opc.create_custom_event_type(3, 'MyEvent1', ua.ObjectIds.BaseEventType, [('PropertyNum', ua.VariantType.Float), ('PropertyString', ua.VariantType.String)])
298 1
299
        event2 = self.opc.create_custom_event_type(4, 'MyEvent2', event1, [('PropertyBool', ua.VariantType.Boolean), ('PropertyInt', ua.VariantType.Int32)])
300 1
301 1
        evgen = self.opc.get_event_generator(event2, ua.ObjectIds.Server)
302 1
        check_eventgenerator_CustomEvent(self, evgen, event2)
303
        check_eventgenerator_SourceServer(self, evgen)
304
305 1 View Code Duplication
        # Properties from MyEvent1
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
306 1
        self.assertEqual(evgen.event.PropertyNum, None)
307
        self.assertEqual(evgen.event.PropertyString, None)
308
309 1
         # Properties from MyEvent2
310 1
        self.assertEqual(evgen.event.PropertyBool, None)
311
        self.assertEqual(evgen.event.PropertyInt, None)
312 1
313 1
    def test_eventgenerator_customEvent_MyObject(self):
314 1
        objects = self.opc.get_objects_node()
315 1
        o = objects.add_object(3, 'MyObject')
316
        etype = self.opc.create_custom_event_type(2, 'MyEvent', ua.ObjectIds.BaseEventType, [('PropertyNum', ua.VariantType.Float), ('PropertyString', ua.VariantType.String)])
317 1
318 1
        evgen = self.opc.get_event_generator(etype, o)
319 1
        check_eventgenerator_CustomEvent(self, evgen, etype)
320
        check_event_generator_object(self, evgen, o)
321 1
322 1
        self.assertEqual(evgen.event.PropertyNum, None)
323
        self.assertEqual(evgen.event.PropertyString, None)
324
325 1
326 1 View Code Duplication
def check_eventgenerator_SourceServer(test, evgen):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
327 1
    server = test.opc.get_server_node()
328 1
    test.assertEqual(evgen.event.SourceName, server.get_browse_name().Name)
329 1
    test.assertEqual(evgen.event.SourceNode, ua.NodeId(ua.ObjectIds.Server))
330 1
    test.assertEqual(server.get_attribute(ua.AttributeIds.EventNotifier).Value, ua.Variant(1, ua.VariantType.Byte))
331 1
    refs = server.get_referenced_nodes(ua.ObjectIds.GeneratesEvent, ua.BrowseDirection.Forward, ua.NodeClass.ObjectType, False)
332
    test.assertGreaterEqual(len(refs), 1)
333
334 1
335 1 View Code Duplication
def check_event_generator_object(test, evgen, obj):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
336 1
    test.assertEqual(evgen.event.SourceName, obj.get_browse_name().Name)
337 1
    test.assertEqual(evgen.event.SourceNode, obj.nodeid)
338 1
    test.assertEqual(obj.get_attribute(ua.AttributeIds.EventNotifier).Value, ua.Variant(1, ua.VariantType.Byte))
339 1
    refs = obj.get_referenced_nodes(ua.ObjectIds.GeneratesEvent, ua.BrowseDirection.Forward, ua.NodeClass.ObjectType, False)
340 1
    test.assertEqual(len(refs), 1)
341
    test.assertEqual(refs[0].nodeid, evgen.event.EventType)
342
343 1
344 1
def check_eventgenerator_BaseEvent(test, evgen):
345 1
    test.assertIsNot(evgen, None)  # we did not receive event generator
346 1
    test.assertIs(evgen.isession, test.opc.iserver.isession)
347
    check_base_event(test, evgen.event)
348
349 1
350 1
def check_base_event(test, ev):
351 1
    test.assertIsNot(ev, None)  # we did not receive event
352 1
    test.assertIsInstance(ev, ua.BaseEvent)
353 1
    test.assertEqual(ev.EventType, ua.NodeId(ua.ObjectIds.BaseEventType))
354 1
    test.assertEqual(ev.Severity, ua.Variant(1, ua.VariantType.UInt16))
355
    test.assertEqual(ev._freeze, True)
356
357 1
358 1
def check_eventgenerator_CustomEvent(test, evgen, etype):
359 1
    test.assertIsNot(evgen, None)  # we did not receive event generator
360 1
    test.assertIs(evgen.isession, test.opc.iserver.isession)
361
    check_custom_event(test, evgen.event, etype)
362
363 1
364 1
def check_custom_event(test, ev, etype):
365 1
    test.assertIsNot(ev, None)  # we did not receive event
366 1
    test.assertIsInstance(ev, ua.BaseEvent)
367 1
    test.assertEqual(ev.EventType, etype.nodeid)
368 1
    test.assertEqual(ev.Severity, ua.Variant(1, ua.VariantType.UInt16))
369
    test.assertEqual(ev._freeze, True)
370
371 1
372 1
def check_custom_event_type(test, ev):
373 1
    base = opcua.Node(test.opc.iserver.isession, ua.NodeId(ua.ObjectIds.BaseEventType))
374 1
    test.assertTrue(ev in base.get_children())
375 1
    nodes = ev.get_referenced_nodes(refs=ua.ObjectIds.HasSubtype, direction=ua.BrowseDirection.Inverse, includesubtypes=False)
376 1
    test.assertEqual(base, nodes[0])
377 1
    properties = ev.get_properties()
378 1
    test.assertIsNot(properties, None)
379 1
    test.assertEqual(len(properties), 2)
380 1
    test.assertTrue(ev.get_child("2:PropertyNum") in properties)
381 1
    test.assertEqual(ev.get_child("2:PropertyNum").get_data_value().Value.VariantType, ua.VariantType.Float)
382 1
    test.assertTrue(ev.get_child("2:PropertyString") in properties)
383
    test.assertEqual(ev.get_child("2:PropertyString").get_data_value().Value.VariantType, ua.VariantType.String)
384