Clone of official tools

Revision:
0:66f3b5499f7f
Child:
13:ab47a20b66f0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test.py	Thu May 19 19:44:41 2016 +0100
@@ -0,0 +1,158 @@
+#! /usr/bin/env python2
+"""
+mbed SDK
+Copyright (c) 2011-2013 ARM Limited
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+
+TEST BUILD & RUN
+"""
+import sys
+import os
+import json
+
+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.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
+
+if __name__ == '__main__':
+    try:
+        # Parse Options
+        parser = get_default_options_parser()
+        
+        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")
+
+        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")
+
+        parser.add_option("--build", dest="build_dir",
+                          default=None, help="The build (output) directory")
+
+        parser.add_option("-l", "--list", action="store_true", dest="list",
+                          default=False, help="List (recursively) available tests in order and exit")
+
+        parser.add_option("-p", "--paths", dest="paths",
+                          default=None, help="Limit the tests to those within the specified comma separated list of paths")
+        
+        format_choices = ["list", "json"]
+        format_default_choice = "list"
+        format_help = "Change the format in which tests are listed. Choices include: %s. Default: %s" % (", ".join(format_choices), format_default_choice)
+        parser.add_option("-f", "--format", type="choice", dest="format",
+                          choices=format_choices, default=format_default_choice, help=format_help)
+        
+        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("-v", "--verbose",
+                          action="store_true",
+                          dest="verbose",
+                          default=False,
+                          help="Verbose diagnostic output")
+
+        (options, args) = parser.parse_args()
+
+        # Filter tests by path if specified 
+        if options.paths:
+            all_paths = options.paths.split(",")
+        else:
+            all_paths = ["."]
+        
+        all_tests = {}
+        tests = {}
+        
+        # Find all tests in the relevant paths
+        for path in all_paths:
+            all_tests.update(find_tests(path))
+        
+        # Filter tests by name if specified
+        if options.names:
+            all_names = options.names.split(",")
+            
+            all_tests_keys = all_tests.keys()
+            for name in all_names:
+                if name in all_tests_keys:
+                    tests[name] = all_tests[name]
+                else:
+                    print "[Warning] Test with name '%s' was not found in the available tests" % (name)
+        else:
+            tests = all_tests
+
+        if options.list:
+            # Print available tests in order and exit
+            print_tests(tests, options.format)
+        else:
+            # Build all tests
+            if not options.build_dir:
+                print "[ERROR] You must specify a build path"
+                sys.exit(1)
+            
+            base_source_paths = options.source_dir
+            
+            # Default base source path is the current directory
+            if not base_source_paths:
+                base_source_paths = ['.']
+            
+            
+            target = TARGET_MAP[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)
+            
+            # 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)
+                
+                # 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()
+
+    except KeyboardInterrupt, e:
+        print "\n[CTRL+c] exit"
+    except Exception,e:
+        import traceback
+        traceback.print_exc(file=sys.stdout)
+        print "[ERROR] %s" % str(e)
+        sys.exit(1)