From 595e4e3a436d6346d0a5edd13cd463d0b054d085 Mon Sep 17 00:00:00 2001
From: Nora Abi Akar <nora.abiakar@gmail.com>
Date: Thu, 29 Apr 2021 14:40:51 +0200
Subject: [PATCH] Propagate python unit test failure to github actions. 
 (#1505)

* Exit with correct exit code from Python test runners.
* Fix unit tests that were using older APIs.
---
 .github/workflows/basic.yml                   |  5 ++++-
 python/test/unit/runner.py                    |  3 ++-
 python/test/unit/test_event_generators.py     | 18 ++++++-----------
 python/test/unit_distributed/runner.py        |  4 +++-
 .../test_domain_decompositions.py             | 20 +++++++++----------
 .../test/unit_distributed/test_simulator.py   |  6 +++---
 6 files changed, 28 insertions(+), 28 deletions(-)

diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml
index 3ffd089a..2e321da4 100644
--- a/.github/workflows/basic.yml
+++ b/.github/workflows/basic.yml
@@ -184,7 +184,10 @@ jobs:
             mpirun -n 4 -oversubscribe build/bin/ring
             mpirun -n 4 -oversubscribe build/bin/single-cell
       - name: Run python tests
-        run: python python/test/unit/runner.py
+        run: |
+          cd build
+          python ../python/test/unit/runner.py
+          cd -
       - if:   ${{ matrix.config.mpi == 'ON' }}
         name: Run python+MPI tests
         run:  mpirun -n 4 -oversubscribe python python/test/unit_distributed/runner.py
diff --git a/python/test/unit/runner.py b/python/test/unit/runner.py
index fb796792..cc9f16d2 100644
--- a/python/test/unit/runner.py
+++ b/python/test/unit/runner.py
@@ -58,4 +58,5 @@ def suite():
 if __name__ == "__main__":
     v = options.parse_arguments().verbosity
     runner = unittest.TextTestRunner(verbosity = v)
-    runner.run(suite())
+    result = runner.run(suite())
+    sys.exit(not(result.wasSuccessful()))
diff --git a/python/test/unit/test_event_generators.py b/python/test/unit/test_event_generators.py
index 4099d461..a8b83738 100644
--- a/python/test/unit/test_event_generators.py
+++ b/python/test/unit/test_event_generators.py
@@ -22,27 +22,21 @@ all tests for event generators (regular, explicit, poisson)
 class EventGenerator(unittest.TestCase):
 
     def test_event_generator_regular_schedule(self):
-        cm = arb.cell_member(42,3)
         rs = arb.regular_schedule(2.0, 1., 100.)
-        rg = arb.event_generator(cm, 3.14, rs)
-        self.assertEqual(rg.target.gid, 42)
-        self.assertEqual(rg.target.index, 3)
+        rg = arb.event_generator(3, 3.14, rs)
+        self.assertEqual(rg.target, 3)
         self.assertAlmostEqual(rg.weight, 3.14)
 
     def test_event_generator_explicit_schedule(self):
-        cm = arb.cell_member(0,42)
         es = arb.explicit_schedule([0,1,2,3,4.4])
-        eg = arb.event_generator(cm, -0.01, es)
-        self.assertEqual(eg.target.gid, 0)
-        self.assertEqual(eg.target.index, 42)
+        eg = arb.event_generator(42, -0.01, es)
+        self.assertEqual(eg.target, 42)
         self.assertAlmostEqual(eg.weight, -0.01)
 
     def test_event_generator_poisson_schedule(self):
-        cm = arb.cell_member(4,2)
         ps = arb.poisson_schedule(0., 10., 0)
-        pg = arb.event_generator(cm, 42., ps)
-        self.assertEqual(pg.target.gid, 4)
-        self.assertEqual(pg.target.index, 2)
+        pg = arb.event_generator(2, 42., ps)
+        self.assertEqual(pg.target, 2)
         self.assertEqual(pg.weight, 42.)
 
 def suite():
diff --git a/python/test/unit_distributed/runner.py b/python/test/unit_distributed/runner.py
index 57d36da4..cb8ddf5d 100644
--- a/python/test/unit_distributed/runner.py
+++ b/python/test/unit_distributed/runner.py
@@ -72,7 +72,9 @@ if __name__ == "__main__":
         sys.stdout = open(os.devnull, 'w')
         runner = unittest.TextTestRunner(stream=sys.stdout)
 
-    runner.run(suite())
+    result = runner.run(suite())
 
     if not arb.mpi_is_finalized():
        arb.mpi_finalize()
+
+    sys.exit(not(result.wasSuccessful()))
diff --git a/python/test/unit_distributed/test_domain_decompositions.py b/python/test/unit_distributed/test_domain_decompositions.py
index ad6c5fda..7a52288e 100644
--- a/python/test/unit_distributed/test_domain_decompositions.py
+++ b/python/test/unit_distributed/test_domain_decompositions.py
@@ -79,22 +79,22 @@ class gj_switch:
         return getattr(self, 'case_' + str(arg), lambda: default)()
 
     def case_1(self):
-        return [arb.gap_junction_connection(arb.cell_member(7 + self.shift_, 0), arb.cell_member(self.gid_, 0), 0.1)]
+        return [arb.gap_junction_connection(arb.cell_member(7 + self.shift_, 0), 0, 0.1)]
 
     def case_2(self):
-        return [arb.gap_junction_connection(arb.cell_member(6 + self.shift_, 0), arb.cell_member(self.gid_, 0), 0.1),
-                arb.gap_junction_connection(arb.cell_member(9 + self.shift_, 0), arb.cell_member(self.gid_, 0), 0.1)]
+        return [arb.gap_junction_connection(arb.cell_member(6 + self.shift_, 0), 0, 0.1),
+                arb.gap_junction_connection(arb.cell_member(9 + self.shift_, 0), 0, 0.1)]
 
     def case_6(self):
-        return [arb.gap_junction_connection(arb.cell_member(2 + self.shift_, 0), arb.cell_member(self.gid_, 0), 0.1),
-                arb.gap_junction_connection(arb.cell_member(7 + self.shift_, 0), arb.cell_member(self.gid_, 0), 0.1)]
+        return [arb.gap_junction_connection(arb.cell_member(2 + self.shift_, 0), 0, 0.1),
+                arb.gap_junction_connection(arb.cell_member(7 + self.shift_, 0), 0, 0.1)]
 
     def case_7(self):
-        return [arb.gap_junction_connection(arb.cell_member(6 + self.shift_, 0), arb.cell_member(self.gid_, 0), 0.1),
-                arb.gap_junction_connection(arb.cell_member(1 + self.shift_, 0), arb.cell_member(self.gid_, 0), 0.1)]
+        return [arb.gap_junction_connection(arb.cell_member(6 + self.shift_, 0), 0, 0.1),
+                arb.gap_junction_connection(arb.cell_member(1 + self.shift_, 0), 0, 0.1)]
 
     def case_9(self):
-        return [arb.gap_junction_connection(arb.cell_member(2 + self.shift_, 0), arb.cell_member(self.gid_, 0), 0.1)]
+        return [arb.gap_junction_connection(arb.cell_member(2 + self.shift_, 0), 0, 0.1)]
 
 class gj_symmetric (arb.recipe):
     def __init__(self, num_ranks):
@@ -137,9 +137,9 @@ class gj_non_symmetric (arb.recipe):
         id = gid%self.size
 
         if (id == group and group != (self.groups - 1)):
-            return [arb.gap_junction_connection(arb.cell_member(gid + self.size, 0), arb.cell_member(gid, 0), 0.1)]
+            return [arb.gap_junction_connection(arb.cell_member(gid + self.size, 0), 0, 0.1)]
         elif (id == group - 1):
-            return [arb.gap_junction_connection(arb.cell_member(gid - self.size, 0), arb.cell_member(gid, 0), 0.1)]
+            return [arb.gap_junction_connection(arb.cell_member(gid - self.size, 0), 0, 0.1)]
         else:
             return []
 
diff --git a/python/test/unit_distributed/test_simulator.py b/python/test/unit_distributed/test_simulator.py
index abc477c5..399ffdc4 100644
--- a/python/test/unit_distributed/test_simulator.py
+++ b/python/test/unit_distributed/test_simulator.py
@@ -32,10 +32,10 @@ class lifN_recipe(A.recipe):
         return self.n_cell
 
     def num_targets(self, gid):
-        return 0
+        return 1
 
     def num_sources(self, gid):
-        return 0
+        return 1
 
     def cell_kind(self, gid):
         return A.cell_kind.lif
@@ -46,7 +46,7 @@ class lifN_recipe(A.recipe):
     def event_generators(self, gid):
         sched_dt = 0.25
         weight = 400
-        return [A.event_generator((gid,0), weight, A.regular_schedule(sched_dt)) for gid in range(0, self.num_cells())]
+        return [A.event_generator(0, weight, A.regular_schedule(sched_dt)) for gid in range(0, self.num_cells())]
 
     def probes(self, gid):
         return []
-- 
GitLab