Completed
Pull Request — master (#161)
by Denis
02:27
created

test_eventgenerator_BaseEvent_ObjectIds()   A

Complexity

Conditions 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 1
c 2
b 0
f 0
dl 0
loc 4
ccs 0
cts 0
cp 0
crap 2
rs 10
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, datetime
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_type_node_BaseEvent(self):
164
        ev = opcua.common.event.get_event_from_type_node(opcua.Node(self.opc.iserver.isession, ua.NodeId(ua.ObjectIds.BaseEventType)))
165
        check_base_event(self, ev)
166
167 View Code Duplication
    def test_get_event_from_type_node_Inhereted_AuditEvent(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
168
        ev = opcua.common.event.get_event_from_type_node(opcua.Node(self.opc.iserver.isession, ua.NodeId(ua.ObjectIds.AuditEventType)))
169
        self.assertIsNot(ev, None)  # we did not receive event
170
        self.assertIsInstance(ev, ua.BaseEvent)
171
        self.assertIsInstance(ev, ua.AuditEvent)
172
        self.assertEqual(ev.EventType, ua.NodeId(ua.ObjectIds.AuditEventType))
173
        self.assertEqual(ev.Severity, ua.Variant(1, ua.VariantType.UInt16))
174
        self.assertEqual(ev.ActionTimeStamp, None)
175
        self.assertEqual(ev.Status, False)
176
        self.assertEqual(ev.ServerId, None)
177
        self.assertEqual(ev.ClientAuditEntryId, None)
178
        self.assertEqual(ev.ClientUserId, None)
179
        self.assertEqual(ev._freeze, True)
180
181
    def test_eventgenerator_default(self):
182
        evgen = self.opc.get_event_generator()
183
        check_eventgenerator_BaseEvent(self, evgen)
184
        check_eventgenerator_SourceServer(self, evgen)
185
186
    def test_eventgenerator_BaseEvent_object(self):
187
        evgen = self.opc.get_event_generator(ua.BaseEvent())
188
        check_eventgenerator_BaseEvent(self, evgen)
189
        check_eventgenerator_SourceServer(self, evgen)
190
191
    def test_eventgenerator_BaseEvent_Node(self):
192
        evgen = self.opc.get_event_generator(opcua.Node(self.opc.iserver.isession, ua.NodeId(ua.ObjectIds.BaseEventType)))
193
        check_eventgenerator_BaseEvent(self, evgen)
194
        check_eventgenerator_SourceServer(self, evgen)
195
196
    def test_eventgenerator_BaseEvent_NodeId(self):
197
        evgen = self.opc.get_event_generator(ua.NodeId(ua.ObjectIds.BaseEventType))
198
        check_eventgenerator_BaseEvent(self, evgen)
199
        check_eventgenerator_SourceServer(self, evgen)
200
201
    def test_eventgenerator_BaseEvent_ObjectIds(self):
202
        evgen = self.opc.get_event_generator(ua.ObjectIds.BaseEventType)
203
        check_eventgenerator_BaseEvent(self, evgen)
204
        check_eventgenerator_SourceServer(self, evgen)
205
206
    def test_eventgenerator_BaseEvent_Identifier(self):
207
        evgen = self.opc.get_event_generator(2041)
208
        check_eventgenerator_BaseEvent(self, evgen)
209
        check_eventgenerator_SourceServer(self, evgen)
210
211
    def test_eventgenerator_sourceServer_Node(self):
212
        evgen = self.opc.get_event_generator(source=opcua.Node(self.opc.iserver.isession, ua.NodeId(ua.ObjectIds.Server)))
213
        check_eventgenerator_BaseEvent(self, evgen)
214
        check_eventgenerator_SourceServer(self, evgen)
215
216
    def test_eventgenerator_sourceServer_NodeId(self):
217
        evgen = self.opc.get_event_generator(source=ua.NodeId(ua.ObjectIds.Server))
218
        check_eventgenerator_BaseEvent(self, evgen)
219
        check_eventgenerator_SourceServer(self, evgen)
220
221
    def test_eventgenerator_sourceServer_ObjectIds(self):
222
        evgen = self.opc.get_event_generator(source=ua.ObjectIds.Server)
223
        check_eventgenerator_BaseEvent(self, evgen)
224
        check_eventgenerator_SourceServer(self, evgen)
225
226
    def test_eventgenerator_sourceMyObject(self):
227
        objects = self.opc.get_objects_node()
228
        o = objects.add_object(3, 'MyObject')
229
        evgen = self.opc.get_event_generator(source=o)
230
        check_eventgenerator_BaseEvent(self, evgen)
231
        self.assertEqual(evgen.event.SourceName, 'MyObject')
232
        self.assertEqual(evgen.event.SourceNode, o.nodeid)
233
        self.assertEqual(o.get_attribute(ua.AttributeIds.EventNotifier).Value, ua.Variant(1, ua.VariantType.Byte))
234
235
    def test_eventgenerator_source_collision(self):
236
        objects = self.opc.get_objects_node()
237
        o = objects.add_object(3, 'MyObject')
238
        event = ua.BaseEvent(sourcenode=o.nodeid)
239
        evgen = self.opc.get_event_generator(event, ua.ObjectIds.Server)
240
        check_eventgenerator_BaseEvent(self, evgen)
241
        self.assertEqual(evgen.event.SourceName, 'MyObject')
242
        self.assertEqual(evgen.event.SourceNode, o.nodeid)
243
        self.assertEqual(o.get_attribute(ua.AttributeIds.EventNotifier).Value, ua.Variant(1, ua.VariantType.Byte))
244
245 View Code Duplication
    def test_eventgenerator_InheritedEvent(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
246
        evgen = self.opc.get_event_generator(ua.ObjectIds.AuditEventType)
247
        check_eventgenerator_SourceServer(self, evgen)
248
249
        ev = evgen.event
250
        self.assertIsNot(ev, None)  # we did not receive event
251
        self.assertIsInstance(ev, ua.BaseEvent)
252
        self.assertIsInstance(ev, ua.AuditEvent)
253
        self.assertEqual(ev.EventType, ua.NodeId(ua.ObjectIds.AuditEventType))
254
        self.assertEqual(ev.Severity, ua.Variant(1, ua.VariantType.UInt16))
255
        self.assertEqual(ev.ActionTimeStamp, None)
256
        self.assertEqual(ev.Status, False)
257
        self.assertEqual(ev.ServerId, None)
258
        self.assertEqual(ev.ClientAuditEntryId, None)
259
        self.assertEqual(ev.ClientUserId, None)
260
        self.assertEqual(ev._freeze, True)
261
262
    def test_create_custom_event_type_ObjectId(self):
263
        etype = self.opc.create_custom_event_type(2, 'MyEvent', ua.ObjectIds.BaseEventType, [('PropertyNum', ua.VariantType.Float), ('PropertyString', ua.VariantType.String)])
264
        check_custom_event_type(self, etype)
265
266
    def test_create_custom_event_type_NodeId(self):
267
        etype = self.opc.create_custom_event_type(2, 'MyEvent', ua.NodeId(ua.ObjectIds.BaseEventType), [('PropertyNum', ua.VariantType.Float), ('PropertyString', ua.VariantType.String)])
268
        check_custom_event_type(self, etype)
269
270
    def test_create_custom_event_type_Node(self):
271
        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)])
