7from subprocess
import PIPE, Popen
14timing_hard_fail =
"--timing-hard-fail" in sys.argv
16SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
17EGS_HOME = os.environ[
"EGS_HOME"]
18EGS_BRACHY = os.path.join(EGS_HOME,
"egs_brachy")
20USER_CODE =
"egs_brachy"
21TEST_EGSINP_FILE =
"eb_test_run"
22TEST_EGSINP_PATH_ROOT = os.path.join(EGS_BRACHY, TEST_EGSINP_FILE)
23TEST_EGSINP_PATH = TEST_EGSINP_PATH_ROOT +
".egsinp"
26PASS_FMT =
"%(pass_fail)s - %(test)s - ran in %(actual_time).3G s/MHz (%(real_time).3G s)"
28TIMING_WARN_FMT =
"""%(pass_fail)s - %(test)s
29 Timing: %(timing_pass_fail)s
30 Limit: %(time_limit).3G s/MHz
31 Actual : %(actual_time).3G s/MHz
32 Results: %(results_pass_fail)s
35FAIL_FMT =
"""%(pass_fail)s - %(test)s
36 Timing: %(timing_pass_fail)s
37 Limit: %(time_limit).3G s/MHz
38 Actual : %(actual_time).3G s/MHz
39 Results: %(results_pass_fail)s
40 Expected: %(expected_results)s
41 Actual : %(actual_results)s
44cpu_speed_cmd =
"""grep -i "cpu mhz" /proc/cpuinfo | tail -1 | awk -F ":" '{print $2}'"""
49 CPU_MHZ = float(os.environ[
"CPU_MHZ"])
50 source =
"CPU_MHZ env variable"
51 except (ValueError, KeyError):
54 p = Popen(cpu_speed_cmd, shell=
True,
55 stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=
True)
56 (stdin, stdout, stderr) = (p.stdin, p.stdout, p.stderr)
57 CPU_MHZ = float(stdout.read())
58 source =
"/proc/cpuinfo"
60 print((
"CPU speed read from %s as %f MHz" % (source, CPU_MHZ)))
62except (ValueError, TypeError):
64 "Unable to determine CPU speed. You must set CPU_MHZ "
65 "environment variable before running the test suite."
72 mod = __import__(name)
73 components = name.split(
'.')
74 for comp
in components[1:]:
75 mod = getattr(mod, comp)
80 egsinp = test_module.EGSINP
81 path_components = test_module.__name__.split(
".") + [egsinp]
82 src = os.path.join(SCRIPT_DIR, *path_components)
83 shutil.copy(src, TEST_EGSINP_PATH)
88 return float(re.findall(
"Finished simulation.*?CPU time:(.*?)s.*", egslst, re.S)[0])
95 command =
"%s -i %s" % (USER_CODE, TEST_EGSINP_FILE)
96 p = Popen(command, shell=
True, cwd=EGS_BRACHY,
97 stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=
True)
98 (stdin, stdout, stderr) = (p.stdin, p.stdout, p.stderr)
99 egslst = stdout.read()
100 errors = stderr.read()
101 if not isinstance(egslst, str):
102 egslst = egslst.decode(
"utf-8")
103 errors = errors.decode(
"utf-8")
106 return egslst, errors, cpu_time/CPU_MHZ
110 to_clean = glob.glob(TEST_EGSINP_PATH_ROOT+
".*")
112 if os.path.dirname(os.path.abspath(f)) != os.path.abspath(EGS_BRACHY):
116 except PermissionError
as e:
118 print(
"{} was not deleted because of a permission error.".format(os.path.basename(f)))
122 if len(sys.argv) > 1:
123 test_path = os.path.normpath(sys.argv[1])
124 if not os.path.isabs(test_path):
125 test_path = os.path.join(SCRIPT_DIR, test_path)
126 tests = glob.glob(os.path.join(test_path,
"__init__.py"))
128 tests = glob.glob(os.path.join(SCRIPT_DIR,
"eb_tests",
"*",
"__init__.py"))
130 rel = os.path.relpath
132 rel(x, SCRIPT_DIR).replace(os.path.join(os.path.sep,
"__init__.py"),
"").replace(os.path.sep,
".")
142 orig_cwd = os.getcwd()
145 print((
"Running test '%s'..." % (t,)))
149 time_limit = test_module.TIME_LIMIT_S_PER_MHZ
157 print(
"Simulation did not complete. egs_brachy crash likely")
160 results_pass, actual_results, expected_results = test_module.compare_results(egslst, TEST_EGSINP_FILE)
162 print((
"Exception while running test '%s'..." % t))
163 traceback.print_exc()
168 timing_passes = actual_time <= TIMING_MARGIN*time_limit
169 if not timing_passes
and not timing_hard_fail:
172 passes = results_pass
and timing_passes
if timing_hard_fail
else results_pass
174 pass_count += int(passes)
176 if results_pass
and timing_passes:
179 fmt = TIMING_WARN_FMT
185 "pass_fail": [
"FAIL",
"PASS"][passes],
186 "time_limit": time_limit,
187 "actual_time": actual_time,
188 "real_time": actual_time*CPU_MHZ,
189 "timing_pass_fail": [
"FAIL",
"PASS"][timing_passes],
190 "expected_results": expected_results,
191 "actual_results": actual_results,
192 "results_pass_fail": [
"FAIL",
"PASS"][results_pass],
198 print((
"Tests finished %d/%d passed with %d warnings" % (pass_count, len(all_tests), warn_count)))
200if __name__ ==
"__main__":
create_egsinp(test_module)