OpenMC/tests/run_tests.py
2014-03-10 17:43:27 -04:00

160 lines
5.3 KiB
Python
Executable file

#!/usr/bin/env python
from __future__ import print_function
import os
import sys
import nose
import glob
import shutil
from subprocess import call
from nose_mpi import NoseMPI
def run_compile():
print('-'*17)
print('Compilation tests')
print('-'*17)
# clean up all previous executables
openmc_exe = glob.glob(pwd + '/../src/openmc*')
for exe in openmc_exe:
os.remove(exe)
# run compile test
result = nose.run(argv=['nosetests', 'test_compile'] + flags)
if not result:
print('Did not pass compile tests.')
results.append(('compile', result))
def run_suite(name=None, mpi=False):
print('-'*(len(name) + 6))
print(name + ' tests')
print('-'*(len(name) + 6))
# Set arguments list. Note that the first argument is a dummy argument (the
# script name). It's not actually recursively calling run_tests.py
argv = ['nosetests', '--exclude', 'test_compile'] + flags
# Add MPI plugin if set
if mpi:
plugins = [NoseMPI()]
argv += ['--mpi-np', '3', '--mpi-exec', mpiexec]
else:
plugins = None
try:
os.chdir(pwd)
shutil.copyfile(pwd + '/../src/openmc-' + name, pwd + '/../src/openmc')
result = nose.run(argv=argv, addplugins=plugins)
except OSError:
result = False
print('No OpenMC executable found for ' + name + ' tests')
if not result:
print('Did not pass ' + name + ' tests')
results.append((name, result))
# set mpiexec path
if 'COMPILER' in os.environ:
compiler = os.environ['COMPILER']
else:
compiler = 'gnu'
mpiexec = '/opt/mpich/3.0.4-{0}/bin/mpiexec'.format(compiler)
# get current working directory
pwd = os.getcwd()
sys.path.append(pwd)
# Set list of tests, either default or from command line
flags = []
tests = ['compile', 'normal', 'debug', 'optimize',
'omp', 'omp-debug', 'omp-optimize',
'hdf5', 'hdf5-debug', 'hdf5-optimize',
'omp-hdf5', 'omp-hdf5-debug', 'omp-hdf5-optimize',
'mpi', 'mpi-debug', 'mpi-optimize',
'mpi-omp', 'mpi-omp-debug', 'mpi-omp-optimize',
'phdf5', 'phdf5-debug', 'phdf5-optimize',
'phdf5-omp', 'phdf5-omp-debug', 'phdf5-omp-optimize',
'petsc', 'petsc-debug', 'petsc-optimize',
'phdf5-petsc', 'phdf5-petsc-debug', 'phdf5-petsc-optimize',
'omp-phdf5-petsc', 'omp-phdf5-petsc-debug',
'omp-phdf5-petsc-optimize']
if len(sys.argv) > 1:
flags = [i for i in sys.argv[1:] if i.startswith('-')]
tests_ = [i for i in sys.argv[1:] if not i.startswith('-')]
# Check for special subsets of tests
tests__ = []
for i in tests_:
# All tests will run all the tests except for compile unless
# it is also specified on the command line. Note that specifying
# compile all-tests is the same as not specifying any args
if i == 'all-tests':
tests__ = tests
try:
idx = tests_.index('compile') # check for compile test
except ValueError:
del tests__[0]
finally:
break # don't need to check for anything else
# This checks for any subsets of tests. The string after
# all-XXXX will be used to search through all tests.
# Specifying XXXX=normal will run tests that don't contain
# debug or optimize substring.
if i.startswith('all-'):
suffix = i.split('all-')[1]
if suffix == 'normal':
for j in tests:
if j.rfind('debug') == -1 and \
j.rfind('optimize') == -1:
tests__.append(j)
else:
for j in tests:
if j.rfind(suffix) != -1:
if suffix == 'omp' and j == 'compile':
continue
if j == 'compile':
continue
tests__.append(j)
else:
tests__.append(i) # append specific test (e.g., mpi-debug)
tests = tests__ if tests__ else tests
# Run tests
results = []
for name in tests:
if name == 'compile':
run_compile()
elif name in ['normal', 'debug', 'optimize',
'hdf5', 'hdf5-debug', 'hdf5-optimize',
'omp', 'omp-debug', 'omp-optimize',
'omp-hdf5', 'omp-hdf5-debug', 'omp-hdf5-optimize']:
run_suite(name=name)
elif name in ['mpi', 'mpi-debug', 'mpi-optimize',
'mpi-omp', 'mpi-omp-debug', 'mpi-omp-optimize',
'phdf5', 'phdf5-debug', 'phdf5-optimize',
'phdf5-omp', 'phdf5-omp-debug', 'phdf5-omp-optimize',
'petsc', 'petsc-debug', 'petsc-optimize',
'phdf5-petsc', 'phdf5-petsc-debug', 'phdf5-petsc-optimize',
'omp-phdf5-petsc', 'omp-phdf5-petsc-debug',
'omp-phdf5-petsc-optimize']:
run_suite(name=name, mpi=True)
# print out summary of results
print('\n' + '='*54)
print('Summary of Compilation Option Testing:\n')
OK = '\033[92m'
FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = '\033[1m'
for name, result in results:
print(name + '.'*(50 - len(name)), end='')
if result:
print(BOLD + OK + '[OK]' + ENDC)
else:
print(BOLD + FAIL + '[FAILED]' + ENDC)