1*fb83dddaSLisandro Dalcin# Author: Lisandro Dalcin 2*fb83dddaSLisandro Dalcin# Contact: dalcinl@gmail.com 3*fb83dddaSLisandro Dalcinimport os 4*fb83dddaSLisandro Dalcinimport sys 55808f684SSatish Balayimport optparse 65808f684SSatish Balayimport unittest 75808f684SSatish Balay 8*fb83dddaSLisandro Dalcin__unittest = True 9*fb83dddaSLisandro Dalcin 10*fb83dddaSLisandro Dalcin 115808f684SSatish Balaydef getoptionparser(): 125808f684SSatish Balay parser = optparse.OptionParser() 135808f684SSatish Balay 145808f684SSatish Balay parser.add_option("-q", "--quiet", 155808f684SSatish Balay action="store_const", const=0, dest="verbose", default=1, 165808f684SSatish Balay help="do not print status messages to stdout") 175808f684SSatish Balay parser.add_option("-v", "--verbose", 185808f684SSatish Balay action="store_const", const=2, dest="verbose", default=1, 195808f684SSatish Balay help="print status messages to stdout") 205808f684SSatish Balay parser.add_option("-i", "--include", type="string", 215808f684SSatish Balay action="append", dest="include", default=[], 225808f684SSatish Balay help="include tests matching PATTERN", metavar="PATTERN") 235808f684SSatish Balay parser.add_option("-e", "--exclude", type="string", 245808f684SSatish Balay action="append", dest="exclude", default=[], 255808f684SSatish Balay help="exclude tests matching PATTERN", metavar="PATTERN") 261e51fb16SStefano Zampini parser.add_option("-k", "--pattern", type="string", 271e51fb16SStefano Zampini action="append", dest="patterns", default=[], 281e51fb16SStefano Zampini help="only run tests which match the given substring") 295808f684SSatish Balay parser.add_option("-f", "--failfast", 305808f684SSatish Balay action="store_true", dest="failfast", default=False, 315808f684SSatish Balay help="Stop on first failure") 325808f684SSatish Balay parser.add_option("--no-builddir", 335808f684SSatish Balay action="store_false", dest="builddir", default=True, 345808f684SSatish Balay help="disable testing from build directory") 355808f684SSatish Balay parser.add_option("--path", type="string", 365808f684SSatish Balay action="append", dest="path", default=[], 375808f684SSatish Balay help="prepend PATH to sys.path", metavar="PATH") 385808f684SSatish Balay parser.add_option("--arch", type="string", 395808f684SSatish Balay action="store", dest="arch", default=None, 405808f684SSatish Balay help="use PETSC_ARCH", 415808f684SSatish Balay metavar="PETSC_ARCH") 425808f684SSatish Balay parser.add_option("-s","--summary", 435808f684SSatish Balay action="store_true", dest="summary", default=0, 445808f684SSatish Balay help="print PETSc log summary") 45b254a87dSStefano Zampini parser.add_option("--no-memdebug", 46b254a87dSStefano Zampini action="store_false", dest="memdebug", default=True, 47b254a87dSStefano Zampini help="Do not use PETSc memory debugging") 485808f684SSatish Balay return parser 495808f684SSatish Balay 50*fb83dddaSLisandro Dalcin 515808f684SSatish Balaydef getbuilddir(): 52*fb83dddaSLisandro Dalcin try: 53*fb83dddaSLisandro Dalcin try: 54*fb83dddaSLisandro Dalcin from setuptools.dist import Distribution 55*fb83dddaSLisandro Dalcin except ImportError: 56*fb83dddaSLisandro Dalcin from distutils.dist import Distribution 57*fb83dddaSLisandro Dalcin try: 58*fb83dddaSLisandro Dalcin from setuptools.command.build import build 59*fb83dddaSLisandro Dalcin except ImportError: 60*fb83dddaSLisandro Dalcin from distutils.command.build import build 61*fb83dddaSLisandro Dalcin cmd_obj = build(Distribution()) 62*fb83dddaSLisandro Dalcin cmd_obj.finalize_options() 63*fb83dddaSLisandro Dalcin return cmd_obj.build_platlib 64*fb83dddaSLisandro Dalcin except Exception: 65*fb83dddaSLisandro Dalcin return None 66*fb83dddaSLisandro Dalcin 67*fb83dddaSLisandro Dalcin 68*fb83dddaSLisandro Dalcindef getprocessorinfo(): 69*fb83dddaSLisandro Dalcin try: 70*fb83dddaSLisandro Dalcin name = os.uname()[1] 71*fb83dddaSLisandro Dalcin except: 72*fb83dddaSLisandro Dalcin import platform 73*fb83dddaSLisandro Dalcin name = platform.uname()[1] 74*fb83dddaSLisandro Dalcin from petsc4py.PETSc import COMM_WORLD 75*fb83dddaSLisandro Dalcin rank = COMM_WORLD.getRank() 76*fb83dddaSLisandro Dalcin return (rank, name) 77*fb83dddaSLisandro Dalcin 78*fb83dddaSLisandro Dalcin 79*fb83dddaSLisandro Dalcindef getlibraryinfo(): 80*fb83dddaSLisandro Dalcin from petsc4py import PETSc 81*fb83dddaSLisandro Dalcin (major, minor, micro) = PETSc.Sys.getVersion() 82*fb83dddaSLisandro Dalcin r = PETSc.Sys.getVersionInfo()['release'] 83*fb83dddaSLisandro Dalcin if r: release = 'release' 84*fb83dddaSLisandro Dalcin else: release = 'development' 85*fb83dddaSLisandro Dalcin arch = PETSc.__arch__ 86*fb83dddaSLisandro Dalcin return ("PETSc %d.%d.%d %s (conf: '%s')" 87*fb83dddaSLisandro Dalcin % (major, minor, micro, release, arch) ) 88*fb83dddaSLisandro Dalcin 89*fb83dddaSLisandro Dalcin 90*fb83dddaSLisandro Dalcindef getpythoninfo(): 91*fb83dddaSLisandro Dalcin x, y, z = sys.version_info[:3] 92*fb83dddaSLisandro Dalcin return ("Python %d.%d.%d (%s)" % (x, y, z, sys.executable)) 93*fb83dddaSLisandro Dalcin 94*fb83dddaSLisandro Dalcin 95*fb83dddaSLisandro Dalcindef getpackageinfo(pkg): 96*fb83dddaSLisandro Dalcin try: 97*fb83dddaSLisandro Dalcin pkg = __import__(pkg) 98*fb83dddaSLisandro Dalcin except ImportError: 99*fb83dddaSLisandro Dalcin return None 100*fb83dddaSLisandro Dalcin name = pkg.__name__ 101*fb83dddaSLisandro Dalcin version = pkg.__version__ 102*fb83dddaSLisandro Dalcin path = pkg.__path__[0] 103*fb83dddaSLisandro Dalcin return ("%s %s (%s)" % (name, version, path)) 104*fb83dddaSLisandro Dalcin 1055808f684SSatish Balay 1065808f684SSatish Balaydef setup_python(options): 1075808f684SSatish Balay rootdir = os.path.dirname(os.path.dirname(__file__)) 1085808f684SSatish Balay builddir = os.path.join(rootdir, getbuilddir()) 1095808f684SSatish Balay if options.builddir and os.path.exists(builddir): 1105808f684SSatish Balay sys.path.insert(0, builddir) 1115808f684SSatish Balay if options.path: 1125808f684SSatish Balay path = options.path[:] 1135808f684SSatish Balay path.reverse() 1145808f684SSatish Balay for p in path: 1155808f684SSatish Balay sys.path.insert(0, p) 1165808f684SSatish Balay 117*fb83dddaSLisandro Dalcin 1185808f684SSatish Balaydef setup_unittest(options): 1195808f684SSatish Balay from unittest import TestSuite 1205808f684SSatish Balay try: 1215808f684SSatish Balay from unittest.runner import _WritelnDecorator 1225808f684SSatish Balay except ImportError: 1235808f684SSatish Balay from unittest import _WritelnDecorator 1245808f684SSatish Balay # 1255808f684SSatish Balay writeln_orig = _WritelnDecorator.writeln 1265808f684SSatish Balay def writeln(self, message=''): 1275808f684SSatish Balay try: self.stream.flush() 1285808f684SSatish Balay except: pass 1295808f684SSatish Balay writeln_orig(self, message) 1305808f684SSatish Balay try: self.stream.flush() 1315808f684SSatish Balay except: pass 1325808f684SSatish Balay _WritelnDecorator.writeln = writeln 1335808f684SSatish Balay 134*fb83dddaSLisandro Dalcin 1355808f684SSatish Balaydef import_package(options, pkgname): 136b254a87dSStefano Zampini args = [ sys.argv[0] ] 137b254a87dSStefano Zampini if options.memdebug: 138b254a87dSStefano Zampini args.append('-malloc') 139b254a87dSStefano Zampini args.append('-malloc_debug') 140b254a87dSStefano Zampini args.append('-malloc_dump') 1415808f684SSatish Balay if options.summary: 1425808f684SSatish Balay args.append('-log_view') 1435808f684SSatish Balay package = __import__(pkgname) 1445808f684SSatish Balay package.init(args, arch=options.arch) 1455808f684SSatish Balay 1465808f684SSatish Balay 147*fb83dddaSLisandro Dalcindef print_banner(options): 148*fb83dddaSLisandro Dalcin r, n = getprocessorinfo() 149*fb83dddaSLisandro Dalcin prefix = "[%d@%s]" % (r, n) 1505808f684SSatish Balay 1515808f684SSatish Balay def writeln(message='', endl='\n'): 152*fb83dddaSLisandro Dalcin if message is None: 153*fb83dddaSLisandro Dalcin return 1545808f684SSatish Balay from petsc4py.PETSc import Sys 155*fb83dddaSLisandro Dalcin message = "%s %s" % (prefix, message) 1565808f684SSatish Balay Sys.syncPrint(message, endl=endl, flush=True) 1575808f684SSatish Balay 1585808f684SSatish Balay if options.verbose: 159*fb83dddaSLisandro Dalcin writeln(getpythoninfo()) 160*fb83dddaSLisandro Dalcin writeln(getpackageinfo('numpy')) 161*fb83dddaSLisandro Dalcin writeln(getlibraryinfo()) 162*fb83dddaSLisandro Dalcin writeln(getpackageinfo('petsc4py')) 163*fb83dddaSLisandro Dalcin 1645808f684SSatish Balay 1655808f684SSatish Balaydef load_tests(options, args): 1665808f684SSatish Balay from glob import glob 1675808f684SSatish Balay import re 1685808f684SSatish Balay testsuitedir = os.path.dirname(__file__) 1695808f684SSatish Balay sys.path.insert(0, testsuitedir) 1705808f684SSatish Balay pattern = 'test_*.py' 1715808f684SSatish Balay wildcard = os.path.join(testsuitedir, pattern) 1725808f684SSatish Balay testfiles = glob(wildcard) 1735808f684SSatish Balay testfiles.sort() 1745808f684SSatish Balay testsuite = unittest.TestSuite() 1755808f684SSatish Balay testloader = unittest.TestLoader() 1761e51fb16SStefano Zampini if options.patterns: 1771e51fb16SStefano Zampini testloader.testNamePatterns = [ 1781e51fb16SStefano Zampini ('*%s*' % p) if ('*' not in p) else p 1791e51fb16SStefano Zampini for p in options.patterns] 1805808f684SSatish Balay include = exclude = None 1815808f684SSatish Balay if options.include: 1825808f684SSatish Balay include = re.compile('|'.join(options.include)).search 1835808f684SSatish Balay if options.exclude: 1845808f684SSatish Balay exclude = re.compile('|'.join(options.exclude)).search 1855808f684SSatish Balay for testfile in testfiles: 1865808f684SSatish Balay filename = os.path.basename(testfile) 1875808f684SSatish Balay testname = os.path.splitext(filename)[0] 1885808f684SSatish Balay if ((exclude and exclude(testname)) or 1895808f684SSatish Balay (include and not include(testname))): 1905808f684SSatish Balay continue 1915808f684SSatish Balay module = __import__(testname) 1925808f684SSatish Balay for arg in args: 1935808f684SSatish Balay try: 1945808f684SSatish Balay cases = testloader.loadTestsFromNames((arg,), module) 1955808f684SSatish Balay testsuite.addTests(cases) 1965808f684SSatish Balay except AttributeError: 1975808f684SSatish Balay pass 1985808f684SSatish Balay if not args: 1995808f684SSatish Balay cases = testloader.loadTestsFromModule(module) 2005808f684SSatish Balay testsuite.addTests(cases) 2015808f684SSatish Balay return testsuite 2025808f684SSatish Balay 203*fb83dddaSLisandro Dalcin 2045808f684SSatish Balaydef run_tests(options, testsuite, runner=None): 2055808f684SSatish Balay if runner is None: 2065808f684SSatish Balay runner = unittest.TextTestRunner(verbosity=options.verbose) 2075808f684SSatish Balay runner.failfast = options.failfast 2085808f684SSatish Balay result = runner.run(testsuite) 2095808f684SSatish Balay return result.wasSuccessful() 2105808f684SSatish Balay 211*fb83dddaSLisandro Dalcin 2125808f684SSatish Balay 2135808f684SSatish Balaydef abort(code=1): 2145808f684SSatish Balay os.abort() 2155808f684SSatish Balay 216*fb83dddaSLisandro Dalcin 2175808f684SSatish Balaydef shutdown(success): 2185808f684SSatish Balay pass 2195808f684SSatish Balay 220*fb83dddaSLisandro Dalcin 2215808f684SSatish Balaydef main(args=None): 2225808f684SSatish Balay pkgname = 'petsc4py' 2235808f684SSatish Balay parser = getoptionparser() 2245808f684SSatish Balay (options, args) = parser.parse_args(args) 2255808f684SSatish Balay setup_python(options) 2265808f684SSatish Balay setup_unittest(options) 227*fb83dddaSLisandro Dalcin import_package(options, pkgname) 228*fb83dddaSLisandro Dalcin print_banner(options) 2295808f684SSatish Balay testsuite = load_tests(options, args) 2305808f684SSatish Balay success = run_tests(options, testsuite) 2315808f684SSatish Balay if not success and options.failfast: abort() 2325808f684SSatish Balay shutdown(success) 2335808f684SSatish Balay return not success 2345808f684SSatish Balay 235*fb83dddaSLisandro Dalcin 2365808f684SSatish Balayif __name__ == '__main__': 2375808f684SSatish Balay import sys 2385808f684SSatish Balay sys.dont_write_bytecode = True 2395808f684SSatish Balay sys.exit(main()) 240