xref: /petsc/src/binding/petsc4py/test/runtests.py (revision e405789ad362f4e37b94d0be8c9417a5e9316a81)
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