#!/usr/bin/env python # Copyright (c) 2012 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Top level script for running all python unittests in the NaCl SDK. """ from __future__ import print_function import argparse import os import subprocess import sys import unittest # add tools folder to sys.path SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) TOOLS_DIR = os.path.join(SCRIPT_DIR, 'tools') BUILD_TOOLS_DIR = os.path.join(SCRIPT_DIR, 'build_tools') sys.path.append(TOOLS_DIR) sys.path.append(os.path.join(TOOLS_DIR, 'tests')) sys.path.append(os.path.join(TOOLS_DIR, 'lib', 'tests')) sys.path.append(BUILD_TOOLS_DIR) sys.path.append(os.path.join(BUILD_TOOLS_DIR, 'tests')) import build_paths PKG_VER_DIR = os.path.join(build_paths.NACL_DIR, 'build', 'package_version') TAR_DIR = os.path.join(build_paths.NACL_DIR, 'toolchain', '.tars') PKG_VER = os.path.join(PKG_VER_DIR, 'package_version.py') EXTRACT_PACKAGES = ['nacl_x86_glibc', 'nacl_arm_glibc'] TOOLCHAIN_OUT = os.path.join(build_paths.OUT_DIR, 'sdk_tests', 'toolchain') # List of modules containing unittests. The goal is to keep the total # runtime of these tests under 2 seconds. Any slower tests should go # in TEST_MODULES_BIG. TEST_MODULES = [ 'build_artifacts_test', 'build_version_test', 'create_html_test', 'create_nmf_test', 'easy_template_test', 'elf_test', 'fix_deps_test', 'getos_test', 'get_shared_deps_test', 'httpd_test', 'nacl_config_test', 'oshelpers_test', 'parse_dsc_test', 'quote_test', 'sdktools_config_test', 'sel_ldr_test', 'test_projects_test', 'update_nacl_manifest_test', 'verify_filelist_test', 'verify_ppapi_test', ] # Slower tests. For example the 'sdktools' are mostly slower system tests # that longer to run. If --quick is passed then we don't run these. TEST_MODULES_BIG = [ 'sdktools_commands_test', 'sdktools_test', ] def ExtractToolchains(): cmd = [sys.executable, PKG_VER, '--packages', ','.join(EXTRACT_PACKAGES), '--tar-dir', TAR_DIR, '--dest-dir', TOOLCHAIN_OUT, 'extract'] subprocess.check_call(cmd) def main(args): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('-v', '--verbose', action='store_true') parser.add_argument('--quick', action='store_true') options = parser.parse_args(args) # Some of the unit tests use parts of toolchains. Extract to TOOLCHAIN_OUT. print('Extracting toolchains...') ExtractToolchains() suite = unittest.TestSuite() modules = TEST_MODULES if not options.quick: modules += TEST_MODULES_BIG for module_name in modules: module = __import__(module_name) suite.addTests(unittest.defaultTestLoader.loadTestsFromModule(module)) if options.verbose: verbosity = 2 else: verbosity = 1 print('Running unittests...') result = unittest.TextTestRunner(verbosity=verbosity).run(suite) return int(not result.wasSuccessful()) if __name__ == '__main__': sys.exit(main(sys.argv[1:]))