def test_console_start_end(): extension = ConsoleStartEndEventHandler() with patch('sys.stdout') as stdout: with patch('sys.stderr') as stderr: event = JobStarted('idA') extension((event, None)) assert stdout.write.call_count == 2 stdout.write.reset_mock() # success event = JobEnded('idA', 0) extension((event, None)) assert stdout.write.call_count == 2 stdout.write.reset_mock() # aborted event = JobEnded('idA', SIGINT_RESULT) extension((event, None)) assert stdout.write.call_count == 2 stdout.write.reset_mock() # failure event = JobEnded('idA', 1) extension((event, None)) assert stderr.write.call_count == 2 stderr.write.reset_mock() extension(('unknown', None)) assert stdout.write.call_count == 0 assert stderr.write.call_count == 0
def test_console_start_end(): extension = ConsoleStartEndEventHandler() with patch('sys.stdout') as stdout: with patch('sys.stderr') as stderr: event = JobStarted('idA') extension((event, None)) assert stdout.write.call_count == 2 assert stderr.write.call_count == 0 stdout.write.reset_mock() # success event = JobEnded('idA', 0) extension((event, None)) assert stdout.write.call_count == 2 assert stderr.write.call_count == 0 stdout.write.reset_mock() # aborted event = JobEnded('idA', SIGINT_RESULT) extension((event, None)) assert stdout.write.call_count == 2 assert stderr.write.call_count == 0 stdout.write.reset_mock() # failure event = JobEnded('idA', 1) extension((event, None)) assert stderr.write.call_count == 2 assert stdout.write.call_count == 0 stderr.write.reset_mock() # test failures event = TestFailure('idA') extension((event, None)) event = JobEnded('idA', 0) extension((event, None)) assert stdout.write.call_count == 2 assert len(stdout.write.call_args_list[0][0]) == 1 assert '[ with test failures ]' in \ stdout.write.call_args_list[0][0][0] assert stderr.write.call_count == 0 stdout.write.reset_mock() extension(('unknown', None)) assert stdout.write.call_count == 0 assert stderr.write.call_count == 0
async def __call__(self, *args, **kwargs): """ Perform the unit of work. The overview of the process: * Put a :class:`JobStarted` event into the queue * Pass the task context to the task * Invoke the task * In case the task is canceled return a :attribute:`SIGINT_RESULT` code * In case of an exception within the task put a :class:`StderrLine` event into the queue and re-raise the exception * Put a :class:`JobEnded` event into the queue :returns: The return code of the invoked task :raises Exception: Any exception the invoked task raises """ self.put_event_into_queue(JobStarted(self.task_context.pkg.name)) # replace function to use this job as the event context self.task_context.put_event_into_queue = self.put_event_into_queue self.task.set_context(context=self.task_context) rc = 0 try: rc = await self.task(*args, **kwargs) except CancelledError: rc = SIGINT_RESULT except Exception: rc = 1 self.put_event_into_queue( StderrLine(traceback.format_exc().encode())) raise finally: if self.returncode is None: self.returncode = rc or 0 self.put_event_into_queue( JobEnded(self.task_context.pkg.name, self.returncode)) return self.returncode