272
        check_custom_event_type(self, etype)
273
274
    def test_get_event_from_type_node_CustomEvent(self):
275
        etype = self.opc.create_custom_event_type(2, 'MyEvent', ua.ObjectIds.BaseEventType, [('PropertyNum', ua.VariantType.Float), ('PropertyString', ua.VariantType.String)])
276
277
        ev = opcua.common.event.get_event_from_type_node(etype)
278
        check_custom_event(self, ev, etype)
279
        self.assertEqual(ev.PropertyNum, None)
280
        self.assertEqual(ev.PropertyString, None)
281
282
    def test_eventgenerator_customEvent(self):
283
        etype = self.opc.create_custom_event_type(2, 'MyEvent', ua.ObjectIds.BaseEventType, [('PropertyNum', ua.VariantType.Float), ('PropertyString', ua.VariantType.String)])
284
285
        evgen = self.opc.get_event_generator(etype, ua.ObjectIds.Server)
286
        check_eventgenerator_CustomEvent(self, evgen, etype)
287
        check_eventgenerator_SourceServer(self, evgen)
288
289
        self.assertEqual(evgen.event.PropertyNum, None)
290
        self.assertEqual(evgen.event.PropertyString, None)
291
292
    def test_eventgenerator_double_customEvent(self):
293
        event1 = self.opc.create_custom_event_type(3, 'MyEvent1', ua.ObjectIds.BaseEventType, [('PropertyNum', ua.VariantType.Float), ('PropertyString', ua.VariantType.String)])
