#!/usr/bin/env python # Copyright 2013 - 2017, New York University and the TUF contributors # SPDX-License-Identifier: MIT OR Apache-2.0 """ aggregate_tests.py Konstantin Andrianov. Zane Fisher. January 26, 2013. August 2013. Modified previous behavior that explicitly imported individual unit tests. -Zane Fisher See LICENSE-MIT OR LICENSE for licensing information. Run all the unit tests from every .py file beginning with "test_" in 'tuf/tests'. Use --random to run the tests in random order. """ # Help with Python 3 compatibility, where the print statement is a function, an # implicit relative import is invalid, and the '/' operator performs true # division. Example: print 'hello world' raises a 'SyntaxError' exception. from __future__ import print_function from __future__ import absolute_import from __future__ import division from __future__ import unicode_literals import sys import unittest import glob import random # Generate a list of pathnames that match a pattern (i.e., that begin with # 'test_' and end with '.py'. A shell-style wildcard is used with glob() to # match desired filenames. All the tests matching the pattern will be loaded # and run in a test suite. tests_list = glob.glob('test_*.py') # A dictionary of test modules that should only run in certain python versions. # Carefully consider the impact of only testing these in a given version. # test_proxy_use.py: uses a proxy that only runs in Python2.7. TUF's # compatibility with proxies is not likely to vary based on the Python version # in use, so this is OK for now. See comments in that module. # The format here is: if major is included, limit version to that listed here. # If minor is included, limit version to that listed here. Skip the test if any # such listed constraints don't match the python version currently running. VERSION_SPECIFIC_TESTS = { 'test_proxy_use': {'major': 2, 'minor': 7}} # Run test only if Python2.7 # Remove '.py' from each filename to allow loadTestsFromNames() (called below) # to properly load the file as a module. tests_without_extension = [] for test in tests_list: test = test[:-3] if test in VERSION_SPECIFIC_TESTS: if 'major' in VERSION_SPECIFIC_TESTS[test] \ and sys.version_info.major != VERSION_SPECIFIC_TESTS[test]['major']: continue elif 'minor' in VERSION_SPECIFIC_TESTS[test] \ and sys.version_info.minor != VERSION_SPECIFIC_TESTS[test]['minor']: continue tests_without_extension.append(test) # Randomize the order in which the tests run. Randomization might catch errors # with unit tests that do not properly clean up or restore monkey-patched # modules. random.shuffle(tests_without_extension) if __name__ == '__main__': suite = unittest.TestLoader().loadTestsFromNames(tests_without_extension) all_tests_passed = unittest.TextTestRunner(verbosity=1).run(suite).wasSuccessful() if not all_tests_passed: sys.exit(1) else: sys.exit(0)