Hide keyboard shortcuts

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 

25 

26import lsst.ctrl.bps.generic_workflow as gw 

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 

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) 

44 

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) 

53 

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())) 

62 

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())) 

73 

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())) 

84 

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())) 

93 

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) 

100 

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") 

107 

108 def testSaveInvalidFormat(self): 

109 gwf = gw.GenericWorkflow("mytest") 

110 stream = io.BytesIO() 

111 with self.assertRaises(RuntimeError): 

112 gwf.save(stream, "badformat") 

113 

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))) 

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()