4
4
import time
5
5
from threading import Event , Thread
6
6
from queue import Queue
7
+ from concurrent .futures import ThreadPoolExecutor
7
8
8
9
9
10
from simvue .factory .dispatch .queued import QueuedDispatcher
12
13
13
14
# FIXME: Update the layout of these tests
14
15
16
+
15
17
@pytest .mark .dispatch
18
+ @pytest .mark .parametrize ("overload_buffer" , (True , False ), ids = ("overload" , "normal" ))
16
19
@pytest .mark .parametrize (
17
- "overload_buffer" , (True , False ),
18
- ids = ("overload" , "normal" )
19
- )
20
- @pytest .mark .parametrize (
21
- "append_during_dispatch" , (True , False ),
22
- ids = ("pre_append" , "append" )
20
+ "append_during_dispatch" , (True , False ), ids = ("pre_append" , "append" )
23
21
)
24
22
@pytest .mark .parametrize ("multiple" , (True , False ), ids = ("multiple" , "single" ))
25
- def test_queued_dispatcher (overload_buffer : bool , multiple : bool , append_during_dispatch : bool ) -> None :
23
+ def test_queued_dispatcher (
24
+ overload_buffer : bool , multiple : bool , append_during_dispatch : bool
25
+ ) -> None :
26
26
buffer_size : int = 10
27
27
n_elements : int = 2 * buffer_size if overload_buffer else buffer_size - 1
28
28
max_read_rate : float = 0.2
@@ -42,24 +42,39 @@ def test_queued_dispatcher(overload_buffer: bool, multiple: bool, append_during_
42
42
43
43
for variable in variables :
44
44
check_dict [variable ] = {"counter" : 0 }
45
- def callback (___ : list [typing .Any ], _ : str , args = check_dict , var = variable ) -> None :
45
+
46
+ def callback (
47
+ ___ : list [typing .Any ], _ : str , args = check_dict , var = variable
48
+ ) -> None :
46
49
args [var ]["counter" ] += 1
50
+
47
51
dispatchers .append (
48
- QueuedDispatcher (callback , [variable ], event , max_buffer_size = buffer_size , max_read_rate = max_read_rate )
52
+ QueuedDispatcher (
53
+ callback ,
54
+ [variable ],
55
+ event ,
56
+ max_buffer_size = buffer_size ,
57
+ max_read_rate = max_read_rate ,
58
+ name = f"Queued_Dispatcher_{ variable } "
59
+ )
49
60
)
50
61
51
62
if not append_during_dispatch :
52
63
for i in range (n_elements ):
53
- for variable , dispatcher in zip (variables , dispatchers ):
54
- dispatcher .add_item ({string .ascii_uppercase [i % 26 ]: i }, variable , False )
64
+ for variable , dispatcher in zip (variables , dispatchers ):
65
+ dispatcher .add_item (
66
+ {string .ascii_uppercase [i % 26 ]: i }, variable , False
67
+ )
55
68
56
69
for dispatcher in dispatchers :
57
70
dispatcher .start ()
58
71
59
72
if append_during_dispatch :
60
73
for i in range (n_elements ):
61
- for variable , dispatcher in zip (variables , dispatchers ):
62
- dispatcher .add_item ({string .ascii_uppercase [i % 26 ]: i }, variable , False )
74
+ for variable , dispatcher in zip (variables , dispatchers ):
75
+ dispatcher .add_item (
76
+ {string .ascii_uppercase [i % 26 ]: i }, variable , False
77
+ )
63
78
64
79
while not dispatcher .empty :
65
80
time .sleep (0.1 )
@@ -70,7 +85,9 @@ def callback(___: list[typing.Any], _: str, args=check_dict, var=variable) -> No
70
85
time .sleep (0.1 )
71
86
72
87
for variable in variables :
73
- assert check_dict [variable ]["counter" ] >= (2 if overload_buffer else 1 ), f"Check of counter for dispatcher '{ variable } ' failed with count = { check_dict [variable ]['counter' ]} "
88
+ assert check_dict [variable ]["counter" ] >= (2 if overload_buffer else 1 ), (
89
+ f"Check of counter for dispatcher '{ variable } ' failed with count = { check_dict [variable ]['counter' ]} "
90
+ )
74
91
assert time .time () - start_time < time_threshold
75
92
76
93
@@ -86,33 +103,48 @@ def test_nested_queued_dispatch(multi_queue: bool) -> None:
86
103
result_queue = Queue ()
87
104
88
105
event = Event ()
106
+
89
107
def create_callback (index ):
90
- def callback (___ : list [typing .Any ], _ : str , check_dict = check_dict [index ]) -> None :
108
+ def callback (
109
+ ___ : list [typing .Any ], _ : str , check_dict = check_dict [index ]
110
+ ) -> None :
91
111
check_dict ["counter" ] += 1
112
+
92
113
return callback
93
- def _main (res_queue , index , dispatch_callback = create_callback , term_event = event , variable = variable ) -> bool :
94
114
115
+ def _main (
116
+ res_queue ,
117
+ index ,
118
+ dispatch_callback = create_callback ,
119
+ term_event = event ,
120
+ variable = variable ,
121
+ ) -> bool :
95
122
term_event = Event ()
96
123
dispatcher = QueuedDispatcher (
97
124
dispatch_callback (index ),
98
125
[variable ] if isinstance (variable , str ) else variable ,
99
126
term_event ,
100
127
max_buffer_size = buffer_size ,
101
- max_read_rate = max_read_rate
128
+ max_read_rate = max_read_rate ,
129
+ name = f"test_nested_queued_dispatch"
102
130
)
103
131
104
132
dispatcher .start ()
105
133
106
134
try :
107
135
for i in range (n_elements ):
108
136
if isinstance (variable , str ):
109
- dispatcher .add_item ({string .ascii_uppercase [i % 26 ]: i }, variable , False )
137
+ dispatcher .add_item (
138
+ {string .ascii_uppercase [i % 26 ]: i }, variable , False
139
+ )
110
140
else :
111
141
for var in variable :
112
- dispatcher .add_item ({string .ascii_uppercase [i % 26 ]: i }, var , False )
113
- except (RuntimeError ):
142
+ dispatcher .add_item (
143
+ {string .ascii_uppercase [i % 26 ]: i }, var , False
144
+ )
145
+ except RuntimeError :
114
146
res_queue .put ("AARGHGHGHGHAHSHGHSDHFSEDHSE" )
115
-
147
+
116
148
time .sleep (0.1 )
117
149
118
150
while not dispatcher .empty :
@@ -127,18 +159,29 @@ def _main(res_queue, index, dispatch_callback=create_callback, term_event=event,
127
159
threads = []
128
160
129
161
for i in range (3 ):
130
- _thread = Thread (target = _main , args = (result_queue , i ,), daemon = True )
162
+ _thread = Thread (
163
+ target = _main ,
164
+ args = (
165
+ result_queue ,
166
+ i ,
167
+ ),
168
+ daemon = True ,
169
+ name = f"nested_queue_dispatch_{ i } _Thread" ,
170
+ )
131
171
_thread .start ()
132
172
threads .append (_thread )
133
-
173
+
134
174
for i in range (3 ):
135
175
threads [i ].join ()
136
176
137
177
if not result_queue .empty ():
138
178
assert False
139
179
140
180
for i in range (3 ):
141
- assert check_dict [i ]["counter" ] >= 2 , f"Check of counter for dispatcher '{ variable } ' failed with count = { check_dict [i ]['counter' ]} "
181
+ assert check_dict [i ]["counter" ] >= 2 , (
182
+ f"Check of counter for dispatcher '{ variable } ' failed with count = { check_dict [i ]['counter' ]} "
183
+ )
184
+
142
185
143
186
def test_queued_dispatch_error_adding_item_after_termination () -> None :
144
187
trigger = Event ()
@@ -148,7 +191,8 @@ def test_queued_dispatch_error_adding_item_after_termination() -> None:
148
191
object_types = ["q" ],
149
192
termination_trigger = trigger ,
150
193
max_buffer_size = 5 ,
151
- max_read_rate = 2
194
+ max_read_rate = 2 ,
195
+ name = "test_queued_dispatch_error_adding_item_after_termination"
152
196
)
153
197
dispatcher .start ()
154
198
@@ -157,14 +201,16 @@ def test_queued_dispatch_error_adding_item_after_termination() -> None:
157
201
with pytest .raises (RuntimeError ):
158
202
dispatcher .add_item ("blah" , "q" , False )
159
203
204
+
160
205
def test_queued_dispatch_error_attempting_to_use_non_existent_queue () -> None :
161
206
trigger = Event ()
162
207
dispatcher = QueuedDispatcher (
163
208
callback = lambda * _ : None ,
164
209
object_types = ["q" ],
165
210
termination_trigger = trigger ,
166
211
max_buffer_size = 5 ,
167
- max_read_rate = 2
212
+ max_read_rate = 2 ,
213
+ name = "test_queued_dispatch_error_attempting_to_use_non_existent_queue"
168
214
)
169
215
dispatcher .start ()
170
216
@@ -194,18 +240,22 @@ def test_direct_dispatcher(multiple: bool) -> None:
194
240
195
241
for variable in variables :
196
242
check_dict [variable ] = {"counter" : 0 }
197
- def callback (___ : list [typing .Any ], _ : str , args = check_dict , var = variable ) -> None :
243
+
244
+ def callback (
245
+ ___ : list [typing .Any ], _ : str , args = check_dict , var = variable
246
+ ) -> None :
198
247
args [var ]["counter" ] += 1
199
- dispatchers .append (
200
- DirectDispatcher (callback , [variable ], event )
201
- )
248
+
249
+ dispatchers .append (DirectDispatcher (callback , [variable ], event ))
202
250
203
251
for i in range (n_elements ):
204
- for variable , dispatcher in zip (variables , dispatchers ):
252
+ for variable , dispatcher in zip (variables , dispatchers ):
205
253
dispatcher .add_item ({string .ascii_uppercase [i % 26 ]: i }, variable )
206
254
207
255
event .set ()
208
256
209
257
for variable in variables :
210
- assert check_dict [variable ]["counter" ] >= 1 , f"Check of counter for dispatcher '{ variable } ' failed with count = { check_dict [variable ]['counter' ]} "
258
+ assert check_dict [variable ]["counter" ] >= 1 , (
259
+ f"Check of counter for dispatcher '{ variable } ' failed with count = { check_dict [variable ]['counter' ]} "
260
+ )
211
261
assert time .time () - start_time < time_threshold
0 commit comments