Skip to content

Commit 97367ed

Browse files
author
Kevin Vu te Laar
committed
Update tests to match binding changes
Updated function names and evoking syntax. Added test for: - Automatic SamplesArray sizing - `sample_pack()`, `sample_unpack()` accessible via `pack_from()`, `unpack_to` - `samples_detail()` Signed-off-by: Kevin Vu te Laar <vu.te@rwth-aachen.de>
1 parent 8eb5512 commit 97367ed

2 files changed

Lines changed: 124 additions & 118 deletions

File tree

tests/integration/python/test_binding_wrapper.py

Lines changed: 91 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -8,69 +8,62 @@
88
import re
99
import unittest
1010
import uuid
11-
import villas.node.binding as b
11+
from villas.node.binding import Node
1212

1313

1414
class BindingWrapperIntegrationTests(unittest.TestCase):
1515
def setUp(self):
1616
try:
1717
self.config = json.dumps(test_node_config, indent=2)
1818
self.node_uuid = str(uuid.uuid4())
19-
self.test_node = b.node_new(self.config, self.node_uuid)
19+
self.test_node = Node(self.config, self.node_uuid)
2020
except Exception as e:
2121
self.fail(f"new_node err: {e}")
2222

23-
def tearDown(self):
24-
try:
25-
b.node_stop(self.test_node)
26-
b.node_destroy(self.test_node)
27-
except Exception as e:
28-
self.fail(f"node cleanup error: {e}")
29-
3023
def test_activity_changes(self):
3124
try:
32-
b.node_check(self.test_node)
33-
b.node_prepare(self.test_node)
25+
self.test_node.check()
26+
self.test_node.prepare()
3427
# starting twice
35-
self.assertEqual(0, b.node_start(self.test_node))
28+
self.assertEqual(0, self.test_node.start())
3629

3730
# check if the node is running
38-
self.assertTrue(b.node_is_enabled(self.test_node))
31+
self.assertTrue(self.test_node.is_enabled())
3932

4033
# pausing twice
41-
self.assertEqual(0, b.node_pause(self.test_node))
42-
self.assertEqual(-1, b.node_pause(self.test_node))
34+
self.assertEqual(0, self.test_node.pause())
35+
self.assertEqual(-1, self.test_node.pause())
4336

4437
# resuming
45-
self.assertEqual(0, b.node_resume(self.test_node))
38+
self.assertEqual(0, self.test_node.resume())
4639

4740
# stopping twice
48-
self.assertEqual(0, b.node_stop(self.test_node))
49-
self.assertEqual(0, b.node_stop(self.test_node))
41+
self.assertEqual(0, self.test_node.stop())
42+
self.assertEqual(0, self.test_node.stop())
5043

5144
# restarting
52-
b.node_restart(self.test_node)
45+
self.test_node.restart()
5346

5447
# check if everything still works after restarting
55-
b.node_pause(self.test_node)
56-
b.node_resume(self.test_node)
57-
b.node_stop(self.test_node)
58-
b.node_start(self.test_node)
48+
self.test_node.pause()
49+
self.test_node.resume()
50+
self.test_node.stop()
51+
self.test_node.start()
5952
except Exception as e:
6053
self.fail(f" err: {e}")
6154

6255
def test_reverse_node(self):
6356
try:
64-
self.assertEqual(1, b.node_input_signals_max_cnt(self.test_node))
65-
self.assertEqual(0, b.node_output_signals_max_cnt(self.test_node))
57+
self.assertEqual(1, self.test_node.input_signals_max_cnt())
58+
self.assertEqual(0, self.test_node.output_signals_max_cnt())
6659

67-
self.assertEqual(0, b.node_reverse(self.test_node))
60+
self.assertEqual(0, self.test_node.reverse())
6861

