@@ -445,3 +445,61 @@ def _do_with_assert_raises():
445
445
finally :
446
446
client .close ()
447
447
server .close ()
448
+
449
+
450
+ def test_on_close_if ():
451
+ """
452
+ Test that the on_close_if method does not cause exceptions when the client
453
+ is slow to recv() data.
454
+ """
455
+ endpoint = random_ipc_endpoint ()
456
+ server_events = zerorpc .Events (zmq .ROUTER )
457
+ server_events .bind (endpoint )
458
+ server = zerorpc .ChannelMultiplexer (server_events )
459
+
460
+ client_events = zerorpc .Events (zmq .DEALER )
461
+ client_events .connect (endpoint )
462
+ client = zerorpc .ChannelMultiplexer (client_events , ignore_broadcast = True )
463
+
464
+ client_channel = client .channel ()
465
+ client_hbchan = zerorpc .HeartBeatOnChannel (client_channel , freq = 2 )
466
+ client_bufchan = zerorpc .BufferedChannel (client_hbchan , inqueue_size = 10 )
467
+
468
+ event = server .recv ()
469
+ server_channel = server .channel (event )
470
+ server_hbchan = zerorpc .HeartBeatOnChannel (server_channel , freq = 2 )
471
+ server_bufchan = zerorpc .BufferedChannel (server_hbchan , inqueue_size = 10 )
472
+
473
+ seen = []
474
+
475
+ def is_stream_done (event ):
476
+ return event .name == 'done'
477
+
478
+ def client_do ():
479
+ while True :
480
+ event = client_bufchan .recv ()
481
+ if event .name == 'done' :
482
+ return
483
+ seen .append (event .args )
484
+ gevent .sleep (0.1 )
485
+
486
+ def server_do ():
487
+ for i in range (0 , 10 ):
488
+ server_bufchan .emit ('blah' , (i ))
489
+ server_bufchan .emit ('done' , ('bye' ))
490
+
491
+ client_bufchan .on_close_if = is_stream_done
492
+
493
+ coro_pool = gevent .pool .Pool ()
494
+ g1 = coro_pool .spawn (client_do )
495
+ g2 = coro_pool .spawn (server_do )
496
+
497
+ g1 .get () # Re-raise any exceptions...
498
+ g2 .get ()
499
+
500
+ assert seen == [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
501
+
502
+ client_bufchan .close ()
503
+ server_bufchan .close ()
504
+ client .close ()
505
+ server .close ()
0 commit comments