294
295
        event2 = self.opc.create_custom_event_type(4, 'MyEvent2', event1, [('PropertyBool', ua.VariantType.Boolean), ('PropertyInt', ua.VariantType.Int32)])
296
297
        evgen = self.opc.get_event_generator(event2, ua.ObjectIds.Server)
298
        check_eventgenerator_CustomEvent(self, evgen, event2)
299
        check_eventgenerator_SourceServer(self, evgen)
300
301
        # Properties from MyEvent1
302
        self.assertEqual(evgen.event.PropertyNum, None)
303
        self.assertEqual(evgen.event.PropertyString, None)
304
305
         # Properties from MyEvent2
306
        self.assertEqual(evgen.event.PropertyBool, None)
307
        self.assertEqual(evgen.event.PropertyInt, None)
308
309
    def test_eventgenerator_customEvent_MyObject(self):
310
        objects = self.opc.get_objects_node()
311
        o = objects.add_object(3, 'MyObject')
312
        etype = self.opc.create_custom_event_type(2, 'MyEvent', ua.ObjectIds.BaseEventType, [('PropertyNum', ua.VariantType.Float), ('PropertyString', ua.VariantType.String)])
313
314
        evgen = self.opc.get_event_generator(etype, o)
315
        check_eventgenerator_CustomEvent(self, evgen, etype)
316
        self.assertEqual(evgen.event.SourceName, 'MyObject')
317
        self.assertEqual(evgen.event.SourceNode, o.nodeid)
318
        self.assertEqual(o.get_attribute(ua.AttributeIds.EventNotifier).Value, ua.Variant(1, ua.VariantType.Byte))
319
320
        self.assertEqual(evgen.event.PropertyNum, None)
321
        self.assertEqual(evgen.event.PropertyString, None)
322
323
324
def check_eventgenerator_SourceServer(test, evgen):
325
    test.assertEqual(evgen.event.SourceName, test.opc.get_server_node().get_display_name().Text)
326
    test.assertEqual(evgen.event.SourceNode, ua.NodeId(ua.ObjectIds.Server))
327
    test.assertEqual(test.opc.get_server_node().get_attribute(ua.AttributeIds.EventNotifier).Value, ua.Variant(1, ua.VariantType.Byte))
328
329
330
def check_eventgenerator_BaseEvent(test, evgen):
331
    test.assertIsNot(evgen, None)  # we did not receive event generator
332
    test.assertIs(evgen.isession, test.opc.iserver.isession)
333
    check_base_event(test, evgen.event)
334
335
336
def check_base_event(test, ev):
337
    test.assertIsNot(ev, None)  # we did not receive event
338
    test.assertIsInstance(ev, ua.BaseEvent)
339
    test.assertEqual(ev.EventType, ua.NodeId(ua.ObjectIds.BaseEventType))
340
    test.assertEqual(ev.Severity, ua.Variant(1, ua.VariantType.UInt16))
341
    test.assertEqual(ev._freeze, True)
342
343
344
def check_eventgenerator_CustomEvent(test, evgen, etype):
345
    test.assertIsNot(evgen, None)  # we did not receive event generator
346
    test.assertIs(evgen.isession, test.opc.iserver.isession)
347
    check_custom_event(test, evgen.event, etype)
348
349
350
def check_custom_event(test, ev, etype):
351
    test.assertIsNot(ev, None)  # we did not receive event
352
    test.assertIsInstance(ev, ua.BaseEvent)
353
    test.assertEqual(ev.EventType, etype.nodeid)
354
    test.assertEqual(ev.Severity, ua.Variant(1, ua.VariantType.UInt16))
355
    test.assertEqual(ev._freeze, True)
356
357
358
def check_custom_event_type(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.assertEqual(ev.get_child("2:PropertyNum").get_data_value().Value.VariantType, ua.VariantType.Float)
368
    test.assertTrue(ev.get_child("2:PropertyString") in properties)
369
    test.assertEqual(ev.get_child("2:PropertyString").get_data_value().Value.VariantType, ua.VariantType.String)
370