From 7c72a225089a35b3a32fbbb68347f90ab46e2ee8 Mon Sep 17 00:00:00 2001 From: Conor Keegan Date: Wed, 31 Aug 2016 16:20:59 +0100 Subject: [PATCH] Add test command switch for app config file --- tools/build_api.py | 17 +++++++++++------ tools/config.py | 27 +++++++++++++++------------ tools/test.py | 13 ++++++++++--- tools/test_api.py | 11 +++++++---- 4 files changed, 43 insertions(+), 25 deletions(-) diff --git a/tools/build_api.py b/tools/build_api.py index f1980b72d8..62fff74c87 100644 --- a/tools/build_api.py +++ b/tools/build_api.py @@ -276,7 +276,8 @@ def get_mbed_official_release(version): def prepare_toolchain(src_paths, target, toolchain_name, macros=None, options=None, clean=False, jobs=1, notify=None, silent=False, verbose=False, - extra_verbose=False, config=None): + extra_verbose=False, config=None, + app_config=None): """ Prepares resource related objects - toolchain, target, config Positional arguments: @@ -294,6 +295,7 @@ def prepare_toolchain(src_paths, target, toolchain_name, verbose - Write the actual tools command lines used if True extra_verbose - even more output! config - a Config object to use instead of creating one + app_config - location of a chosen mbed_app.json file """ # We need to remove all paths which are repeated to avoid @@ -301,7 +303,7 @@ def prepare_toolchain(src_paths, target, toolchain_name, src_paths = [src_paths[0]] + list(set(src_paths[1:])) # If the configuration object was not yet created, create it now - config = config or Config(target, src_paths) + config = config or Config(target, src_paths, app_config=app_config) # If the 'target' argument is a string, convert it to a target instance if isinstance(target, basestring): @@ -369,7 +371,8 @@ def build_project(src_paths, build_path, target, toolchain_name, clean=False, notify=None, verbose=False, name=None, macros=None, inc_dirs=None, jobs=1, silent=False, report=None, properties=None, project_id=None, - project_description=None, extra_verbose=False, config=None): + project_description=None, extra_verbose=False, config=None, + app_config=None): """ Build a project. A project may be a test or a user program. Positional arguments: @@ -397,6 +400,7 @@ def build_project(src_paths, build_path, target, toolchain_name, project_description - the human-readable version of what this thing does extra_verbose - even more output! config - a Config object to use instead of creating one + app_config - location of a chosen mbed_app.json file """ # Convert src_path to a list if needed @@ -415,7 +419,7 @@ def build_project(src_paths, build_path, target, toolchain_name, toolchain = prepare_toolchain( src_paths, target, toolchain_name, macros=macros, options=options, clean=clean, jobs=jobs, notify=notify, silent=silent, verbose=verbose, - extra_verbose=extra_verbose, config=config) + extra_verbose=extra_verbose, config=config, app_config=app_config) # The first path will give the name to the library if name is None: @@ -489,7 +493,7 @@ def build_library(src_paths, build_path, target, toolchain_name, archive=True, notify=None, verbose=False, macros=None, inc_dirs=None, jobs=1, silent=False, report=None, properties=None, extra_verbose=False, project_id=None, - remove_config_header_file=False): + remove_config_header_file=False, app_config=None): """ Build a library Positional arguments: @@ -516,6 +520,7 @@ def build_library(src_paths, build_path, target, toolchain_name, extra_verbose - even more output! project_id - the name that goes in the report remove_config_header_file - delete config header file when done building + app_config - location of a chosen mbed_app.json file """ # Convert src_path to a list if needed @@ -539,7 +544,7 @@ def build_library(src_paths, build_path, target, toolchain_name, toolchain = prepare_toolchain( src_paths, target, toolchain_name, macros=macros, options=options, clean=clean, jobs=jobs, notify=notify, silent=silent, verbose=verbose, - extra_verbose=extra_verbose) + extra_verbose=extra_verbose, app_config=app_config) # The first path will give the name to the library if name is None: diff --git a/tools/config.py b/tools/config.py index a4766b3e2d..03ce5309a6 100644 --- a/tools/config.py +++ b/tools/config.py @@ -350,7 +350,7 @@ class Config(object): "UVISOR", "BLE", "CLIENT", "IPV4", "IPV6", "COMMON_PAL", "STORAGE" ] - def __init__(self, target, top_level_dirs=None): + def __init__(self, target, top_level_dirs=None, app_config=None): """Construct a mbed configuration Positional arguments: @@ -359,7 +359,8 @@ class Config(object): Keyword argumets: top_level_dirs - a list of top level source directories (where - mbed_abb_config.json could be found) + mbed_app_config.json could be found) + app_config - location of a chosen mbed_app.json file NOTE: Construction of a Config object will look for the application configuration file in top_level_dirs. If found once, it'll parse it and @@ -368,22 +369,24 @@ class Config(object): exception is raised. top_level_dirs may be None (in this case, the constructor will not search for a configuration file) """ - app_config_location = None - for directory in top_level_dirs or []: - full_path = os.path.join(directory, self.__mbed_app_config_name) - if os.path.isfile(full_path): - if app_config_location is not None: - raise ConfigException("Duplicate '%s' file in '%s' and '%s'" - % (self.__mbed_app_config_name, - app_config_location, full_path)) - else: - app_config_location = full_path + app_config_location = app_config + if app_config_location is None: + for directory in top_level_dirs or []: + full_path = os.path.join(directory, self.__mbed_app_config_name) + if os.path.isfile(full_path): + if app_config_location is not None: + raise ConfigException("Duplicate '%s' file in '%s' and '%s'" + % (self.__mbed_app_config_name, + app_config_location, full_path)) + else: + app_config_location = full_path try: self.app_config_data = json_file_to_dict(app_config_location) \ if app_config_location else {} except ValueError as exc: sys.stderr.write(str(exc) + "\n") self.app_config_data = {} + # Check the keys in the application configuration data unknown_keys = set(self.app_config_data.keys()) - \ self.__allowed_keys["application"] diff --git a/tools/test.py b/tools/test.py index 39a4d62f3b..7e3a59909b 100644 --- a/tools/test.py +++ b/tools/test.py @@ -94,6 +94,10 @@ if __name__ == '__main__': default=False, help="Verbose diagnostic output") + parser.add_argument("--app-config", default=None, dest="app_config", + type=argparse_filestring_type, + help="Path of an app configuration file (Default is to look for 'mbed_app.json')") + options = parser.parse_args() # Filter tests by path if specified @@ -117,7 +121,8 @@ if __name__ == '__main__': # Find all tests in the relevant paths for path in all_paths: - all_tests.update(find_tests(path, mcu, toolchain, options.options)) + all_tests.update(find_tests(path, mcu, toolchain, options.options, + app_config=options.app_config)) # Filter tests by name if specified if options.names: @@ -177,7 +182,8 @@ if __name__ == '__main__': verbose=options.verbose, notify=notify, archive=False, - remove_config_header_file=True) + remove_config_header_file=True, + app_config=options.app_config) library_build_success = True except ToolException, e: @@ -203,7 +209,8 @@ if __name__ == '__main__': verbose=options.verbose, notify=notify, jobs=options.jobs, - continue_on_build_fail=options.continue_on_build_fail) + continue_on_build_fail=options.continue_on_build_fail, + app_config=options.app_config) # If a path to a test spec is provided, write it to a file if options.test_spec: diff --git a/tools/test_api.py b/tools/test_api.py index 71be1fd657..3c05788e2b 100644 --- a/tools/test_api.py +++ b/tools/test_api.py @@ -1990,18 +1990,20 @@ def test_path_to_name(path, base): return "-".join(name_parts).lower() -def find_tests(base_dir, target_name, toolchain_name, options=None): +def find_tests(base_dir, target_name, toolchain_name, options=None, app_config=None): """ Finds all tests in a directory recursively base_dir: path to the directory to scan for tests (ex. 'path/to/project') target_name: name of the target to use for scanning (ex. 'K64F') toolchain_name: name of the toolchain to use for scanning (ex. 'GCC_ARM') options: Compile options to pass to the toolchain (ex. ['debug-info']) + app_config - location of a chosen mbed_app.json file """ tests = {} # Prepare the toolchain - toolchain = prepare_toolchain([base_dir], target_name, toolchain_name, options=options, silent=True) + toolchain = prepare_toolchain([base_dir], target_name, toolchain_name, options=options, + silent=True, app_config=app_config) # Scan the directory for paths to probe for 'TESTS' folders base_resources = scan_resources([base_dir], toolchain) @@ -2060,7 +2062,7 @@ def norm_relative_path(path, start): def build_tests(tests, base_source_paths, build_path, target, toolchain_name, options=None, clean=False, notify=None, verbose=False, jobs=1, macros=None, silent=False, report=None, properties=None, - continue_on_build_fail=False): + continue_on_build_fail=False, app_config=None): """Given the data structure from 'find_tests' and the typical build parameters, build all the tests @@ -2101,7 +2103,8 @@ def build_tests(tests, base_source_paths, build_path, target, toolchain_name, project_id=test_name, report=report, properties=properties, - verbose=verbose) + verbose=verbose, + app_config=app_config) except Exception, e: if not isinstance(e, NotSupportedException):