Coverage for tests/test_generic_workflow.py: 23%

92 statements  

« prev     ^ index     » next       coverage.py v6.4.4, created at 2022-09-07 04:16 -0700

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 io 

22import unittest 

23 

24import lsst.ctrl.bps.generic_workflow as gw 

25import networkx 

26import networkx.algorithms.isomorphism as iso 

27 

28 

29class TestGenericWorkflowJob(unittest.TestCase): 

30 def testEquality(self): 

31 job1 = gw.GenericWorkflowJob("job1") 

32 job2 = gw.GenericWorkflowJob("job1") 

33 self.assertEqual(job1, job2) 

34 

35 

36class TestGenericWorkflow(unittest.TestCase): 

37 def testAddJobDuplicate(self): 

38 job1 = gw.GenericWorkflowJob("job1") 

39 gwf = gw.GenericWorkflow("mytest") 

40 gwf.add_job(job1) 

41 with self.assertRaises(RuntimeError): 

42 gwf.add_job(job1) 

43 

44 def testAddJobValid(self): 

45 job1 = gw.GenericWorkflowJob("job1") 

46 gwf = gw.GenericWorkflow("mytest") 

47 gwf.add_job(job1) 

48 self.assertEqual(1, gwf.number_of_nodes()) 

49 self.assertListEqual(["job1"], list(gwf)) 

50 getjob = gwf.get_job("job1") 

51 self.assertEqual(job1, getjob) 

52 

53 def testAddJobRelationshipsSingle(self): 

54 job1 = gw.GenericWorkflowJob("job1") 

55 job2 = gw.GenericWorkflowJob("job2") 

56 gwf = gw.GenericWorkflow("mytest") 

57 gwf.add_job(job1) 

58 gwf.add_job(job2) 

59 gwf.add_job_relationships("job1", "job2") 

60 self.assertListEqual([("job1", "job2")], list(gwf.edges())) 

61 

62 def testAddJobRelationshipsMultiChild(self): 

63 job1 = gw.GenericWorkflowJob("job1") 

64 job2 = gw.GenericWorkflowJob("job2") 

65 job3 = gw.GenericWorkflowJob("job3") 

66 gwf = gw.GenericWorkflow("mytest") 

67 gwf.add_job(job1) 

68 gwf.add_job(job2) 

69 gwf.add_job(job3) 

70 gwf.add_job_relationships("job1", ["job2", "job3"]) 

71 self.assertListEqual([("job1", "job2"), ("job1", "job3")], list(gwf.edges())) 

72 

73 def testAddJobRelationshipsMultiParents(self): 

74 job1 = gw.GenericWorkflowJob("job1") 

75 job2 = gw.GenericWorkflowJob("job2") 

76 job3 = gw.GenericWorkflowJob("job3") 

77 gwf = gw.GenericWorkflow("mytest") 

78 gwf.add_job(job1) 

79 gwf.add_job(job2) 

80 gwf.add_job(job3) 

81 gwf.add_job_relationships(["job1", "job2"], "job3") 

82 self.assertListEqual([("job1", "job3"), ("job2", "job3")], list(gwf.edges())) 

83 

84 def testAddJobRelationshipsNone(self): 

85 job1 = gw.GenericWorkflowJob("job1") 

86 gwf = gw.GenericWorkflow("mytest") 

87 gwf.add_job(job1) 

88 gwf.add_job_relationships(None, "job1") 

89 self.assertListEqual([], list(gwf.edges())) 

90 gwf.add_job_relationships("job1", None) 

91 self.assertListEqual([], list(gwf.edges())) 

92 

93 def testGetJobExists(self): 

94 job1 = gw.GenericWorkflowJob("job1") 

95 gwf = gw.GenericWorkflow("mytest") 

96 gwf.add_job(job1) 

97 job2 = gwf.get_job("job1") 

98 self.assertIs(job1, job2) 

99 

100 def testGetJobError(self): 

101 job1 = gw.GenericWorkflowJob("job1") 

102 gwf = gw.GenericWorkflow("mytest") 

103 gwf.add_job(job1) 

104 with self.assertRaises(KeyError): 

105 _ = gwf.get_job("job_not_there") 

106 

107 def testSaveInvalidFormat(self): 

108 gwf = gw.GenericWorkflow("mytest") 

109 stream = io.BytesIO() 

110 with self.assertRaises(RuntimeError): 

111 gwf.save(stream, "badformat") 

112 

113 def testSavePickle(self): 

114 gwf = gw.GenericWorkflow("mytest") 

115 job1 = gw.GenericWorkflowJob("job1") 

116 job2 = gw.GenericWorkflowJob("job2") 

117 gwf.add_job(job1) 

118 gwf.add_job(job2) 

119 gwf.add_job_relationships("job1", "job2") 

120 stream = io.BytesIO() 

121 gwf.save(stream, "pickle") 

122 stream.seek(0) 

123 gwf2 = gw.GenericWorkflow.load(stream, "pickle") 

124 self.assertTrue( 

125 networkx.is_isomorphic(gwf, gwf2, node_match=iso.categorical_node_match("data", None)) 

126 ) 

127 

128 

129if __name__ == "__main__": 129 ↛ 130line 129 didn't jump to line 130, because the condition on line 129 was never true

130 unittest.main()