6962
# input and output hooks/details are not reversed
7063
# input and output are reversed, can be seen with wireshark and
7164
# function test_rw_socket_and_reverse() below
72-
self.assertEqual(1, b.node_input_signals_max_cnt(self.test_node))
73-
self.assertEqual(0, b.node_output_signals_max_cnt(self.test_node))
65+
self.assertEqual(1, self.test_node.input_signals_max_cnt())
66+
self.assertEqual(0, self.test_node.output_signals_max_cnt())
7467
except Exception as e:
7568
self.fail(f"Reversing node in and output failed: {e}")
7669

@@ -80,23 +73,23 @@ def test_reverse_node(self):
8073
# uuid can not match
8174
def test_config_from_string(self):
8275
try:
83-
config_str = b.node_to_json_str(self.test_node)
76+
config_str = self.test_node.to_json_str()
8477
config_obj = json.loads(config_str)
8578

8679
config_copy_str = json.dumps(config_obj, indent=2)
8780

88-
test_node = b.node_new(config_copy_str)
81+
test_node = Node(config_copy_str)
8982

9083
self.assertEqual(
9184
re.sub(
9285
r"^[^:]+: uuid=[0-9a-fA-F-]+, ",
9386
"",
94-
b.node_name_full(test_node),
87+
test_node.name_full(),
9588
),
9689
re.sub(
9790
r"^[^:]+: uuid=[0-9a-fA-F-]+, ",
9891
"",
99-
b.node_name_full(self.test_node),
92+
self.test_node.name_full(),
10093
),
10194
)
10295
except Exception as e:
@@ -113,87 +106,109 @@ def test_rw_socket_and_reverse(self):
113106
config = json.dumps(obj, indent=2)
114107
id = str(uuid.uuid4())
115108

116-
test_nodes[name] = b.node_new(config, id)
109+
test_nodes[name] = Node(config, id)
117110

118111
for node in test_nodes.values():
119-
if b.node_check(node):
112+
if node.check():
120113
raise RuntimeError("Failed to verify node configuration")
121-
if b.node_prepare(node):
122-
raise RuntimeError(
123-
f"Failed to verify {b.node_name(node)} node config"
124-
)
125-
b.node_start(node)
126-
127-
# Arrays to store samples
128-
send_smpls = b.SamplesArray(1)
129-
intmdt_smpls = b.SamplesArray(100)
130-
recv_smpls = b.SamplesArray(100)
114+
if node.prepare():
115+
raise RuntimeError(f"Failed to verify {node.name()} node config")
116+
node.start()
131117

132118
for i in range(100):
133119
# Generate signals and send over send_socket
120+
self.assertEqual(test_nodes["signal_generator"][i].read_from(2, 1), 1)
134121
self.assertEqual(
135-
b.node_read(test_nodes["signal_generator"], send_smpls, 2, 1),
122+
test_nodes["send_socket"][i].write_to(
123+
test_nodes["signal_generator"], 1
124+
),
136125
1,
137126
)
138-
self.assertEqual(
139-
b.node_write(test_nodes["send_socket"], send_smpls, 1), 1
140-
)
127+
self.assertEqual(test_nodes["signal_generator"].sample_length(0), 2)
141128

142129
# read received signals and send them to recv_socket
130+
self.assertEqual(test_nodes["intmdt_socket"].read_from(2, 100), 100)
143131
self.assertEqual(
144-
b.node_read(test_nodes["intmdt_socket"], intmdt_smpls, 2, 100),
145-
100,
146-
)
147-
self.assertEqual(
148-
b.node_write(test_nodes["intmdt_socket"], intmdt_smpls[0:50], 50),
149-
50,
132+
test_nodes["intmdt_socket"][:30].write_to(
133+
test_nodes["intmdt_socket"], 30
134+
),
135+
30,
150136
)
151137
self.assertEqual(
152-
b.node_write(test_nodes["intmdt_socket"], intmdt_smpls[50:100], 50),
153-
50,
138+
test_nodes["intmdt_socket"][30:].write_to(test_nodes["intmdt_socket"]),
139+
70,
154140
)
141+
# print(len(test_nodes["intmdt_socket"]._smps))
155142

