Belle II Software development
test_framework.py
1# disable doxygen check for this file
2# @cond
3
4
11import basf2 as b2
12import os
13import shutil
14import glob
15
16from caf.framework import Calibration, CAF
17
18import unittest
19from unittest import TestCase
20from pathlib import Path
21
22# show only Errors as we'll be setting off a lot of ugly deliberate warnings
23b2.set_log_level(b2.LogLevel.ERROR)
24
25
26class TestCalibrationClass_Configure(TestCase):
27 """
28 UnitTest for configuration of Calibration class
29 """
30
31 def setUp(self):
32 """
33 Create useful objects for each test
34 """
35 from ROOT import Belle2 # noqa: make the Belle2 namespace available
36 from ROOT.Belle2 import TestCalibrationAlgorithm as TestAlgo
37
38 self.alg1 = TestAlgo()
39
40 self.alg2 = TestAlgo()
41
42 self.col1 = b2.register_module('CaTest')
43
44 self.example_file1 = Path("example1.root")
45 self.example_file2 = Path("example2.root")
46 self.example_file1.touch()
47 self.example_file2.touch()
48
49 def test_1(self):
50 """
51 Test whether or not calibration is valid with incorrect setup.
52 """
53 cal = Calibration('TestCalibrationClass_Configure_test1')
54 self.assertFalse(cal.is_valid())
55
56 def test_2(self):
57 """
58 Test whether or not calibration is valid with incorrect setup.
59 """
60 cal = Calibration('TestCalibrationClass_Configure_test2')
61 cal.collector = 'CaTest'
62 self.assertFalse(cal.is_valid())
63
64 def test_3(self):
65 """
66 Test whether or not calibration is valid with incorrect setup.
67 """
68 cal = Calibration('TestCalibrationClass_Configure_test3')
69 cal.collector = self.col1
70 self.assertFalse(cal.is_valid())
71
72 def test_4(self):
73 """
74 Test whether or not calibration is valid with incorrect setup.
75 """
76 cal = Calibration('TestCalibrationClass_Configure_test4')
77 cal.collector = self.col1
78 cal.algorithms = [self.alg1, self.alg2]
79 self.assertFalse(cal.is_valid())
80
81 def test_5(self):
82 """
83 Test whether or not calibration is valid with correct setup.
84 """
85 cal = Calibration('TestCalibrationClass_Configure_test5')
86 cal.collector = self.col1
87 cal.algorithms = [self.alg1, self.alg2]
88 cal.input_files = self.example_file1.as_posix()
89 self.assertTrue(cal.is_valid())
90
91 def test_6(self):
92 """
93 Test whether or not calibration is valid with alternative correct setup.
94 """
95 cal = Calibration('TestCalibrationClass_Configure_test6')
96 cal.collector = self.col1
97 cal.algorithms = [self.alg1, self.alg2]
98 cal.input_files = [self.example_file1.as_posix(), self.example_file2.as_posix()]
99 self.assertTrue(cal.is_valid())
100
101 def tearDown(self):
102 self.example_file1.unlink()
103 self.example_file2.unlink()
104
105
106class TestCalibrationClass_Args(TestCase):
107 """
108 UnitTest for validity of Calibration class when given arguments of different types
109 """
110
111 def setUp(self):
112 """
113 Create useful objects for each test
114 """
115 from ROOT import Belle2 # noqa: make the Belle2 namespace available
116 from ROOT.Belle2 import TestCalibrationAlgorithm as TestAlgo
117
118
119 self.alg1 = TestAlgo()
120
121 self.alg2 = TestAlgo()
122
123 self.col1 = b2.register_module('CaTest')
124
125 self.name = 'TestCalibration'
126
127 self.example_file1 = Path("example1.root")
128 self.example_file2 = Path("example2.root")
129 self.example_file1.touch()
130 self.example_file2.touch()
131
132 def test_1(self):
133 """
134 Test whether or not calibration is valid with correct setup and if name is stored correctly
135 """
136 cal = Calibration(
137 self.name,
138 collector=self.col1,
139 algorithms=[
140 self.alg1,
141 self.alg2],
142 input_files=self.example_file2.as_posix())
143 self.assertTrue(cal.is_valid() and cal.name == self.name)
144
145 def test_2(self):
146 """
147 Test whether or not calibration is valid with alternative correct setup and if name is stored correctly
148 """
149 cal = Calibration(self.name, 'CaTest', self.alg1, input_files=self.example_file1.as_posix())
150 self.assertTrue(cal.is_valid() and cal.name == self.name)
151
152 def test_3(self):
153 """
154 Test that the default options are correctly applied to a calibration
155 """
156 defaults = {"max_iterations": 4}
157 cal1 = Calibration(self.name, collector=self.col1, algorithms=[self.alg1], input_files=self.example_file1.as_posix())
158 cal1._apply_calibration_defaults(defaults)
159 cal2 = Calibration(self.name, collector=self.col1, algorithms=[self.alg1], input_files=self.example_file2.as_posix())
160 self.assertTrue(cal1.max_iterations == 4 and not cal2.max_iterations)
161
162 def tearDown(self):
163 self.example_file1.unlink()
164 self.example_file2.unlink()
165
166
167class TestCAF(TestCase):
168 """
169 UnitTest for configuration and simple running of CAF
170 """
171
172 def setUp(self):
173 """
174 Create useful objects for each test and the teardown
175 """
176 from ROOT import Belle2 # noqa: make the Belle2 namespace available
177 from ROOT.Belle2 import TestCalibrationAlgorithm as TestAlgo
178
179
180 self.name1 = 'TestCalibration1'
181
182 self.name2 = 'TestCalibration2'
183
184 self.name3 = 'TestCalibration3'
185 alg = TestAlgo()
186 col = b2.register_module('CaTest')
187
188 self.example_file1 = Path("example1.root")
189 self.example_file1.touch()
190
191 self.cal1 = Calibration(self.name1, col, alg, self.example_file1.as_posix())
192
193 self.cal2 = Calibration(self.name2, col, alg, self.example_file1.as_posix())
194
195 self.cal3 = Calibration(self.name3, col, alg, self.example_file1.as_posix())
196
197 def test_add_calibration(self):
198 """
199 Test that add_calibration function results in correct output
200 """
201 fw = CAF()
202 fw.add_calibration(self.cal1)
203 fw.add_calibration(self.cal2)
204 self.assertTrue(fw.calibrations[self.name1].name == self.name1 and fw.calibrations[self.name2].name == self.name2)
205
206 def test_add_dependency_on_itself(self):
207 """
208 Test that add_dependency function cannot add itself
209 """
210 self.cal1.depends_on(self.cal1)
211 self.assertFalse(self.cal1.dependencies)
212
213 def test_make_output_dir(self):
214 """
215 Test that output_dir directory is created correctly
216 """
217 fw = CAF()
218 fw.output_dir = 'testCAF_outputdir'
219 fw._make_output_dir()
220 self.assertTrue(os.path.isdir('testCAF_outputdir'))
221
222 def test_config_output_dir(self):
223 """
224 Test that config is correctly setting the default output path.
225 """
226 fw = CAF()
227 self.assertTrue(fw.output_dir == 'calibration_results')
228
229 def tearDown(self):
230 """
231 Removes files that were created during these tests
232 """
233 self.example_file1.unlink()
234 dirs = glob.glob('*testCAF_outputdir')
235 for directory in dirs:
236 shutil.rmtree(directory)
237
238
239def main():
240 unittest.main()
241
242
243if __name__ == '__main__':
244 main()
245
246# @endcond
Definition main.py:1