Coverage for tests/test_generic_workflow.py : 21%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# This file is part of ctrl_bps.
2#
3# Developed for the LSST Data Management System.
4# This product includes software developed by the LSST Project
5# (https://www.lsst.org).
6# See the COPYRIGHT file at the top-level directory of this distribution
7# for details of code ownership.
8#
9# This program is free software: you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation, either version 3 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program. If not, see <https://www.gnu.org/licenses/>.
21import unittest
22import networkx
23import networkx.algorithms.isomorphism as iso
24import io
26import lsst.ctrl.bps.generic_workflow as gw
29class TestGenericWorkflowJob(unittest.TestCase):
30 def testEquality(self):
31 job1 = gw.GenericWorkflowJob("job1")
32 job2 = gw.GenericWorkflowJob("job1")
33 self.assertEqual(job1, job2)
36class TestGenericWorkflow(unittest.TestCase):
38 def testAddJobDuplicate(self):
39 job1 = gw.GenericWorkflowJob("job1")
40 gwf = gw.GenericWorkflow("mytest")
41 gwf.add_job(job1)
42 with self.assertRaises(RuntimeError):
43 gwf.add_job(job1)
45 def testAddJobValid(self):
46 job1 = gw.GenericWorkflowJob("job1")
47 gwf = gw.GenericWorkflow("mytest")
48 gwf.add_job(job1)
49 self.assertEqual(1, gwf.number_of_nodes())
50 self.assertListEqual(["job1"], list(gwf))
51 getjob = gwf.get_job("job1")
52 self.assertEqual(job1, getjob)
54 def testAddJobRelationshipsSingle(self):
55 job1 = gw.GenericWorkflowJob("job1")
56 job2 = gw.GenericWorkflowJob("job2")
57 gwf = gw.GenericWorkflow("mytest")
58 gwf.add_job(job1)
59 gwf.add_job(job2)
60 gwf.add_job_relationships("job1", "job2")
61 self.assertListEqual([("job1", "job2")], list(gwf.edges()))
63 def testAddJobRelationshipsMultiChild(self):
64 job1 = gw.GenericWorkflowJob("job1")
65 job2 = gw.GenericWorkflowJob("job2")
66 job3 = gw.GenericWorkflowJob("job3")
67 gwf = gw.GenericWorkflow("mytest")
68 gwf.add_job(job1)
69 gwf.add_job(job2)
70 gwf.add_job(job3)
71 gwf.add_job_relationships("job1", ["job2", "job3"])
72 self.assertListEqual([("job1", "job2"), ("job1", "job3")], list(gwf.edges()))
74 def testAddJobRelationshipsMultiParents(self):
75 job1 = gw.GenericWorkflowJob("job1")
76 job2 = gw.GenericWorkflowJob("job2")
77 job3 = gw.GenericWorkflowJob("job3")
78 gwf = gw.GenericWorkflow("mytest")
79 gwf.add_job(job1)
80 gwf.add_job(job2)
81 gwf.add_job(job3)
82 gwf.add_job_relationships(["job1", "job2"], "job3")
83 self.assertListEqual([("job1", "job3"), ("job2", "job3")], list(gwf.edges()))
85 def testAddJobRelationshipsNone(self):
86 job1 = gw.GenericWorkflowJob("job1")
87 gwf = gw.GenericWorkflow("mytest")
88 gwf.add_job(job1)
89 gwf.add_job_relationships(None, "job1")
90 self.assertListEqual([], list(gwf.edges()))
91 gwf.add_job_relationships("job1", None)
92 self.assertListEqual([], list(gwf.edges()))
94 def testGetJobExists(self):
95 job1 = gw.GenericWorkflowJob("job1")
96 gwf = gw.GenericWorkflow("mytest")
97 gwf.add_job(job1)
98 job2 = gwf.get_job("job1")
99 self.assertIs(job1, job2)
101 def testGetJobError(self):
102 job1 = gw.GenericWorkflowJob("job1")
103 gwf = gw.GenericWorkflow("mytest")
104 gwf.add_job(job1)
105 with self.assertRaises(KeyError):
106 _ = gwf.get_job("job_not_there")
108 def testSaveInvalidFormat(self):
109 gwf = gw.GenericWorkflow("mytest")
110 stream = io.BytesIO()
111 with self.assertRaises(RuntimeError):
112 gwf.save(stream, "badformat")
114 def testSavePickle(self):
115 gwf = gw.GenericWorkflow("mytest")
116 job1 = gw.GenericWorkflowJob("job1")
117 job2 = gw.GenericWorkflowJob("job2")
118 gwf.add_job(job1)
119 gwf.add_job(job2)
120 gwf.add_job_relationships("job1", "job2")
121 stream = io.BytesIO()
122 gwf.save(stream, "pickle")
123 stream.seek(0)
124 gwf2 = gw.GenericWorkflow.load(stream, "pickle")
125 self.assertTrue(networkx.is_isomorphic(gwf, gwf2, node_match=iso.categorical_node_match("data",
126 None)))
129if __name__ == "__main__": 129 ↛ 130line 129 didn't jump to line 130, because the condition on line 129 was never true
130 unittest.main()