Completed
Pull Request — master (#133)
by Denis
02:49
created

TestServer.test_discovery()   A

Complexity

Conditions 1

Size

Total Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 14
CRAP Score 1
Metric Value
cc 1
dl 0
loc 15
rs 9.4285
ccs 14
cts 14
cp 1
crap 1
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
from opcua import Server
7 1
from opcua import Client
8 1
from opcua import ua
9
10
11 1
port_num = 485140
12 1
port_discovery = 48550
13
14
15 1
class TestServer(unittest.TestCase, CommonTests):
16
17
    '''
18
    Run common tests on server side
19
    Tests that can only be run on server side must be defined here
20
    '''
21 1
    @classmethod
22
    def setUpClass(self):
23 1
        self.srv = Server()
24 1
        self.srv.set_endpoint('opc.tcp://localhost:%d' % port_num)
25 1
        add_server_methods(self.srv)
26 1
        self.srv.start()
27 1
        self.opc = self.srv
28 1
        self.discovery = Server()
29 1
        self.discovery.set_application_uri("urn:freeopcua:python:discovery")
30 1
        self.discovery.set_endpoint('opc.tcp://localhost:%d' % port_discovery)
31 1
        self.discovery.start()
32
33 1
    @classmethod
34
    def tearDownClass(self):
35 1
        self.srv.stop()
36 1
        self.discovery.stop()
37
38 1
    def test_discovery(self):
39 1
        client = Client(self.discovery.endpoint.geturl())
40 1
        client.connect()
41 1
        try:
42 1
            servers = client.find_servers()
43 1
            new_app_uri = "urn:freeopcua:python:server:test_discovery"
44 1
            self.srv.application_uri = new_app_uri
45 1
            self.srv.register_to_discovery(self.discovery.endpoint.geturl(), 0)
46 1
            time.sleep(0.1) # let server register registration
47 1
            new_servers = client.find_servers()
48 1
            self.assertEqual(len(new_servers) - len(servers) , 1)
49 1
            self.assertFalse(new_app_uri in [s.ApplicationUri for s in servers])
50 1
            self.assertTrue(new_app_uri in [s.ApplicationUri for s in new_servers])
51
        finally:
52 1
            client.disconnect()
53
54 1
    def test_find_servers2(self):
55 1
        client = Client(self.discovery.endpoint.geturl())
56 1
        client.connect()
57 1
        try:
58 1
            servers = client.find_servers()
59 1
            new_app_uri1 = "urn:freeopcua:python:server:test_discovery1"
60 1
            self.srv.application_uri = new_app_uri1
61 1
            self.srv.register_to_discovery(self.discovery.endpoint.geturl(), period=0)
62 1
            new_app_uri2 = "urn:freeopcua:python:test_discovery2"
63 1
            self.srv.application_uri = new_app_uri2
64 1
            self.srv.register_to_discovery(self.discovery.endpoint.geturl(), period=0)
65 1
            time.sleep(0.1) # let server register registration
66 1
            new_servers = client.find_servers()
67 1
            self.assertEqual(len(new_servers) - len(servers) , 2)
68 1
            self.assertFalse(new_app_uri1 in [s.ApplicationUri for s in servers])
69 1
            self.assertFalse(new_app_uri2 in [s.ApplicationUri for s in servers])
70 1
            self.assertTrue(new_app_uri1 in [s.ApplicationUri for s in new_servers])
71 1
            self.assertTrue(new_app_uri2 in [s.ApplicationUri for s in new_servers])
72
            # now do a query with filer
73 1
            new_servers = client.find_servers(["urn:freeopcua:python:server"])
74 1
            self.assertEqual(len(new_servers) - len(servers) , 0)
75 1
            self.assertTrue(new_app_uri1 in [s.ApplicationUri for s in new_servers])
76 1
            self.assertFalse(new_app_uri2 in [s.ApplicationUri for s in new_servers])
77
            # now do a query with filer
78 1
            new_servers = client.find_servers(["urn:freeopcua:python"])
79 1
            self.assertEqual(len(new_servers) - len(servers) , 2)
80 1
            self.assertTrue(new_app_uri1 in [s.ApplicationUri for s in new_servers])
81 1
            self.assertTrue(new_app_uri2 in [s.ApplicationUri for s in new_servers])
82
        finally:
83 1
            client.disconnect()
84
85
86
    """
87
    # not sure if this test is necessary, and there is a lot repetition with previous test
88
    def test_discovery_server_side(self):
89
        servers = self.discovery.find_servers()
90
        self.assertEqual(len(servers), 1)
91
        self.srv.register_to_discovery(self.discovery.endpoint.geturl(), 1)
92
        time.sleep(1) # let server register registration
93
        servers = self.discovery.find_servers()
94
        print("SERVERS 2", servers)
95
        self.assertEqual(len(servers), 2)
96
    """
97
    #def test_register_server2(self):
98
        #servers = self.opc.register_server()
99
100 1
    def test_register_namespace(self):
101 1
        uri = 'http://mycustom.Namespace.com'
102 1
        idx1 = self.opc.register_namespace(uri)
103 1
        idx2 = self.opc.get_namespace_index(uri)
104 1
        self.assertEqual(idx1, idx2)
105
106 1
    def test_register_use_namespace(self):
107 1
        uri = 'http://my_very_custom.Namespace.com'
108 1
        idx = self.opc.register_namespace(uri)
109 1
        root = self.opc.get_root_node()
110 1
        myvar = root.add_variable(idx, 'var_in_custom_namespace', [5])
111 1
        myid = myvar.nodeid
112 1
        self.assertEqual(idx, myid.NamespaceIndex)
113
114 1
    def test_server_method(self):
115 1
        def func(parent, variant):
116 1
            variant.Value *= 2
117 1
            return [variant]
118 1
        o = self.opc.get_objects_node()
119 1
        v = o.add_method(3, 'Method1', func, [ua.VariantType.Int64], [ua.VariantType.Int64])
120 1
        result = o.call_method(v, ua.Variant(2.1))
121 1
        self.assertEqual(result, 4.2)
122
123 1
    def test_events(self):
124 1
        msclt = MySubHandler()
125 1
        sub = self.opc.create_subscription(100, msclt)
126 1
        handle = sub.subscribe_events()
127
128 1
        event = self.opc.get_event_object()
129 1
        event.Severity = 500
130 1
        msg = b"this is my msg "
131 1
        tid = datetime.utcnow()
132 1
        event.fill_fields(tid, msg)
133 1
        self.opc.trigger_event(event)
134
135 1
        event = msclt.future.result()
136 1
        self.assertIsNot(event, None)  # we did not receive event
137 1
        self.assertEqual(event.SourceNode, self.opc.get_server_node().nodeid)
138 1
        self.assertEqual(event.Message.Text, msg)
139 1
        self.assertEqual(event.Time, tid)
140 1
        self.assertEqual(event.Severity, 500)
141
142
        # time.sleep(0.1)
143 1
        sub.unsubscribe(handle)
144 1
        sub.delete()
145
146 1
    def test_xml_import(self):
147 1
        self.srv.import_xml("tests/custom_nodes.xml")
148 1
        o = self.opc.get_objects_node()
149 1
        v = o.get_child(["MyXMLFolder", "MyXMLObject", "MyXMLVariable"])
150 1
        val = v.get_value()
151 1
        self.assertEqual(val, "StringValue")
152
153 1
    def test_historize(self):
154 1
        o = self.opc.get_objects_node()
155 1
        var = o.add_variable(3, "test_hist", 1.0)
156 1
        self.srv.iserver.enable_history(var, timedelta(days=1))
157 1
        time.sleep(1)
158 1
        var.set_value(2.0)
159 1
        var.set_value(3.0)
160 1
        self.srv.iserver.disable_history(var)
161
162
163
164