Пример #1
0
    def test_handle__execute_return_true_and_do_not_need_schedule(self):
        for loop, timeout, error_ignore, finish_call_success, on_retry in (
                itertools.product((1, 2), (5, None), (True, False),
                                  (True, False), (True, False))):
            root_pipeline_data = 'root_pipeline_data'
            ex_data = 'ex_data'
            top_context = MockContext()

            process = MockPipelineProcess(
                root_pipeline_data=root_pipeline_data,
                top_pipeline_context=top_context)
            service_act = ServiceActObject(
                interval=None,
                execute_return=True,
                error_ignorable=error_ignore,
                timeout=timeout,
                need_schedule=False,
                result_bit=True,
                data=MockData(get_one_of_outputs_return={
                    'ex_data': ex_data,
                    ServiceActivity.result_bit: False
                }),
                on_retry=on_retry)
            status = MockStatus(loop=loop)

            with patch(PIPELINE_STATUS_GET, MagicMock(return_value=status)):
                with patch(PIPELINE_STATUS_FINISH,
                           MagicMock(return_value=finish_call_success)):

                    hdl_result = handlers.service_activity_handler(
                        process, service_act, status)

                    if loop > 1 and not on_retry:
                        service_act.prepare_rerun_data.assert_called_once()
                        top_context.recover_variable.assert_called_once()
                        service_act.retry_at_current_exec.assert_not_called()
                    else:
                        service_act.prepare_rerun_data.assert_not_called()

                    if on_retry:
                        service_act.retry_at_current_exec.assert_called_once()

                    self.assertEqual(service_act.data.inputs._loop,
                                     status.loop - 1)
                    self.assertEqual(service_act.data.outputs._loop,
                                     status.loop - 1)

                    service_act_h.hydrate_node_data.assert_called_once()

                    if timeout:
                        signals.service_activity_timeout_monitor_start.send.assert_called_once_with(
                            sender=service_act.__class__,
                            node_id=service_act.id,
                            version=status.version,
                            root_pipeline_id=process.root_pipeline.id,
                            countdown=service_act.timeout)
                    else:
                        signals.service_activity_timeout_monitor_start.send.assert_not_called(
                        )

                    service_act.execute.assert_called_once_with(
                        root_pipeline_data)

                    service_act.ignore_error.assert_not_called()

                    service_act.data.set_outputs.assert_not_called()

                    ScheduleService.objects.set_schedule.assert_not_called()

                    top_context.extract_output.assert_has_calls(
                        [mock.call(service_act)] * 2)

                    if timeout:
                        signals.service_activity_timeout_monitor_end.send.assert_called_once_with(
                            sender=service_act.__class__,
                            node_id=service_act.id,
                            version=status.version)
                    else:
                        signals.service_activity_timeout_monitor_end.send.assert_not_called(
                        )

                    Status.objects.finish.assert_called_once_with(
                        service_act, False)

                    if finish_call_success:
                        self.assertEqual(hdl_result.next_node,
                                         service_act.next())
                        self.assertFalse(hdl_result.should_return)
                        self.assertFalse(hdl_result.should_sleep)
                    else:
                        self.assertIsNone(hdl_result.next_node)
                        self.assertFalse(hdl_result.should_return)
                        self.assertTrue(hdl_result.should_sleep)

                    service_act_h.hydrate_node_data.reset_mock()
                    signals.service_activity_timeout_monitor_start.send.reset_mock(
                    )
                    signals.service_activity_timeout_monitor_end.send.reset_mock(
                    )
                    Status.objects.finish.reset_mock()
Пример #2
0
    def test_handle__execute_raise_exception_and_not_ignore_error(self):

        for loop, timeout in (itertools.product((1, 2), (5, None))):
            root_pipeline_data = 'root_pipeline_data'
            ex_data = 'ex_data'
            top_context = MockContext()

            process = MockPipelineProcess(
                root_pipeline_data=root_pipeline_data,
                top_pipeline_context=top_context)
            service_act = ServiceActObject(
                interval=None,
                execute_exception=Exception(),
                error_ignorable=False,
                timeout=timeout,
                data=MockData(get_one_of_outputs_return=ex_data))
            status = MockStatus(loop=loop)

            with patch(PIPELINE_STATUS_GET, MagicMock(return_value=status)):

                hdl_result = handlers.service_activity_handler(
                    process, service_act, status)

                if loop > 1:
                    service_act.prepare_rerun_data.assert_called_once()
                    top_context.recover_variable.assert_called_once()
                else:
                    service_act.prepare_rerun_data.assert_not_called()

                self.assertEqual(service_act.data.inputs._loop,
                                 status.loop - 1)
                self.assertEqual(service_act.data.outputs._loop,
                                 status.loop - 1)

                top_context.extract_output.assert_called_once_with(service_act)

                service_act_h.hydrate_node_data.assert_called_once()

                if timeout:
                    signals.service_activity_timeout_monitor_start.send.assert_called_once_with(
                        sender=service_act.__class__,
                        node_id=service_act.id,
                        version=status.version,
                        root_pipeline_id=process.root_pipeline.id,
                        countdown=service_act.timeout)
                else:
                    signals.service_activity_timeout_monitor_start.send.assert_not_called(
                    )

                service_act.execute.assert_called_once_with(root_pipeline_data)

                self.assertIsNotNone(service_act.data.outputs.ex_data)

                service_act.data.get_one_of_outputs.assert_called_once_with(
                    'ex_data')

                Status.objects.fail.assert_called_once_with(
                    service_act, ex_data)

                service_act.failure_handler.assert_called_once_with(
                    process.root_pipeline.data)

                if timeout:
                    signals.service_activity_timeout_monitor_end.send.assert_called_once_with(
                        sender=service_act.__class__,
                        node_id=service_act.id,
                        version=status.version)
                else:
                    signals.service_activity_timeout_monitor_end.send.assert_not_called(
                    )

                valve.send.assert_called_once_with(
                    signals,
                    'activity_failed',
                    sender=process.root_pipeline,
                    pipeline_id=process.root_pipeline.id,
                    pipeline_activity_id=service_act.id)

                self.assertIsNone(hdl_result.next_node)
                self.assertFalse(hdl_result.should_return)
                self.assertTrue(hdl_result.should_sleep)

                # reset mock
                service_act_h.hydrate_node_data.reset_mock()
                signals.service_activity_timeout_monitor_start.send.reset_mock(
                )
                Status.objects.fail.reset_mock()
                signals.service_activity_timeout_monitor_end.send.reset_mock()
                valve.send.reset_mock()