Completed
Pull Request — master (#161)
by Denis
03:18
created

TestServer.test_eventgenerator_customEvent()   A

Complexity

Conditions 1

Size

Total Lines 9

Duplication

Lines 9
Ratio 100 %

Code Coverage

Tests 0
CRAP Score 2

Importance

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