Belle II Software  release-08-01-10
path_serialisation.py
1 #!/usr/bin/env python3
2 
3 
10 
11 import os
12 import shutil
13 import tempfile
14 from unittest import TestCase, main
15 
16 import basf2
17 from basf2 import pickle_path as b2pp
18 
19 # @cond internal_test
20 
21 
22 class PathSerialisationTestCase(TestCase):
23 
24  def setUp(self):
25  # Create a temporary directory
26  self.test_dir = tempfile.mkdtemp()
27  self.pickle_file = os.path.join(self.test_dir, "output.pkl")
28 
29  def tearDown(self):
30  # Remove the directory after the test
31  shutil.rmtree(self.test_dir)
32 
33  def check_if_paths_equal(self, path1, path2):
34  self.assertEqual(len(path1.modules()), len(path2.modules()))
35 
36  for module1, module2 in zip(path1.modules(), path2.modules()):
37  self.assertEqual(module1.name(), module2.name())
38  self.assertEqual(module1.type(), module2.type())
39  self.assertEqual(module1.description(), module2.description())
40  self.assertEqual(module1.package(), module2.package())
41 
42  self.assertEqual(len(module1.available_params()), len(module2.available_params()))
43  for param1, param2 in zip(module1.available_params(), module2.available_params()):
44  self.assertEqual(param1.name, param2.name)
45  self.assertEqual(param1.description, param2.description)
46  self.assertEqual(param1.values, param2.values)
47 
48  self.assertEqual(len(module1.get_all_conditions()), len(module2.get_all_conditions()))
49  for cond1, cond2 in zip(module1.get_all_conditions(), module2.get_all_conditions()):
50  self.assertEqual(cond1.get_value(), cond2.get_value())
51  self.assertEqual(cond1.get_operator(), cond2.get_operator())
52  self.assertEqual(cond1.get_after_path(), cond2.get_after_path())
53 
54  self.check_if_paths_equal(cond1.get_path(), cond2.get_path())
55 
56  def pickle_and_check(self, path):
57  b2pp.write_path_to_file(path, self.pickle_file)
58  pickled_path = b2pp.get_path_from_file(self.pickle_file)
59 
60  self.check_if_paths_equal(pickled_path, path)
61 
62  def test_simple_path(self):
63  path = basf2.create_path()
64  path.add_module("EventInfoSetter", evtNumList=[42])
65 
66  self.pickle_and_check(path)
67 
68  def test_condition_path(self):
69  path = basf2.create_path()
70  module = path.add_module("EventInfoSetter", evtNumList=[42])
71 
72  condition_path_1 = basf2.create_path()
73  condition_path_1.add_module("Geometry", components=["SVD"])
74  condition_path_2 = basf2.create_path()
75  condition_path_2.add_module("Geometry", components=["CDC"])
76 
77  module.if_value("<3", condition_path_1)
78  module.if_value(">5", condition_path_2)
79 
80  self.pickle_and_check(condition_path_1)
81  self.pickle_and_check(condition_path_2)
82  self.pickle_and_check(path)
83 
84  def test_high_level_things(self):
85  self.assertNotEqual(0, os.system('basf2 --execute-path /this/path/doesnot/exist'))
86 
87  pathFile = tempfile.NamedTemporaryFile(prefix='b2pathtest_')
88 
89  # uses Python modules, this should fail
90  steeringFile = basf2.find_file('framework/tests/module_paths.py')
91  self.assertNotEqual(0, os.system('basf2 --dump-path ' + pathFile.name + ' ' + steeringFile))
92 
93  # test actual execution
94  outputFile = tempfile.NamedTemporaryFile(prefix='b2pathtest_')
95 
96  path = basf2.create_path()
97  path.add_module('EventInfoSetter', evtNumList=[2, 1], expList=[1, 1], runList=[1, 2])
98  path.add_module('RootOutput', outputFileName=outputFile.name)
99 
100  # equivalent to --dump-path
101  basf2.set_pickle_path(pathFile.name)
102  basf2.process(path)
103 
104  # path dumped, but not executed
105  pathSize = os.stat(pathFile.name).st_size
106  self.assertNotEqual(0, pathSize)
107  self.assertEqual(0, os.stat(outputFile.name).st_size)
108 
109  # equivalent to --execute-path
110  self.assertEqual(basf2.get_pickle_path(), pathFile.name)
111  basf2.process(None)
112 
113  # path unmodified, output file created
114  self.assertEqual(pathSize, os.stat(pathFile.name).st_size)
115  self.assertNotEqual(0, os.stat(outputFile.name).st_size)
116 
117 
118 if __name__ == '__main__':
119  main()
120 
121 # @endcond
Definition: main.py:1