Belle II Software development
tutorials_B2A9XX.py
1#!/usr/bin/env python3
2
3
10
11import os
12import sys
13import subprocess
14import unittest
15import glob
16from basf2 import find_file
17from b2test_utils import clean_working_directory, configure_logging_for_tests
18from b2test_utils_analysis import scanTTree
19
20
21class TutorialsTest(unittest.TestCase):
22 """Test to run all B2A9XX tutorials. Will fail if no tutorial directory is found."""
23
24
25 broken_tutorials = ['B2A910-ApplyKsSelector.py']
26
27 do_not_overwrite = ['B2A911-CreateTrainData.py']
28
29 @unittest.skipIf(not os.getenv('BELLE2_EXAMPLES_DATA_DIR'),
30 "$BELLE2_EXAMPLES_DATA_DIR not found.")
31 @unittest.skipIf(not os.getenv('BELLE2_VALIDATION_DATA_DIR'),
32 "$BELLE2_VALIDATION_DATA_DIR not found.")
33 def test_tutorials(self):
34 """
35 Test supported tutorials.
36 """
37 configure_logging_for_tests()
38 all_tutorials = sorted(glob.glob(find_file('analysis/examples/tutorials/') + "/B2A9*.py"))
39 for tutorial in all_tutorials:
40 filename = os.path.basename(tutorial)
41 if filename not in self.broken_tutorials:
42 with self.subTest(msg=filename):
43 outputfilename = filename.replace('.py', '.root')
44 if filename not in self.do_not_overwrite:
45 result = subprocess.run(['basf2', '-n100', tutorial, '-o', outputfilename],
46 stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
47 else:
48 result = subprocess.run(['basf2', '-n100', tutorial],
49 stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
50
51 if result.returncode != 0:
52 # failure running tutorial so let's print the output
53 # on stderr so it's not split from output of unittest
54 # done like this since we don't want to decode/encode utf8
55 sys.stdout.buffer.write(result.stdout)
56 self.assertEqual(result.returncode, 0)
57
58 if os.path.exists(outputfilename):
59 scanTTree(outputfilename)
60
61
62if __name__ == '__main__':
63 with clean_working_directory():
64 unittest.main()
list do_not_overwrite
list of the tutorials whose output file name cannot be overwritten
list broken_tutorials
list of the broken tutorials (to be removed when they are individually fixed)