Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-sdk-tools by
Diff: test.py
- Revision:
- 13:ab47a20b66f0
- Parent:
- 0:66f3b5499f7f
- Child:
- 22:9e85236d8716
--- a/test.py Tue Jun 14 11:33:06 2016 +0100 +++ b/test.py Thu Jul 14 20:21:19 2016 +0100 @@ -21,26 +21,33 @@ import sys import os import json +import fnmatch ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) sys.path.insert(0, ROOT) -from tools.test_api import test_path_to_name, find_tests, print_tests, build_tests, test_spec_from_test_build +from tools.test_api import test_path_to_name, find_tests, print_tests, build_tests, test_spec_from_test_builds from tools.options import get_default_options_parser from tools.build_api import build_project, build_library from tools.targets import TARGET_MAP -from tools.utils import mkdir +from tools.utils import mkdir, ToolException, NotSupportedException +from tools.test_exporters import ReportExporter, ResultExporterType if __name__ == '__main__': try: # Parse Options parser = get_default_options_parser() + parser.add_option("-D", "", + action="append", + dest="macros", + help="Add a macro definition") + parser.add_option("-j", "--jobs", type="int", dest="jobs", - default=1, - help="Number of concurrent jobs (default 1). Use 0 for auto based on host machine's number of CPUs") + default=0, + help="Number of concurrent jobs. Default: 0/auto (based on host machine's number of CPUs)") parser.add_option("--source", dest="source_dir", default=None, help="The source (input) directory (for sources other than tests). Defaults to current directory.", action="append") @@ -60,12 +67,18 @@ parser.add_option("-f", "--format", type="choice", dest="format", choices=format_choices, default=format_default_choice, help=format_help) + parser.add_option("--continue-on-build-fail", action="store_true", dest="continue_on_build_fail", + default=None, help="Continue trying to build all tests if a build failure occurs") + parser.add_option("-n", "--names", dest="names", default=None, help="Limit the tests to a comma separated list of names") parser.add_option("--test-spec", dest="test_spec", default=None, help="Destination path for a test spec file that can be used by the Greentea automated test tool") + parser.add_option("--build-report-junit", dest="build_report_junit", + default=None, help="Destination path for a build report in the JUnit xml format") + parser.add_option("-v", "--verbose", action="store_true", dest="verbose", @@ -90,11 +103,13 @@ # Filter tests by name if specified if options.names: all_names = options.names.split(",") + all_names = [x.lower() for x in all_names] - all_tests_keys = all_tests.keys() for name in all_names: - if name in all_tests_keys: - tests[name] = all_tests[name] + if any(fnmatch.fnmatch(testname, name) for testname in all_tests): + for testname, test in all_tests.items(): + if fnmatch.fnmatch(testname, name): + tests[testname] = test else: print "[Warning] Test with name '%s' was not found in the available tests" % (name) else: @@ -103,6 +118,7 @@ if options.list: # Print available tests in order and exit print_tests(tests, options.format) + sys.exit(0) else: # Build all tests if not options.build_dir: @@ -116,38 +132,79 @@ base_source_paths = ['.'] - target = TARGET_MAP[options.mcu] + target = options.mcu - lib_build_res = build_library(base_source_paths, options.build_dir, target, options.tool, - options=options.options, - jobs=options.jobs, - clean=options.clean, - archive=False) - - # Build all the tests - test_build = build_tests(tests, [options.build_dir], options.build_dir, target, options.tool, - options=options.options, - clean=options.clean, - jobs=options.jobs) + build_report = {} + build_properties = {} + + library_build_success = False + try: + # Build sources + build_library(base_source_paths, options.build_dir, target, options.tool, + options=options.options, + jobs=options.jobs, + clean=options.clean, + report=build_report, + properties=build_properties, + name="mbed-build", + macros=options.macros, + verbose=options.verbose, + archive=False) + + library_build_success = True + except ToolException, e: + # ToolException output is handled by the build log + pass + except NotSupportedException, e: + # NotSupportedException is handled by the build log + pass + except Exception, e: + # Some other exception occurred, print the error message + print e - # If a path to a test spec is provided, write it to a file - if options.test_spec: - test_spec_data = test_spec_from_test_build(test_build) + if not library_build_success: + print "Failed to build library" + else: + # Build all the tests + test_build_success, test_build = build_tests(tests, [options.build_dir], options.build_dir, target, options.tool, + options=options.options, + clean=options.clean, + report=build_report, + properties=build_properties, + macros=options.macros, + verbose=options.verbose, + jobs=options.jobs, + continue_on_build_fail=options.continue_on_build_fail) - # Create the target dir for the test spec if necessary - # mkdir will not create the dir if it already exists - test_spec_dir = os.path.dirname(options.test_spec) - if test_spec_dir: - mkdir(test_spec_dir) - - try: - with open(options.test_spec, 'w') as f: - f.write(json.dumps(test_spec_data, indent=2)) - except IOError, e: - print "[ERROR] Error writing test spec to file" - print e + # If a path to a test spec is provided, write it to a file + if options.test_spec: + test_spec_data = test_spec_from_test_builds(test_build) + + # Create the target dir for the test spec if necessary + # mkdir will not create the dir if it already exists + test_spec_dir = os.path.dirname(options.test_spec) + if test_spec_dir: + mkdir(test_spec_dir) + + try: + with open(options.test_spec, 'w') as f: + f.write(json.dumps(test_spec_data, indent=2)) + except IOError, e: + print "[ERROR] Error writing test spec to file" + print e - sys.exit() + # If a path to a JUnit build report spec is provided, write it to a file + if options.build_report_junit: + report_exporter = ReportExporter(ResultExporterType.JUNIT, package="build") + report_exporter.report_to_file(build_report, options.build_report_junit, test_suite_properties=build_properties) + + print_report_exporter = ReportExporter(ResultExporterType.PRINT, package="build") + status = print_report_exporter.report(build_report) + + if status: + sys.exit(0) + else: + sys.exit(1) except KeyboardInterrupt, e: print "\n[CTRL+c] exit"