anchor.diff:                  #atm_lane_run_execution_test_spec{
                       selector = {1, 1},
                       prepare_lane = #atm_step_mock_spec{
  -                        before_step_hook = fun atm_workflow_execution_test_utils:delete_offline_session/1,
  +                        before_step_hook = InterruptHook,
  +                        % State is changed immediately only by external interrupt procedure
  +                        before_step_exp_state_diff = case InterruptType of
  +                            exception -> default;
  +                            external -> StoppingExecutionExpStateDiff
  +                        end,
                           after_step_exp_state_diff = no_diff
                       },
  -                    % This is called as part of `handle_workflow_abruptly_stopped`
                       handle_lane_execution_stopped = #atm_step_mock_spec{
                           after_step_exp_state_diff = [{lane_run, {1, 1}, interrupted}]
                       }
                   },
                   ?UNSCHEDULED_LANE_RUN_TEST_SPEC({2, 1}, {prepare_lane, before_step, {1, 1}})
               ],
  -            handle_exception = #atm_step_mock_spec{
  -                after_step_exp_state_diff = [
  -                    {lane_run, {1, 1}, stopping},
  -                    workflow_stopping
  -                ]
  -            },
  +            % Callback called only in case of interrupt caused by exception
  +            handle_exception = #atm_step_mock_spec{after_step_exp_state_diff = case InterruptType of
  +                exception -> StoppingExecutionExpStateDiff;
  +                external -> default
  +            end},
               handle_workflow_abruptly_stopped = #atm_step_mock_spec{
                   after_step_exp_state_diff = [workflow_interrupted]
               },
  
positive.code: 
  
  interrupt_scheduled_atm_workflow_execution_due_to_expired_session() ->
      atm_workflow_execution_test_runner:run(#atm_workflow_execution_test_spec{
          workflow_schema_dump_or_draft = ?ECHO_ATM_WORKFLOW_SCHEMA_DRAFT,
          incarnations = [#atm_workflow_execution_incarnation_test_spec{
  
negative.code:     }).
  
  
  interrupt_enqueued_atm_workflow_execution_due_to_expired_session() ->
      interrupt_enqueued_atm_workflow_execution_test_base(
          exception,
          fun atm_workflow_execution_test_utils:delete_offline_session/1
      ).
  
  
  interrupt_enqueued_atm_workflow_execution_due_to_openfaas_down() ->
      interrupt_enqueued_atm_workflow_execution_test_base(
          external,
          fun atm_workflow_execution_test_utils:report_openfaas_unhealthy/1
      ).
  
  
  %% @private
  interrupt_enqueued_atm_workflow_execution_test_base(InterruptType, InterruptHook) ->
      StoppingExecutionExpStateDiff = [
          {all_tasks, {1, 1}, interrupted},
          {lane_run, {1, 1}, stopping},
          workflow_stopping
      ],
  
      atm_workflow_execution_test_runner:run(#atm_workflow_execution_test_spec{
          workflow_schema_dump_or_draft = ?ECHO_ATM_WORKFLOW_SCHEMA_DRAFT,
          incarnations = [#atm_workflow_execution_incarnation_test_spec{
  