@@ -24,14 +24,16 @@ fn init() {
24
24
. try_init ( ) ;
25
25
}
26
26
27
- async fn build_handler < P : ProtocolIdentity > ( ) -> Handler {
28
- let config = ConfigBuilder :: new ( ListenConfig :: default ( ) ) . build ( ) ;
29
- let key = CombinedKey :: generate_secp256k1 ( ) ;
30
- let enr = EnrBuilder :: new ( "v4" )
31
- . ip4 ( Ipv4Addr :: LOCALHOST )
32
- . udp4 ( 9000 )
33
- . build ( & key)
34
- . unwrap ( ) ;
27
+ async fn build_handler < P : ProtocolIdentity > (
28
+ enr : Enr ,
29
+ key : CombinedKey ,
30
+ config : Config ,
31
+ ) -> (
32
+ oneshot:: Sender < ( ) > ,
33
+ mpsc:: UnboundedSender < HandlerIn > ,
34
+ mpsc:: Receiver < HandlerOut > ,
35
+ Handler ,
36
+ ) {
35
37
let mut listen_sockets = SmallVec :: default ( ) ;
36
38
listen_sockets. push ( ( Ipv4Addr :: LOCALHOST , 9000 ) . into ( ) ) ;
37
39
let node_id = enr. node_id ( ) ;
@@ -58,11 +60,11 @@ async fn build_handler<P: ProtocolIdentity>() -> Handler {
58
60
59
61
Socket :: new :: < P > ( socket_config) . await . unwrap ( )
60
62
} ;
61
- let ( _ , service_recv) = mpsc:: unbounded_channel ( ) ;
62
- let ( service_send, _ ) = mpsc:: channel ( 50 ) ;
63
- let ( _ , exit) = oneshot:: channel ( ) ;
63
+ let ( handler_send , service_recv) = mpsc:: unbounded_channel ( ) ;
64
+ let ( service_send, handler_recv ) = mpsc:: channel ( 50 ) ;
65
+ let ( exit_sender , exit) = oneshot:: channel ( ) ;
64
66
65
- Handler {
67
+ let handler = Handler {
66
68
request_retries : config. request_retries ,
67
69
node_id,
68
70
enr : Arc :: new ( RwLock :: new ( enr) ) ,
@@ -81,7 +83,8 @@ async fn build_handler<P: ProtocolIdentity>() -> Handler {
81
83
listen_sockets,
82
84
socket,
83
85
exit,
84
- }
86
+ } ;
87
+ ( exit_sender, handler_send, handler_recv, handler)
85
88
}
86
89
87
90
macro_rules! arc_rw {
@@ -194,47 +197,58 @@ async fn multiple_messages() {
194
197
. udp4 ( sender_port)
195
198
. build ( & key1)
196
199
. unwrap ( ) ;
197
- let sender_listen_config = ListenConfig :: Ipv4 {
198
- ip : sender_enr. ip4 ( ) . unwrap ( ) ,
199
- port : sender_enr. udp4 ( ) . unwrap ( ) ,
200
- } ;
201
- let sender_config = ConfigBuilder :: new ( sender_listen_config) . build ( ) ;
202
200
203
201
let receiver_enr = EnrBuilder :: new ( "v4" )
204
202
. ip4 ( ip)
205
203
. udp4 ( receiver_port)
206
204
. build ( & key2)
207
205
. unwrap ( ) ;
208
- let receiver_listen_config = ListenConfig :: Ipv4 {
209
- ip : receiver_enr. ip4 ( ) . unwrap ( ) ,
210
- port : receiver_enr. udp4 ( ) . unwrap ( ) ,
206
+
207
+ // Build sender handler
208
+ let ( sender_exit, sender_send, mut sender_recv, mut handler) = {
209
+ let sender_listen_config = ListenConfig :: Ipv4 {
210
+ ip : sender_enr. ip4 ( ) . unwrap ( ) ,
211
+ port : sender_enr. udp4 ( ) . unwrap ( ) ,
212
+ } ;
213
+ let sender_config = ConfigBuilder :: new ( sender_listen_config) . build ( ) ;
214
+ build_handler :: < DefaultProtocolId > ( sender_enr. clone ( ) , key1, sender_config) . await
215
+ } ;
216
+ let sender = async move {
217
+ // Start sender handler.
218
+ handler. start :: < DefaultProtocolId > ( ) . await ;
219
+ // After the handler has been terminated test the handler's states.
220
+ assert ! ( handler. pending_requests. is_empty( ) ) ;
221
+ assert_eq ! ( 0 , handler. active_requests. count( ) . await ) ;
222
+ assert ! ( handler. active_challenges. is_empty( ) ) ;
223
+ assert ! ( handler. filter_expected_responses. read( ) . is_empty( ) ) ;
211
224
} ;
212
- let receiver_config = ConfigBuilder :: new ( receiver_listen_config) . build ( ) ;
213
-
214
- let ( _exit_send, sender_handler, mut sender_handler_recv) =
215
- Handler :: spawn :: < DefaultProtocolId > (
216
- arc_rw ! ( sender_enr. clone( ) ) ,
217
- arc_rw ! ( key1) ,
218
- sender_config,
219
- )
220
- . await
221
- . unwrap ( ) ;
222
225
223
- let ( _exit_recv, recv_send, mut receiver_handler) = Handler :: spawn :: < DefaultProtocolId > (
224
- arc_rw ! ( receiver_enr. clone( ) ) ,
225
- arc_rw ! ( key2) ,
226
- receiver_config,
227
- )
228
- . await
229
- . unwrap ( ) ;
226
+ // Build receiver handler
227
+ let ( receiver_exit, receiver_send, mut receiver_recv, mut handler) = {
228
+ let receiver_listen_config = ListenConfig :: Ipv4 {
229
+ ip : receiver_enr. ip4 ( ) . unwrap ( ) ,
230
+ port : receiver_enr. udp4 ( ) . unwrap ( ) ,
231
+ } ;
232
+ let receiver_config = ConfigBuilder :: new ( receiver_listen_config) . build ( ) ;
233
+ build_handler :: < DefaultProtocolId > ( receiver_enr. clone ( ) , key2, receiver_config) . await
234
+ } ;
235
+ let receiver = async move {
236
+ // Start receiver handler.
237
+ handler. start :: < DefaultProtocolId > ( ) . await ;
238
+ // After the handler has been terminated test the handler's states.
239
+ assert ! ( handler. pending_requests. is_empty( ) ) ;
240
+ assert_eq ! ( 0 , handler. active_requests. count( ) . await ) ;
241
+ assert ! ( handler. active_challenges. is_empty( ) ) ;
242
+ assert ! ( handler. filter_expected_responses. read( ) . is_empty( ) ) ;
243
+ } ;
230
244
231
245
let send_message = Box :: new ( Request {
232
246
id : RequestId ( vec ! [ 1 ] ) ,
233
247
body : RequestBody :: Ping { enr_seq : 1 } ,
234
248
} ) ;
235
249
236
250
// sender to send the first message then await for the session to be established
237
- let _ = sender_handler . send ( HandlerIn :: Request (
251
+ let _ = sender_send . send ( HandlerIn :: Request (
238
252
receiver_enr. clone ( ) . into ( ) ,
239
253
send_message. clone ( ) ,
240
254
) ) ;
@@ -253,35 +267,46 @@ async fn multiple_messages() {
253
267
let mut message_count = 0usize ;
254
268
let recv_send_message = send_message. clone ( ) ;
255
269
256
- let sender = async move {
270
+ let sender_ops = async move {
271
+ let mut response_count = 0usize ;
257
272
loop {
258
- match sender_handler_recv . recv ( ) . await {
273
+ match sender_recv . recv ( ) . await {
259
274
Some ( HandlerOut :: Established ( _, _, _) ) => {
260
275
// now the session is established, send the rest of the messages
261
276
for _ in 0 ..messages_to_send - 1 {
262
- let _ = sender_handler . send ( HandlerIn :: Request (
277
+ let _ = sender_send . send ( HandlerIn :: Request (
263
278
receiver_enr. clone ( ) . into ( ) ,
264
279
send_message. clone ( ) ,
265
280
) ) ;
266
281
}
267
282
}
283
+ Some ( HandlerOut :: Response ( _, _) ) => {
284
+ response_count += 1 ;
285
+ if response_count == messages_to_send {
286
+ // Notify the handlers that the message exchange has been completed.
287
+ sender_exit. send ( ( ) ) . unwrap ( ) ;
288
+ receiver_exit. send ( ( ) ) . unwrap ( ) ;
289
+ return ;
290
+ }
291
+ }
268
292
_ => continue ,
269
293
} ;
270
294
}
271
295
} ;
272
296
273
- let receiver = async move {
297
+ let receiver_ops = async move {
274
298
loop {
275
- match receiver_handler . recv ( ) . await {
299
+ match receiver_recv . recv ( ) . await {
276
300
Some ( HandlerOut :: WhoAreYou ( wru_ref) ) => {
277
- let _ = recv_send. send ( HandlerIn :: WhoAreYou ( wru_ref, Some ( sender_enr. clone ( ) ) ) ) ;
301
+ let _ =
302
+ receiver_send. send ( HandlerIn :: WhoAreYou ( wru_ref, Some ( sender_enr. clone ( ) ) ) ) ;
278
303
}
279
304
Some ( HandlerOut :: Request ( addr, request) ) => {
280
305
assert_eq ! ( request, recv_send_message) ;
281
306
message_count += 1 ;
282
307
// required to send a pong response to establish the session
283
- let _ =
284
- recv_send . send ( HandlerIn :: Response ( addr, Box :: new ( pong_response. clone ( ) ) ) ) ;
308
+ let _ = receiver_send
309
+ . send ( HandlerIn :: Response ( addr, Box :: new ( pong_response. clone ( ) ) ) ) ;
285
310
if message_count == messages_to_send {
286
311
return ;
287
312
}
@@ -294,10 +319,12 @@ async fn multiple_messages() {
294
319
} ;
295
320
296
321
let sleep_future = sleep ( Duration :: from_millis ( 100 ) ) ;
322
+ let message_exchange = async move {
323
+ let _ = tokio:: join!( sender, sender_ops, receiver, receiver_ops) ;
324
+ } ;
297
325
298
326
tokio:: select! {
299
- _ = sender => { }
300
- _ = receiver => { }
327
+ _ = message_exchange => { }
301
328
_ = sleep_future => {
302
329
panic!( "Test timed out" ) ;
303
330
}
@@ -419,7 +446,14 @@ async fn test_self_request_ipv6() {
419
446
420
447
#[ tokio:: test]
421
448
async fn remove_one_time_session ( ) {
422
- let mut handler = build_handler :: < DefaultProtocolId > ( ) . await ;
449
+ let config = ConfigBuilder :: new ( ListenConfig :: default ( ) ) . build ( ) ;
450
+ let key = CombinedKey :: generate_secp256k1 ( ) ;
451
+ let enr = EnrBuilder :: new ( "v4" )
452
+ . ip4 ( Ipv4Addr :: LOCALHOST )
453
+ . udp4 ( 9000 )
454
+ . build ( & key)
455
+ . unwrap ( ) ;
456
+ let ( _, _, _, mut handler) = build_handler :: < DefaultProtocolId > ( enr, key, config) . await ;
423
457
424
458
let enr = {
425
459
let key = CombinedKey :: generate_secp256k1 ( ) ;
0 commit comments