Ejemplo n.º 1
0
    def test_fork_task_runs_task_if_cant_fork(self):
        t = Task.objects.create(
            worker=self._worker.worker,
            arch=self._arch,
            channel=self._channel,
            owner=self._user,
            method='DummyForegroundTask',
            state=TASK_STATES['OPEN'],
        )

        self.assertEqual(t.state, TASK_STATES['OPEN'])

        tm = TaskManager(conf={'worker': self._worker})
        task_info = t.export(False)

        with patch('kobo.worker.taskmanager.os', fork=Mock(return_value=0)) as os_mock:
            os_mock.devnull = os.devnull

            with patch('kobo.worker.taskmanager.signal') as signal_mock:
                tm.fork_task(task_info)
                os_mock.fork.assert_called_once()
                os_mock.setpgrp.assert_called_once()
                os_mock._exit.assert_called_once()
                signal_mock.signal.assert_called()

        t = Task.objects.get(id=t.id)
        self.assertEqual(t.state, TASK_STATES['CLOSED'])
Ejemplo n.º 2
0
    def test_fork_task_logs_exceptions(self):
        """Exceptions from the child within fork_task are logged."""

        t = Task.objects.create(
            worker=self._worker.worker,
            arch=self._arch,
            channel=self._channel,
            owner=self._user,
            method='DummyForegroundTask',
            state=TASK_STATES['OPEN'],
        )

        logger = Mock()

        with patch('kobo.worker.taskmanager.HubProxy') as hub_mock:
            # Arrange for close_task call to fail (at end of task)
            hub_mock.return_value.worker.close_task.side_effect = RuntimeError("simulated error")

            tm = TaskManager(conf={'worker': self._worker}, logger=logger)
            task_info = t.export(False)

            with patch('kobo.worker.taskmanager.os', fork=Mock(return_value=0)) as os_mock:
                os_mock.devnull = os.devnull
                tm.fork_task(task_info)

        # It should have logged something about the failure to close the task.
        logger.log.assert_called_with(logging.CRITICAL, 'Error running forked task', exc_info=1)
Ejemplo n.º 3
0
    def test_fork_task(self):
        t = Task.objects.create(
            worker=self._worker.worker,
            arch=self._arch,
            channel=self._channel,
            owner=self._user,
            method='DummyForkTask',
            state=TASK_STATES['FREE'],
        )

        self.assertEqual(t.state, TASK_STATES['FREE'])

        tm = TaskManager(conf={'worker': self._worker})
        task_info = t.export(False)

        with patch('kobo.worker.taskmanager.os', fork=Mock(return_value=9999)) as os_mock:
            tm.fork_task(task_info)
            os_mock.fork.assert_called_once()