def test_runJob(self): """Ensure status is set to completed when a job runs to completion.""" job_1, job_2 = self.makeTwoJobs() runner = JobRunner(job_1) runner.runJob(job_1, None) self.assertEqual(JobStatus.COMPLETED, job_1.job.status) self.assertEqual([job_1], runner.completed_jobs)
def test_runJob_raising_retry_error(self): """If a job raises a retry_error, it should be re-queued.""" job = RaisingRetryJob('completion') runner = JobRunner([job]) with self.expectedLog('Scheduling retry due to RetryError'): runner.runJob(job, None) self.assertEqual(JobStatus.WAITING, job.status) self.assertNotIn(job, runner.completed_jobs) self.assertIn(job, runner.incomplete_jobs)
def test_runJob_with_SuspendJobException(self): # A job that raises SuspendJobError should end up suspended. job = NullJob('suspended') job.run = FakeMethod(failure=SuspendJobException()) runner = JobRunner([job]) runner.runJob(job, None) self.assertEqual(JobStatus.SUSPENDED, job.status) self.assertNotIn(job, runner.completed_jobs) self.assertIn(job, runner.incomplete_jobs)
def test_runJob_exceeding_max_retries(self): """If a job exceeds maximum retries, it should raise normally.""" job = RaisingRetryJob('completion') JobRunner([job]).runJob(job, None) self.assertEqual(JobStatus.WAITING, job.status) runner = JobRunner([job]) with ExpectedException(RetryError, ''): runner.runJob(job, None) self.assertEqual(JobStatus.FAILED, job.status) self.assertNotIn(job, runner.completed_jobs) self.assertIn(job, runner.incomplete_jobs)
def test_runJob_raising_retry_error(self): """If a job raises a retry_error, it should be re-queued.""" job = RaisingRetryJob('completion') runner = JobRunner([job]) self.assertIs(None, job.scheduled_start) with self.expectedLog('Scheduling retry due to RetryError'): runner.runJob(job, None) self.assertEqual(JobStatus.WAITING, job.status) expected_delay = datetime.now(UTC) + timedelta(minutes=10) self.assertThat( job.scheduled_start, MatchesAll(GreaterThan(expected_delay - timedelta(minutes=1)), LessThan(expected_delay + timedelta(minutes=1)))) self.assertIsNone(job.lease_expires) self.assertNotIn(job, runner.completed_jobs) self.assertIn(job, runner.incomplete_jobs)