7from subprocess
import PIPE, Popen
14timing_hard_fail =
"--timing-hard-fail" in sys.argv
16EGS_HOME = os.environ[
"EGS_HOME"]
17EGS_BRACHY = os.path.join(EGS_HOME,
"egs_brachy")
19USER_CODE =
"egs_brachy"
20TEST_EGSINP_FILE =
"eb_test_run"
21TEST_EGSINP_PATH_ROOT = os.path.join(EGS_BRACHY, TEST_EGSINP_FILE)
22TEST_EGSINP_PATH = TEST_EGSINP_PATH_ROOT +
".egsinp"
25PASS_FMT =
"%(pass_fail)s - %(test)s - ran in %(actual_time).3G s/MHz (%(real_time).3G s)"
27TIMING_WARN_FMT =
"""%(pass_fail)s - %(test)s
28 Timing: %(timing_pass_fail)s
29 Limit: %(time_limit).3G s/MHz
30 Actual : %(actual_time).3G s/MHz
31 Results: %(results_pass_fail)s
34FAIL_FMT =
"""%(pass_fail)s - %(test)s
35 Timing: %(timing_pass_fail)s
36 Limit: %(time_limit).3G s/MHz
37 Actual : %(actual_time).3G s/MHz
38 Results: %(results_pass_fail)s
39 Expected: %(expected_results)s
40 Actual : %(actual_results)s
43cpu_speed_cmd =
"""grep -i "cpu mhz" /proc/cpuinfo | tail -1 | awk -F ":" '{print $2}'"""
48 CPU_MHZ = float(os.environ[
"CPU_MHZ"])
49 source =
"CPU_MHZ env variable"
50 except (ValueError, KeyError):
53 p = Popen(cpu_speed_cmd, shell=
True,
54 stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=
True)
55 (stdin, stdout, stderr) = (p.stdin, p.stdout, p.stderr)
56 CPU_MHZ = float(stdout.read())
57 source =
"/proc/cpuinfo"
59 print((
"CPU speed read from %s as %f MHz" % (source, CPU_MHZ)))
61except (ValueError, TypeError):
63 "Unable to determine CPU speed. You must set CPU_MHZ "
64 "environment variable before running the test suite."
71 mod = __import__(name)
72 components = name.split(
'.')
73 for comp
in components[1:]:
74 mod = getattr(mod, comp)
79 egsinp = test_module.EGSINP
80 path_components = test_module.__name__.split(
".") + [egsinp]
81 src = os.path.join(*path_components)
82 shutil.copy(src, TEST_EGSINP_PATH)
87 return float(re.findall(
"Finished simulation.*?CPU time:(.*?)s.*", egslst, re.S)[0])
94 command =
"%s -i %s" % (USER_CODE, TEST_EGSINP_FILE)
95 p = Popen(command, shell=
True,
96 stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=
True)
97 (stdin, stdout, stderr) = (p.stdin, p.stdout, p.stderr)
98 egslst = stdout.read()
99 errors = stderr.read()
100 if not isinstance(egslst, str):
101 egslst = egslst.decode(
"utf-8")
102 errors = errors.decode(
"utf-8")
105 return egslst, errors, cpu_time/CPU_MHZ
109 to_clean = glob.glob(TEST_EGSINP_PATH_ROOT+
".*")
112 file_is_in_current_dir = os.path.dirname(f) == os.path.dirname(os.path.abspath(__file__))
113 if file_is_in_current_dir:
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 tests = glob.glob(os.path.join(os.path.normpath(sys.argv[1]),
"__init__.py"))
125 tests = glob.glob(
"eb_tests/*/__init__.py")
127 return [x.replace(os.path.join(os.path.sep,
"__init__.py"),
"").replace(os.path.sep,
".")
for x
in tests]
137 print((
"Running test '%s'..." % (t,)))
141 time_limit = test_module.TIME_LIMIT_S_PER_MHZ
149 print(
"Simulation did not complete. egs_brachy crash likely")
151 results_pass, actual_results, expected_results = test_module.compare_results(egslst, TEST_EGSINP_FILE)
153 print((
"Exception while running test '%s'..." % t))
154 traceback.print_exc()
157 timing_passes = actual_time <= TIMING_MARGIN*time_limit
158 if not timing_passes
and not timing_hard_fail:
161 passes = results_pass
and timing_passes
if timing_hard_fail
else results_pass
163 pass_count += int(passes)
165 if results_pass
and timing_passes:
168 fmt = TIMING_WARN_FMT
174 "pass_fail": [
"FAIL",
"PASS"][passes],
175 "time_limit": time_limit,
176 "actual_time": actual_time,
177 "real_time": actual_time*CPU_MHZ,
178 "timing_pass_fail": [
"FAIL",
"PASS"][timing_passes],
179 "expected_results": expected_results,
180 "actual_results": actual_results,
181 "results_pass_fail": [
"FAIL",
"PASS"][results_pass],
187 print((
"Tests finished %d/%d passed with %d warnings" % (pass_count, len(all_tests), warn_count)))
189if __name__ ==
"__main__":
create_egsinp(test_module)