From 3927d500b6fd44a059b2db74279c93f7bcdb7e51 Mon Sep 17 00:00:00 2001 From: Andre Anjos <andre.anjos@idiap.ch> Date: Tue, 26 Apr 2016 18:11:52 +0200 Subject: [PATCH] [backend] Test partially blocking experiments --- beat/web/backend/tests.py | 65 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/beat/web/backend/tests.py b/beat/web/backend/tests.py index 511d96ad7..e0658a905 100644 --- a/beat/web/backend/tests.py +++ b/beat/web/backend/tests.py @@ -2043,7 +2043,7 @@ class Working(BaseBackendTestCase): def test_does_not_skip(self): # tests an experiment can actually be partially skipped if some files - # are already + # are ready current_stats = HourlyStatistics.objects.count() @@ -2146,3 +2146,66 @@ class Working(BaseBackendTestCase): [Block.CACHED, Block.CANCELLED] ) self.assertEqual(xp.status, Experiment.FAILED) + + + def test_partially_blocking(self): + + # tests an experiment can actually be partially skipped if some files + # are ready on the cache - blocking occurs as foreseeable on blocks to + # run + + current_stats = HourlyStatistics.objects.count() + + fullname = 'user/user/single/1/single' + xp = Experiment.objects.get(name=fullname.split(os.sep)[-1]) + + # schedules the experiment and check it + xp.schedule() + + # schedules the first runnable block + assert xp.blocks.first().job.runnable_date is not None + assert xp.blocks.last().job.runnable_date is None + + assigned_splits = schedule() + + worker = Worker.objects.get() + + self.assertEqual(len(assigned_splits), 1) + split = assigned_splits[0] + self.assertEqual(split.job.block.experiment, xp) + self.assertEqual(split.job.block.name, 'echo') + self.assertEqual(split.worker, worker) + self.assertEqual(worker.name, qsetup.HOSTNAME) + self.assertEqual(worker.available_cores(), qsetup.CORES-1) + + # actually runs the job (blocking) + process(split, self.environments, self.cpulimit) + + # at this point, job should have been successful + self.assertEqual(split.job.status, Job.COMPLETED) + self.assertEqual(split.job.block.status, Block.CACHED) + self.assertEqual(split.job.block.experiment.status, Experiment.RUNNING) + + # all caches must be have been generated + assert all([k.index_checksums() for k in split.job.block.outputs.all()]) + + # checks the number of statistics objects has increased by 1 + self.assertEqual(HourlyStatistics.objects.count(), current_stats + 1) + + self.check_stats_success(split) + + # assert we have no database traces after the block is done + self.assertEqual(Job.objects.filter(block=split.job.block).count(), 0) + self.assertEqual(JobSplit.objects.filter(job=split.job).count(), 0) + self.assertEqual(Result.objects.filter(job__isnull=True).count(), 0) + + self.assertEqual(worker.available_cores(), qsetup.CORES) + + # now we fork and wait the second experiment to hook-into the last + # block + xpc = xp.fork(name='single_copy') + xpc.schedule() + + self.assertEqual([k.status for k in xpc.blocks.all()], + [Block.CACHED, Block.NOT_CACHED]) + assert xpc.blocks.last().job.parent == xp.blocks.last().job -- GitLab