88import re
99import unittest
1010import uuid
11- import villas .node .binding as b
11+ from villas .node .binding import Node
1212
1313
1414class 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
198213test_node_config = {
199214 "test_node" : {
0 commit comments