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'])
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)
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()