@@ -735,6 +735,99 @@ def assert_next_steps(expected_next_step_ids, finished_step_id = nil, success =
735735 assert [ world . terminate , world . terminate ] . map ( &:value ) . all?
736736 end
737737 end
738+
739+ describe 'halting' do
740+ include TestHelpers
741+ let ( :world ) { WorldFactory . create_world }
742+
743+ it 'halts an execution plan with a suspended step' do
744+ triggered = world . trigger ( Support ::DummyExample ::PlanEventsAction , ping_time : 1 )
745+ plan = world . persistence . load_execution_plan ( triggered . id )
746+ wait_for do
747+ plan = world . persistence . load_execution_plan ( triggered . id )
748+ plan . state == :running
749+ end
750+ world . halt ( triggered . id )
751+ wait_for ( 'the execution plan to halt' ) do
752+ plan = world . persistence . load_execution_plan ( triggered . id )
753+ plan . state == :stopped
754+ end
755+ _ ( plan . steps [ 2 ] . state ) . must_equal :suspended
756+ end
757+
758+ it 'halts a paused execution plan' do
759+ triggered = world . trigger ( Support ::DummyExample ::FailingDummy )
760+ plan = world . persistence . load_execution_plan ( triggered . id )
761+ wait_for do
762+ plan = world . persistence . load_execution_plan ( triggered . id )
763+ plan . state == :paused
764+ end
765+ world . halt ( plan . id )
766+ wait_for ( 'the execution plan to halt' ) do
767+ plan = world . persistence . load_execution_plan ( triggered . id )
768+ plan . state == :stopped
769+ end
770+ _ ( plan . steps [ 2 ] . state ) . must_equal :error
771+ end
772+
773+ it 'halts a planned execution plan' do
774+ plan = world . plan ( Support ::DummyExample ::Dummy )
775+ wait_for do
776+ plan = world . persistence . load_execution_plan ( plan . id )
777+ plan . state == :planned
778+ end
779+ world . halt ( plan . id )
780+ wait_for ( 'the execution plan to halt' ) do
781+ plan = world . persistence . load_execution_plan ( plan . id )
782+ plan . state == :stopped
783+ end
784+ _ ( plan . steps [ 2 ] . state ) . must_equal :pending
785+ end
786+
787+ it 'halts a scheduled execution plan' do
788+ plan = world . delay ( Support ::DummyExample ::Dummy , { start_at : Time . now + 120 } )
789+ wait_for do
790+ plan = world . persistence . load_execution_plan ( plan . id )
791+ plan . state == :scheduled
792+ end
793+ world . halt ( plan . id )
794+ wait_for ( 'the execution plan to halt' ) do
795+ plan = world . persistence . load_execution_plan ( plan . id )
796+ plan . state == :stopped
797+ end
798+ _ ( plan . delay_record ) . must_be :nil?
799+ _ ( plan . steps [ 1 ] . state ) . must_equal :pending
800+ end
801+
802+ it 'halts a pending execution plan' do
803+ plan = ExecutionPlan . new ( world , nil )
804+ plan . save
805+ world . halt ( plan . id )
806+ wait_for ( 'the execution plan to halt' ) do
807+ plan = world . persistence . load_execution_plan ( plan . id )
808+ plan . state == :stopped
809+ end
810+ end
811+ end
812+
813+ describe 'execution inhibition locks' do
814+ include TestHelpers
815+ let ( :world ) { WorldFactory . create_world }
816+
817+ it 'inhibits execution' do
818+ plan = world . plan ( Support ::DummyExample ::Dummy )
819+ world . coordinator . acquire ( Coordinator ::ExecutionInhibitionLock . new ( plan . id ) )
820+ triggered = world . execute ( plan . id )
821+ triggered . wait
822+ _ ( triggered ) . must_be :rejected?
823+
824+ plan = world . persistence . load_execution_plan ( plan . id )
825+ _ ( plan . state ) . must_equal :stopped
826+
827+ locks = world . coordinator . find_locks ( { class : Coordinator ::ExecutionInhibitionLock . to_s , owner_id : "execution-plan:#{ plan . id } " } )
828+ _ ( locks ) . must_be :empty?
829+ end
830+ end
738831 end
739832 end
740833end
0 commit comments