class WorkerTestCase(unittest.TestCase): def setUp(self): super(WorkerTestCase, self).setUp() self.gator = Gator('locmem://') self.worker = Worker(self.gator, max_tasks=2, nap_time=0) self.gator.backend.drop_all('all') rm_file() touch_file() def test_init(self): self.assertEqual(self.worker.gator, self.gator) self.assertEqual(self.worker.max_tasks, 2) self.assertEqual(self.worker.to_consume, 'all') self.assertEqual(self.worker.nap_time, 0) self.assertEqual(self.worker.tasks_complete, 0) def test_ident(self): ident = self.worker.ident() self.assertTrue(ident.startswith('Alligator Worker (#')) def test_run_forever(self): self.assertEqual(read_file(), 0) self.gator.task(incr_file, 2) self.gator.task(incr_file, 3) self.gator.task(incr_file, 4) self.assertEqual(self.gator.backend.len('all'), 3) # Should actually only run for two of the three tasks. self.worker.run_forever() self.assertEqual(self.gator.backend.len('all'), 1) self.assertEqual(read_file(), 5)
class CustomBackendTestCase(unittest.TestCase): def setUp(self): super(CustomBackendTestCase, self).setUp() self.conn_string = 'sqlite:///tmp/alligator_test.db' try: os.unlink('/tmp/alligator_test.db') except OSError: pass self.gator = Gator(self.conn_string, backend_class=SQLiteClient) self._setup_tables() def _setup_tables(self): # We're just going to assume ``ALL``. query = 'CREATE TABLE `all` (task_id text, data text)' self.gator.backend._run_query(query, None) def test_everything(self): self.assertEqual(self.gator.backend.len(ALL), 0) t1 = self.gator.task(add, 1, 3) t2 = self.gator.task(add, 5, 7) t3 = self.gator.task(add, 3, 13) t4 = self.gator.task(add, 9, 4) self.assertEqual(self.gator.backend.len(ALL), 4) task_1 = self.gator.pop() self.assertEqual(task_1, 4) task_3 = self.gator.get(t3.task_id) self.assertEqual(task_3, 16) task_2 = self.gator.pop() self.assertEqual(task_2, 12) self.assertEqual(self.gator.backend.len(ALL), 1) self.gator.backend.drop_all(ALL) self.assertEqual(self.gator.backend.len(ALL), 0)
class GatorTestCase(unittest.TestCase): def setUp(self): super(GatorTestCase, self).setUp() self.conn_string = os.environ.get('ALLIGATOR_CONN') self.gator = Gator(self.conn_string) # Just reach in & clear things out. self.gator.backend.drop_all(ALL) def test_init(self): gator = Gator('whatever://', backend_class=CustomClient) self.assertEqual(gator.conn_string, 'whatever://') self.assertEqual(gator.queue_name, ALL) self.assertEqual(gator.task_class, Task) self.assertEqual(gator.backend_class, CustomClient) self.assertTrue(isinstance(gator.backend, CustomClient)) gator = Gator('locmem://', queue_name='hard_things', task_class=CustomTask) self.assertEqual(gator.conn_string, 'locmem://') self.assertEqual(gator.queue_name, 'hard_things') self.assertEqual(gator.task_class, CustomTask) self.assertEqual(gator.backend_class, None) self.assertTrue(isinstance(gator.backend, LocmemClient)) def test_build_backend(self): backend = self.gator.build_backend('locmem://') self.assertTrue(isinstance(backend, LocmemClient)) backend = self.gator.build_backend('redis://localhost:6379/0') self.assertTrue(isinstance(backend, RedisClient)) def test_push_async(self): self.assertEqual(self.gator.backend.len(ALL), 0) task = Task(async=True) self.gator.push(task, so_computationally_expensive, 1, 1) self.assertEqual(self.gator.backend.len(ALL), 1) def test_push_sync(self): self.assertEqual(self.gator.backend.len(ALL), 0) def success(t, result): t.result = result task = Task(async=False, on_success=success) res = self.gator.push(task, so_computationally_expensive, 1, 1) self.assertEqual(self.gator.backend.len(ALL), 0) self.assertEqual(res.result, 2) def test_pop(self): self.assertEqual(self.gator.backend.len(ALL), 0) task = Task(async=True) self.gator.push(task, so_computationally_expensive, 1, 1) self.assertEqual(self.gator.backend.len(ALL), 1) res = self.gator.pop() self.assertEqual(res, 2) def test_get(self): self.assertEqual(self.gator.backend.len(ALL), 0) task_1 = Task(async=True) task_2 = Task(task_id='hello', async=True) self.gator.push(task_1, so_computationally_expensive, 1, 1) self.gator.push(task_2, so_computationally_expensive, 3, 5) self.assertEqual(self.gator.backend.len(ALL), 2) res = self.gator.get(task_2.task_id) self.assertEqual(res, 8) res = self.gator.get(task_1.task_id) self.assertEqual(res, 2) def test_cancel(self): self.assertEqual(self.gator.backend.len(ALL), 0) task_1 = Task(async=True) task_2 = Task(task_id='hello', async=True) self.gator.push(task_1, so_computationally_expensive, 1, 1) self.gator.push(task_2, so_computationally_expensive, 3, 5) self.assertEqual(self.gator.backend.len(ALL), 2) task = self.gator.cancel(task_2.task_id) self.assertEqual(task.status, CANCELED) self.assertEqual(self.gator.backend.len(ALL), 1) def test_execute_success(self): task = Task(retries=3, async=True) task.to_call(so_computationally_expensive, 2, 7) res = self.gator.execute(task) self.assertEqual(res, 9) self.assertEqual(task.retries, 3) self.assertEqual(task.status, SUCCESS) def test_execute_failed(self): task = Task(retries=3, async=True) task.to_call(fail_task, 2, 7) self.assertEqual(task.status, WAITING) try: self.gator.execute(task) self.assertEqual(task.status, RETRYING) self.gator.execute(task) self.gator.execute(task) self.gator.execute(task) self.fail() except IOError: self.assertEqual(task.retries, 0) self.assertEqual(task.status, FAILED) def test_execute_retries(self): task = Task(retries=3, async=True) task.to_call(eventual_success(), 2, 7) try: self.gator.execute(task) except IOError: pass try: self.gator.execute(task) except IOError: pass res = self.gator.execute(task) self.assertEqual(res, 9) self.assertEqual(task.retries, 1) def test_task(self): self.assertEqual(self.gator.backend.len(ALL), 0) self.gator.task(so_computationally_expensive, 1, 1) self.assertEqual(self.gator.backend.len(ALL), 1) def test_options(self): self.assertEqual(self.gator.backend.len(ALL), 0) def success(t, result): t.result = result with self.gator.options(retries=4, async=False, on_success=success) as opts: res = opts.task(eventual_success(), 3, 9) self.assertEqual(res.retries, 2) self.assertEqual(res.result, 12)