File: run_tests.py

package info (click to toggle)
slixmpp 1.14.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,656 kB
  • sloc: python: 41,970; xml: 1,250; makefile: 135
file content (96 lines) | stat: -rwxr-xr-x 2,946 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/usr/bin/env python3

import doctest
import pkgutil
import sys
import logging
import unittest
import warnings

from argparse import ArgumentParser
from importlib import import_module
from pathlib import Path

import slixmpp

def run_tests(filenames=None, debug=False, log_filename=None, only_doctests=False):
    """
    Find and run all tests in the tests/ directory.

    Excludes live tests (tests/live_*).
    """

    suites = []
    if not only_doctests:
        suites.extend(collect_unit_tests(filenames))
    suites.extend(collect_doctests())

    tests = unittest.TestSuite(suites)
    runner = unittest.TextTestRunner(verbosity=2)

    if log_filename:
        print(f'Storing log output to {log_filename}')
        kwargs = {
            'filename': log_filename,
            'level': logging.INFO,
            'force': True,
        }
        if debug:
            kwargs['level'] = logging.DEBUG
        logging.basicConfig(**kwargs)
    else:
        if debug:
            logging.basicConfig(level=logging.DEBUG)
        else:
            logging.basicConfig(level=100)
            logging.disable(100)

    result = runner.run(tests)
    return result


def collect_unit_tests(filenames):
    if not filenames:
        filenames = [i for i in Path('tests').glob('test_*')]
    else:
        filenames = [Path(i) for i in filenames]

    modules = ['.'.join(test.parts[:-1] + (test.stem,)) for test in filenames]

    suites = []
    for filename in modules:
        module = import_module(filename)
        suites.append(module.suite)
    return suites


def collect_doctests():
    suites = []
    for _importer, modname, _ispkg in pkgutil.walk_packages(
        slixmpp.__path__,
        prefix=slixmpp.__name__ + ".",
    ):
        if "thirdparty" in modname:
            continue
        module = import_module(modname)
        suites.append(doctest.DocTestSuite(module))
    return suites


if __name__ == '__main__':
    warnings.filterwarnings("once", category=DeprecationWarning)

    parser = ArgumentParser(description='Run unit tests.')
    parser.add_argument('tests', metavar='TEST', nargs='*', help='list of tests to run, or nothing to run them all')
    parser.add_argument('-d', '--debug', action='store_true', dest='debug', default=False, help='enable debug output')
    parser.add_argument('-f', '--log-filename', dest='log_filename', default=None, help='File to store slixmpp logs during test execution.')
    parser.add_argument('--only-doctests', action='store_true', help='Only run doctests')
    args = parser.parse_args()

    result = run_tests(args.tests, args.debug, log_filename=args.log_filename, only_doctests=args.only_doctests)
    print("<tests %s ran='%s' errors='%s' fails='%s' success='%s'/>" % (
        "xmlns='http//andyet.net/protocol/tests'",
        result.testsRun, len(result.errors),
        len(result.failures), result.wasSuccessful()))

    sys.exit(not result.wasSuccessful())