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