@@ -547,6 +547,172 @@ def test_tree_worker_name_compat(self):
547547 """test TreeWorker former name (WorkerTree)"""
548548 self .assertEqual (TreeWorker , WorkerTree )
549549
550+ def test_tree_run_abort_on_start (self ):
551+ """test tree run abort on ev_start"""
552+ class TEventAbortOnStartHandler (TEventHandler ):
553+ """Test Event Abort On Start Handler"""
554+
555+ def __init__ (self , testcase ):
556+ TEventHandler .__init__ (self )
557+ self .testcase = testcase
558+
559+ def ev_start (self , worker ):
560+ TEventHandler .ev_start (self , worker )
561+ worker .abort ()
562+
563+ def ev_hup (self , worker , node , rc ):
564+ TEventHandler .ev_hup (self , worker , node , rc )
565+ self .testcase .assertEqual (rc , os .EX_PROTOCOL )
566+
567+ teh = TEventAbortOnStartHandler (self )
568+ self .task .run ('echo Lorem Ipsum' , nodes = NODE_DISTANT , handler = teh )
569+ self .assertEqual (teh .ev_start_cnt , 1 )
570+ #self.assertEqual(teh.ev_pickup_cnt, 0) # XXX to be improved
571+ self .assertEqual (teh .ev_read_cnt , 0 )
572+ self .assertEqual (teh .ev_written_cnt , 0 )
573+ self .assertEqual (teh .ev_hup_cnt , 1 )
574+ self .assertEqual (teh .ev_timedout_cnt , 0 )
575+ self .assertEqual (teh .ev_close_cnt , 1 )
576+ self .assertEqual (teh .last_read , None )
577+
578+ def test_tree_run_abort_on_pickup (self ):
579+ """test tree run abort on ev_pickup"""
580+ class TEventAbortOnPickupHandler (TEventHandler ):
581+ """Test Event Abort On Pickup Handler"""
582+
583+ def __init__ (self , testcase ):
584+ TEventHandler .__init__ (self )
585+ self .testcase = testcase
586+
587+ def ev_pickup (self , worker , node ):
588+ TEventHandler .ev_pickup (self , worker , node )
589+ worker .abort ()
590+
591+ def ev_hup (self , worker , node , rc ):
592+ TEventHandler .ev_hup (self , worker , node , rc )
593+ self .testcase .assertEqual (rc , os .EX_PROTOCOL )
594+
595+ teh = TEventAbortOnPickupHandler (self )
596+ self .task .run ('echo Lorem Ipsum' , nodes = NODE_DISTANT , handler = teh )
597+ self .assertEqual (teh .ev_start_cnt , 1 )
598+ self .assertEqual (teh .ev_pickup_cnt , 1 )
599+ self .assertEqual (teh .ev_read_cnt , 0 )
600+ self .assertEqual (teh .ev_written_cnt , 0 )
601+ self .assertEqual (teh .ev_hup_cnt , 1 )
602+ self .assertEqual (teh .ev_timedout_cnt , 0 )
603+ self .assertEqual (teh .ev_close_cnt , 1 )
604+ self .assertEqual (teh .last_read , None )
605+
606+ def test_tree_run_abort_on_read (self ):
607+ """test tree run abort on ev_read"""
608+ class TEventAbortOnReadHandler (TEventHandler ):
609+ """Test Event Abort On Start Handler"""
610+
611+ def __init__ (self , testcase ):
612+ TEventHandler .__init__ (self )
613+ self .testcase = testcase
614+
615+ def ev_read (self , worker , node , sname , msg ):
616+ TEventHandler .ev_read (self , worker , node , sname , msg )
617+ worker .abort ()
618+
619+ def ev_hup (self , worker , node , rc ):
620+ TEventHandler .ev_hup (self , worker , node , rc )
621+ self .testcase .assertEqual (rc , os .EX_PROTOCOL )
622+
623+ teh = TEventAbortOnReadHandler (self )
624+ self .task .run ('echo Lorem Ipsum' , nodes = NODE_DISTANT , handler = teh )
625+ self .assertEqual (teh .ev_start_cnt , 1 )
626+ self .assertEqual (teh .ev_pickup_cnt , 1 )
627+ self .assertEqual (teh .ev_read_cnt , 1 )
628+ self .assertEqual (teh .ev_written_cnt , 0 )
629+ self .assertEqual (teh .ev_hup_cnt , 1 )
630+ self .assertEqual (teh .ev_timedout_cnt , 0 )
631+ self .assertEqual (teh .ev_close_cnt , 1 )
632+ self .assertEqual (teh .last_read , b'Lorem Ipsum' )
633+
634+ def test_tree_run_abort_on_hup (self ):
635+ """test tree run abort on ev_hup"""
636+ class TEventAbortOnHupHandler (TEventHandler ):
637+ """Test Event Abort On Hup Handler"""
638+
639+ def __init__ (self , testcase ):
640+ TEventHandler .__init__ (self )
641+ self .testcase = testcase
642+
643+ def ev_hup (self , worker , node , rc ):
644+ TEventHandler .ev_hup (self , worker , node , rc )
645+ worker .abort ()
646+
647+ teh = TEventAbortOnHupHandler (self )
648+ self .task .run ('echo Lorem Ipsum' , nodes = NODE_DISTANT , handler = teh )
649+ self .assertEqual (teh .ev_start_cnt , 1 )
650+ self .assertEqual (teh .ev_pickup_cnt , 1 )
651+ self .assertEqual (teh .ev_read_cnt , 1 )
652+ self .assertEqual (teh .ev_written_cnt , 0 )
653+ self .assertEqual (teh .ev_hup_cnt , 1 )
654+ self .assertEqual (teh .ev_timedout_cnt , 0 )
655+ self .assertEqual (teh .ev_close_cnt , 1 )
656+ self .assertEqual (teh .last_read , b'Lorem Ipsum' )
657+
658+ def test_tree_run_abort_on_close (self ):
659+ """test tree run abort on ev_close"""
660+ class TEventAbortOnCloseHandler (TEventHandler ):
661+ """Test Event Abort On Close Handler"""
662+
663+ def __init__ (self , testcase ):
664+ TEventHandler .__init__ (self )
665+ self .testcase = testcase
666+
667+ def ev_close (self , worker , timedout ):
668+ TEventHandler .ev_close (self , worker , timedout )
669+ self .testcase .assertEqual (type (worker ), TreeWorker )
670+ worker .abort ()
671+
672+ teh = TEventAbortOnCloseHandler (self )
673+ self .task .run ('echo Lorem Ipsum' , nodes = NODE_DISTANT , handler = teh )
674+ self .assertEqual (teh .ev_start_cnt , 1 )
675+ self .assertEqual (teh .ev_pickup_cnt , 1 )
676+ self .assertEqual (teh .ev_read_cnt , 1 )
677+ self .assertEqual (teh .ev_written_cnt , 0 )
678+ self .assertEqual (teh .ev_hup_cnt , 1 )
679+ self .assertEqual (teh .ev_timedout_cnt , 0 )
680+ self .assertEqual (teh .ev_close_cnt , 1 )
681+ self .assertEqual (teh .last_read , b'Lorem Ipsum' )
682+
683+ def test_tree_run_abort_on_timer (self ):
684+ """test tree run abort on timer"""
685+ class TEventAbortOnTimerHandler (TEventHandler ):
686+ """Test Event Abort On Timer Handler"""
687+
688+ def __init__ (self , testcase ):
689+ TEventHandler .__init__ (self )
690+ self .testcase = testcase
691+ self .worker = None
692+
693+ def ev_timer (self , timer ):
694+ self .worker .abort ()
695+
696+ def ev_hup (self , worker , node , rc ):
697+ TEventHandler .ev_hup (self , worker , node , rc )
698+ self .testcase .assertEqual (rc , os .EX_PROTOCOL )
699+
700+ # Test abort from a timer's event handler
701+ teh = TEventAbortOnTimerHandler (self )
702+ # channel might take some time to set up; hard to time it
703+ # we play it safe here and don't expect anything to read
704+ teh .worker = self .task .shell ('sleep 10; echo Lorem Ipsum' , nodes = NODE_DISTANT , handler = teh )
705+ timer1 = self .task .timer (3 , handler = teh )
706+ self .task .run ()
707+ self .assertEqual (teh .ev_start_cnt , 1 )
708+ self .assertEqual (teh .ev_pickup_cnt , 1 )
709+ self .assertEqual (teh .ev_read_cnt , 0 )
710+ self .assertEqual (teh .ev_written_cnt , 0 )
711+ self .assertEqual (teh .ev_hup_cnt , 1 )
712+ self .assertEqual (teh .ev_timedout_cnt , 0 )
713+ self .assertEqual (teh .ev_close_cnt , 1 )
714+ self .assertEqual (teh .last_read , None )
715+
550716
551717@unittest .skipIf (HOSTNAME == 'localhost' , "does not work with hostname set to 'localhost'" )
552718class TreeWorkerGW2Test (TreeWorkerTestBase ):
0 commit comments