156143
# confirm rev_socket signals
157-
self.assertEqual(
158-
b.node_read(test_nodes["recv_socket"], recv_smpls[0:50], 2, 50),
159-
50,
160-
)
161-
self.assertEqual(
162-
b.node_read(test_nodes["recv_socket"], recv_smpls[50:100], 2, 50),
163-
50,
164-
)
144+
self.assertEqual(test_nodes["recv_socket"].read_from(2, 30), 30)
145+
self.assertEqual(test_nodes["recv_socket"][30].read_from(2, 70), 70)
165146

166147
# reversing in and outputs
167148
# stopping the socket is necessary to clean up buffers
168149
# starting the node again will bind the reversed socket addresses
169150
# this can be confirmed when observing network traffic
170151
# node details do not represent this properly as of now
171152
for node in test_nodes.values():
172-
b.node_reverse(node)
173-
b.node_stop(node)
153+
node.reverse()
154+
node.stop()
174155

175156
for node in test_nodes.values():
176-
b.node_start(node)
157+
node.start()
177158

178-
# if another 50 samples have not been allocated,
179-
# sending 100 at once is impossible with recv_smpls
159+
# if another 30+70 samples are not allocated,
160+
# sending 100 at once is impossible
180161
self.assertEqual(
181-
b.node_write(test_nodes["recv_socket"], recv_smpls, 100), 100
162+
test_nodes["recv_socket"].write_to(test_nodes["recv_socket"], 100),
163+
100,
182164
)
183165
# try writing as full slice
184166
self.assertEqual(
185-
b.node_write(test_nodes["intmdt_socket"], recv_smpls[0:100], 100),
167+
test_nodes["intmdt_socket"][0:100].write_to(
168+
test_nodes["recv_socket"], 100
169+
),
186170
100,
187171
)
188172

189-
# cleanup
190-
for node in test_nodes.values():
191-
b.node_stop(node)
192-
b.node_destroy(node)
193-
194173
except Exception as e:
195174
self.fail(f" err: {e}")
196175

176+
def test_sample_pack_unpack(self):
177+
try:
178+
self.test_node.pack_from(0, [0.01, 1.01, 2.01, 3.01, 4.01])
179+
self.test_node[1].pack_from(
180+
[1.01, 2.01, 3.01, 4.01, 5.01], int(1e9), int(1e9) + 100
181+
)
182+
self.test_node[2].pack_from(42, int(1e9), int(1e9) + 100)
183+
self.test_node[3].pack_from(self.test_node[1], int(1e9), int(1e9) + 100)
184+
self.test_node[2].unpack_to(self.test_node[1], int(1e9), int(1e9) + 100)
185+
self.assertEqual([42.0], self.test_node[1].details()["data"])
186+
self.test_node[0].unpack_to(self.test_node[1], int(2e9), int(2e9) + 100)
187+
self.assertEqual(
188+
[0.01, 1.01, 2.01, 3.01, 4.01],
189+
self.test_node[1].details()["data"],
190+
)
191+
self.test_node[0].unpack_to(self.test_node[2], int(2e9), int(2e9) + 100)
192+
self.test_node[0].unpack_to(self.test_node[4], int(2e9), int(2e9) + 100)
193+
self.test_node[1].unpack_to(self.test_node[2], int(2e9), int(2e9) + 100)
194+
except Exception as e:
195+
self.fail(f"err: {e}")
196+
197+
def test_samplesarray_size(self):
198+
try:
199+
node_config = json.dumps(test_node_config, indent=2)
200+
node_uuid = str(uuid.uuid4())
201+
node = Node(node_config, node_uuid, 100)
202+
self.assertEqual(len(node), 100)
203+
node[199].pack_from(
204+
[1.01, 2.01, 3.01, 4.01, 5.01], int(1e9), int(1e9) + 100
205+
)
206+
self.assertEqual(len(node), 200)
207+
node[199].unpack_to(node[299], int(2e9), int(2e9) + 100)
208+
self.assertEqual(len(node), 300)
209+
except Exception as e:
210+
self.fail(f"err: {e}")
211+
197212

198213
test_node_config = {
199214
"test_node": {

0 commit comments

Comments
 (0)