1fb83dddaSLisandro Dalcin# Author: Lisandro Dalcin 2fb83dddaSLisandro Dalcin# Contact: dalcinl@gmail.com 3fb83dddaSLisandro Dalcinimport os 4fb83dddaSLisandro Dalcinimport sys 55808f684SSatish Balayimport optparse 65808f684SSatish Balayimport unittest 75808f684SSatish Balay 8fb83dddaSLisandro Dalcin__unittest = True 9fb83dddaSLisandro Dalcin 10f46a955bSLisandro Dalcincomponents = [ 11f46a955bSLisandro Dalcin 'PETSc', 12f46a955bSLisandro Dalcin] 13f46a955bSLisandro Dalcin 14fb83dddaSLisandro Dalcin 155808f684SSatish Balaydef getoptionparser(): 165808f684SSatish Balay parser = optparse.OptionParser() 175808f684SSatish Balay 185808f684SSatish Balay parser.add_option("-q", "--quiet", 195808f684SSatish Balay action="store_const", const=0, dest="verbose", default=1, 205808f684SSatish Balay help="do not print status messages to stdout") 215808f684SSatish Balay parser.add_option("-v", "--verbose", 225808f684SSatish Balay action="store_const", const=2, dest="verbose", default=1, 235808f684SSatish Balay help="print status messages to stdout") 245808f684SSatish Balay parser.add_option("-i", "--include", type="string", 255808f684SSatish Balay action="append", dest="include", default=[], 265808f684SSatish Balay help="include tests matching PATTERN", metavar="PATTERN") 275808f684SSatish Balay parser.add_option("-e", "--exclude", type="string", 285808f684SSatish Balay action="append", dest="exclude", default=[], 295808f684SSatish Balay help="exclude tests matching PATTERN", metavar="PATTERN") 301e51fb16SStefano Zampini parser.add_option("-k", "--pattern", type="string", 311e51fb16SStefano Zampini action="append", dest="patterns", default=[], 321e51fb16SStefano Zampini help="only run tests which match the given substring") 335808f684SSatish Balay parser.add_option("-f", "--failfast", 345808f684SSatish Balay action="store_true", dest="failfast", default=False, 355808f684SSatish Balay help="Stop on first failure") 365808f684SSatish Balay parser.add_option("--no-builddir", 375808f684SSatish Balay action="store_false", dest="builddir", default=True, 385808f684SSatish Balay help="disable testing from build directory") 395808f684SSatish Balay parser.add_option("--path", type="string", 405808f684SSatish Balay action="append", dest="path", default=[], 415808f684SSatish Balay help="prepend PATH to sys.path", metavar="PATH") 425808f684SSatish Balay parser.add_option("--arch", type="string", 435808f684SSatish Balay action="store", dest="arch", default=None, 445808f684SSatish Balay help="use PETSC_ARCH", 455808f684SSatish Balay metavar="PETSC_ARCH") 465808f684SSatish Balay parser.add_option("-s","--summary", 475808f684SSatish Balay action="store_true", dest="summary", default=0, 485808f684SSatish Balay help="print PETSc log summary") 49b254a87dSStefano Zampini parser.add_option("--no-memdebug", 50b254a87dSStefano Zampini action="store_false", dest="memdebug", default=True, 51b254a87dSStefano Zampini help="Do not use PETSc memory debugging") 525808f684SSatish Balay return parser 535808f684SSatish Balay 54fb83dddaSLisandro Dalcin 555808f684SSatish Balaydef getbuilddir(): 56fb83dddaSLisandro Dalcin try: 57fb83dddaSLisandro Dalcin try: 58fb83dddaSLisandro Dalcin from setuptools.dist import Distribution 59fb83dddaSLisandro Dalcin except ImportError: 60fb83dddaSLisandro Dalcin from distutils.dist import Distribution 61fb83dddaSLisandro Dalcin try: 62fb83dddaSLisandro Dalcin from setuptools.command.build import build 63fb83dddaSLisandro Dalcin except ImportError: 64fb83dddaSLisandro Dalcin from distutils.command.build import build 65fb83dddaSLisandro Dalcin cmd_obj = build(Distribution()) 66fb83dddaSLisandro Dalcin cmd_obj.finalize_options() 67fb83dddaSLisandro Dalcin return cmd_obj.build_platlib 68fb83dddaSLisandro Dalcin except Exception: 69fb83dddaSLisandro Dalcin return None 70fb83dddaSLisandro Dalcin 71fb83dddaSLisandro Dalcin 72fb83dddaSLisandro Dalcindef getprocessorinfo(): 73fb83dddaSLisandro Dalcin try: 74fb83dddaSLisandro Dalcin name = os.uname()[1] 75fb83dddaSLisandro Dalcin except: 76fb83dddaSLisandro Dalcin import platform 77fb83dddaSLisandro Dalcin name = platform.uname()[1] 78fb83dddaSLisandro Dalcin from petsc4py.PETSc import COMM_WORLD 79fb83dddaSLisandro Dalcin rank = COMM_WORLD.getRank() 80fb83dddaSLisandro Dalcin return (rank, name) 81fb83dddaSLisandro Dalcin 82fb83dddaSLisandro Dalcin 83f46a955bSLisandro Dalcindef getlibraryinfo(name): 84f46a955bSLisandro Dalcin modname = "%s4py.%s" % (name.lower(), name) 85f46a955bSLisandro Dalcin module = __import__(modname, fromlist=[name]) 86f46a955bSLisandro Dalcin (major, minor, micro), devel = module.Sys.getVersion(devel=True) 87f46a955bSLisandro Dalcin r = not devel 88fb83dddaSLisandro Dalcin if r: release = 'release' 89fb83dddaSLisandro Dalcin else: release = 'development' 90f46a955bSLisandro Dalcin arch = module.__arch__ 91f46a955bSLisandro Dalcin return ( 92f46a955bSLisandro Dalcin "%s %d.%d.%d %s (conf: '%s')" % 93f46a955bSLisandro Dalcin (name, major, minor, micro, release, arch) 94f46a955bSLisandro Dalcin ) 95fb83dddaSLisandro Dalcin 96fb83dddaSLisandro Dalcin 97fb83dddaSLisandro Dalcindef getpythoninfo(): 98fb83dddaSLisandro Dalcin x, y, z = sys.version_info[:3] 99fb83dddaSLisandro Dalcin return ("Python %d.%d.%d (%s)" % (x, y, z, sys.executable)) 100fb83dddaSLisandro Dalcin 101fb83dddaSLisandro Dalcin 102fb83dddaSLisandro Dalcindef getpackageinfo(pkg): 103fb83dddaSLisandro Dalcin try: 104fb83dddaSLisandro Dalcin pkg = __import__(pkg) 105fb83dddaSLisandro Dalcin except ImportError: 106fb83dddaSLisandro Dalcin return None 107fb83dddaSLisandro Dalcin name = pkg.__name__ 108fb83dddaSLisandro Dalcin version = pkg.__version__ 109fb83dddaSLisandro Dalcin path = pkg.__path__[0] 110fb83dddaSLisandro Dalcin return ("%s %s (%s)" % (name, version, path)) 111fb83dddaSLisandro Dalcin 1125808f684SSatish Balay 1135808f684SSatish Balaydef setup_python(options): 1145808f684SSatish Balay rootdir = os.path.dirname(os.path.dirname(__file__)) 1155808f684SSatish Balay builddir = os.path.join(rootdir, getbuilddir()) 1165808f684SSatish Balay if options.builddir and os.path.exists(builddir): 1175808f684SSatish Balay sys.path.insert(0, builddir) 1185808f684SSatish Balay if options.path: 1195808f684SSatish Balay path = options.path[:] 1205808f684SSatish Balay path.reverse() 1215808f684SSatish Balay for p in path: 1225808f684SSatish Balay sys.path.insert(0, p) 1235808f684SSatish Balay 124fb83dddaSLisandro Dalcin 1255808f684SSatish Balaydef setup_unittest(options): 1265808f684SSatish Balay from unittest import TestSuite 1275808f684SSatish Balay try: 1285808f684SSatish Balay from unittest.runner import _WritelnDecorator 1295808f684SSatish Balay except ImportError: 1305808f684SSatish Balay from unittest import _WritelnDecorator 1315808f684SSatish Balay # 1325808f684SSatish Balay writeln_orig = _WritelnDecorator.writeln 1335808f684SSatish Balay def writeln(self, message=''): 1345808f684SSatish Balay try: self.stream.flush() 1355808f684SSatish Balay except: pass 1365808f684SSatish Balay writeln_orig(self, message) 1375808f684SSatish Balay try: self.stream.flush() 1385808f684SSatish Balay except: pass 1395808f684SSatish Balay _WritelnDecorator.writeln = writeln 1405808f684SSatish Balay 141fb83dddaSLisandro Dalcin 1425808f684SSatish Balaydef import_package(options, pkgname): 143b254a87dSStefano Zampini args = [sys.argv[0]] 144b254a87dSStefano Zampini if options.memdebug: 145b254a87dSStefano Zampini args.append('-malloc') 146b254a87dSStefano Zampini args.append('-malloc_debug') 147b254a87dSStefano Zampini args.append('-malloc_dump') 1485808f684SSatish Balay if options.summary: 1495808f684SSatish Balay args.append('-log_view') 1505808f684SSatish Balay package = __import__(pkgname) 1515808f684SSatish Balay package.init(args, arch=options.arch) 1525808f684SSatish Balay 1535808f684SSatish Balay 154fb83dddaSLisandro Dalcindef print_banner(options): 155fb83dddaSLisandro Dalcin r, n = getprocessorinfo() 156fb83dddaSLisandro Dalcin prefix = "[%d@%s]" % (r, n) 1575808f684SSatish Balay 1585808f684SSatish Balay def writeln(message='', endl='\n'): 159fb83dddaSLisandro Dalcin if message is None: 160fb83dddaSLisandro Dalcin return 1615808f684SSatish Balay from petsc4py.PETSc import Sys 162fb83dddaSLisandro Dalcin message = "%s %s" % (prefix, message) 1635808f684SSatish Balay Sys.syncPrint(message, endl=endl, flush=True) 1645808f684SSatish Balay 1655808f684SSatish Balay if options.verbose: 166fb83dddaSLisandro Dalcin writeln(getpythoninfo()) 167fb83dddaSLisandro Dalcin writeln(getpackageinfo('numpy')) 168f46a955bSLisandro Dalcin for entry in components: 169f46a955bSLisandro Dalcin writeln(getlibraryinfo(entry)) 170*e405789aSLisandro Dalcin writeln(getpackageinfo('%s4py' % entry.lower())) 171fb83dddaSLisandro Dalcin 1725808f684SSatish Balay 1735808f684SSatish Balaydef load_tests(options, args): 1745808f684SSatish Balay from glob import glob 1755808f684SSatish Balay import re 1765808f684SSatish Balay testsuitedir = os.path.dirname(__file__) 1775808f684SSatish Balay sys.path.insert(0, testsuitedir) 1785808f684SSatish Balay pattern = 'test_*.py' 1795808f684SSatish Balay wildcard = os.path.join(testsuitedir, pattern) 1805808f684SSatish Balay testfiles = glob(wildcard) 1815808f684SSatish Balay testfiles.sort() 1825808f684SSatish Balay testsuite = unittest.TestSuite() 1835808f684SSatish Balay testloader = unittest.TestLoader() 1841e51fb16SStefano Zampini if options.patterns: 1851e51fb16SStefano Zampini testloader.testNamePatterns = [ 1861e51fb16SStefano Zampini ('*%s*' % p) if ('*' not in p) else p 187f46a955bSLisandro Dalcin for p in options.patterns 188f46a955bSLisandro Dalcin ] 1895808f684SSatish Balay include = exclude = None 1905808f684SSatish Balay if options.include: 1915808f684SSatish Balay include = re.compile('|'.join(options.include)).search 1925808f684SSatish Balay if options.exclude: 1935808f684SSatish Balay exclude = re.compile('|'.join(options.exclude)).search 1945808f684SSatish Balay for testfile in testfiles: 1955808f684SSatish Balay filename = os.path.basename(testfile) 1965808f684SSatish Balay testname = os.path.splitext(filename)[0] 1975808f684SSatish Balay if ((exclude and exclude(testname)) or 1985808f684SSatish Balay (include and not include(testname))): 1995808f684SSatish Balay continue 2005808f684SSatish Balay module = __import__(testname) 2015808f684SSatish Balay for arg in args: 2025808f684SSatish Balay try: 2035808f684SSatish Balay cases = testloader.loadTestsFromNames((arg,), module) 2045808f684SSatish Balay testsuite.addTests(cases) 2055808f684SSatish Balay except AttributeError: 2065808f684SSatish Balay pass 2075808f684SSatish Balay if not args: 2085808f684SSatish Balay cases = testloader.loadTestsFromModule(module) 2095808f684SSatish Balay testsuite.addTests(cases) 2105808f684SSatish Balay return testsuite 2115808f684SSatish Balay 212fb83dddaSLisandro Dalcin 2135808f684SSatish Balaydef run_tests(options, testsuite, runner=None): 2145808f684SSatish Balay if runner is None: 2155808f684SSatish Balay runner = unittest.TextTestRunner(verbosity=options.verbose) 2165808f684SSatish Balay runner.failfast = options.failfast 2175808f684SSatish Balay result = runner.run(testsuite) 2185808f684SSatish Balay return result.wasSuccessful() 2195808f684SSatish Balay 220fb83dddaSLisandro Dalcin 2215808f684SSatish Balay 2225808f684SSatish Balaydef abort(code=1): 2235808f684SSatish Balay os.abort() 2245808f684SSatish Balay 225fb83dddaSLisandro Dalcin 2265808f684SSatish Balaydef shutdown(success): 2275808f684SSatish Balay pass 2285808f684SSatish Balay 229fb83dddaSLisandro Dalcin 2305808f684SSatish Balaydef main(args=None): 231f46a955bSLisandro Dalcin pkgname = '%s4py' % components[-1].lower() 2325808f684SSatish Balay parser = getoptionparser() 2335808f684SSatish Balay (options, args) = parser.parse_args(args) 2345808f684SSatish Balay setup_python(options) 2355808f684SSatish Balay setup_unittest(options) 236fb83dddaSLisandro Dalcin import_package(options, pkgname) 237fb83dddaSLisandro Dalcin print_banner(options) 2385808f684SSatish Balay testsuite = load_tests(options, args) 2395808f684SSatish Balay success = run_tests(options, testsuite) 2405808f684SSatish Balay if not success and options.failfast: abort() 2415808f684SSatish Balay shutdown(success) 2425808f684SSatish Balay return not success 2435808f684SSatish Balay 244fb83dddaSLisandro Dalcin 2455808f684SSatish Balayif __name__ == '__main__': 2465808f684SSatish Balay import sys 2475808f684SSatish Balay sys.dont_write_bytecode = True 2485808f684SSatish Balay sys.exit(main()) 249