import EXOSIMS
import os
import glob
import sys
import EXOSIMS.MissionSim
import numpy as np
import tempfile
[docs]
def run_e2e_tests():
"""
End to End Test Suite for EXOSIMS
Run as:
>python e2eTests.py
This code will sequentially execute all script files found in:
``EXOSIMS_ROOT/EXOSIMS/Scripts/TestScripts``
and print a summary of the results. A script execution includes
instantiating a :py:class:`~EXOSIMS.MissionSim` object using the script, running a
simulation via :py:meth:`~EXOSIMS.MissionSim.MissionSim.run_sim`, resetting the
simulation using :py:meth:`~EXOSIMS.MissionSim.MissionSim.reset_sim`, and finally
re-running the simulation a second time. Possible outcomes for each test are:
PASS
FAIL - Instantiation
FAIL - Execution
FAIL - Reset
"""
# Locate all available test scripts
basedir = EXOSIMS.__path__[0]
testdir = os.path.join(basedir, "Scripts", "TestScripts")
if not os.path.isdir(testdir):
print(
"Cannot find test script directory in "
+ "EXOSIMS_ROOT/EXOSIMS/Scripts/TestScripts"
)
return
scripts = glob.glob(os.path.join(testdir, "*.json"))
if not scripts:
print("No test scripts found in %s" % testdir)
return
print("%d test scripts found" % len(scripts))
scripts = np.sort(scripts)
# Create a temporary cahce directory to ensure clean runs for everything
tmpdir = tempfile.gettempdir()
tmpcache = os.path.join(
tmpdir, ".EXOSIMS", "cache{}".format(np.random.randint(1e6))
)
os.makedirs(tmpcache)
assert os.path.exists(tmpcache)
print("Temporary cache will be: {}\n\n\n".format(tmpcache))
results = []
n = 0
for j, script in enumerate(scripts):
print(
"Running script: %s (%d/%d)"
% (os.path.basename(script), j + 1, len(scripts))
)
if len(os.path.basename(script)) > n:
n = len(os.path.basename(script))
try:
sim = EXOSIMS.MissionSim.MissionSim(script, cachedir=tmpcache)
except: # noqa: E722
print("Instantiation failed.")
print(sys.exc_info()[0])
print("\n\n\n")
results.append("FAIL - Instantiation")
continue
try:
_ = sim.run_sim()
except: # noqa: E722
print("Run failed.")
print(sys.exc_info()[0])
print("\n\n\n")
results.append("FAIL - Execution")
continue
try:
sim.reset_sim()
except: # noqa: E722
print("Reset failed.")
print(sys.exc_info()[0])
print("\n\n\n")
results.append("FAIL - Reset")
continue
try:
_ = sim.run_sim()
except: # noqa: E722
print("Second run failed.")
print(sys.exc_info()[0])
print("\n\n\n")
results.append("FAIL - Execution after Reset")
continue
del sim
results.append("PASS")
print("\n\n\n")
# results
print("Summary")
print("-" * 80)
for script, result in zip(scripts, results):
tmp = "{0:" + str(n + 5) + "} ==> {1}"
print(tmp.format(os.path.basename(script), result))
print("-" * 80)
if __name__ == "__main__":
run_e2e_tests()