Clone of official tools

Revision:
22:9e85236d8716
Parent:
13:ab47a20b66f0
Child:
24:25bff2709c20
--- a/test.py	Fri Jul 15 22:58:15 2016 +0100
+++ b/test.py	Sat Jul 16 00:34:03 2016 +0100
@@ -29,82 +29,90 @@
 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.build_api import print_build_memory_usage_results
 from tools.targets import TARGET_MAP
 from tools.utils import mkdir, ToolException, NotSupportedException
 from tools.test_exporters import ReportExporter, ResultExporterType
+from utils import argparse_filestring_type, argparse_lowercase_type, argparse_many
+from tools.toolchains import mbedToolchain
+from tools.settings import CLI_COLOR_MAP
 
 if __name__ == '__main__':
     try:
         # Parse Options
         parser = get_default_options_parser()
         
-        parser.add_option("-D", "",
+        parser.add_argument("-D",
                           action="append",
                           dest="macros",
                           help="Add a macro definition")
-        
-        parser.add_option("-j", "--jobs",
-                          type="int",
+       
+        parser.add_argument("-j", "--jobs",
+                          type=int,
                           dest="jobs",
                           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")
+        parser.add_argument("--source", dest="source_dir",
+                          type=argparse_filestring_type,
+                            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",
+        parser.add_argument("--build", dest="build_dir",
                           default=None, help="The build (output) directory")
 
-        parser.add_option("-l", "--list", action="store_true", dest="list",
+        parser.add_argument("-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",
+        parser.add_argument("-p", "--paths", dest="paths",
+                          type=argparse_many(argparse_filestring_type),
                           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_argument("-f", "--format", dest="format",
+                            type=argparse_lowercase_type(format_choices, "format"),
+                            default=format_default_choice, help=format_help)
         
-        parser.add_option("--continue-on-build-fail", action="store_true", dest="continue_on_build_fail",
+        parser.add_argument("--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",
+        #TODO validate the names instead of just passing through str
+        parser.add_argument("-n", "--names", dest="names", type=argparse_many(str),
                           default=None, help="Limit the tests to a comma separated list of names")
                           
-        parser.add_option("--test-spec", dest="test_spec",
+        parser.add_argument("--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",
+        parser.add_argument("--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",
+        parser.add_argument("-v", "--verbose",
                           action="store_true",
                           dest="verbose",
                           default=False,
                           help="Verbose diagnostic output")
 
-        (options, args) = parser.parse_args()
+        options = parser.parse_args()
 
-        # Filter tests by path if specified 
+        # Filter tests by path if specified
         if options.paths:
-            all_paths = options.paths.split(",")
+            all_paths = options.paths
         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_names = options.names
             all_names = [x.lower() for x in all_names]
-            
+
             for name in all_names:
                 if any(fnmatch.fnmatch(testname, name) for testname in all_tests):
                     for testname, test in all_tests.items():
@@ -115,6 +123,17 @@
         else:
             tests = all_tests
 
+        if options.color:
+            # This import happens late to prevent initializing colorization when we don't need it
+            import colorize
+            if options.verbose:
+                notify = mbedToolchain.print_notify_verbose
+            else:
+                notify = mbedToolchain.print_notify
+            notify = colorize.print_in_color_notifier(CLI_COLOR_MAP, notify)
+        else:
+            notify = None
+
         if options.list:
             # Print available tests in order and exit
             print_tests(tests, options.format)
@@ -124,15 +143,15 @@
             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 = options.mcu
+            target = options.mcu[0]
             
             build_report = {}
             build_properties = {}
@@ -140,7 +159,7 @@
             library_build_success = False
             try:
                 # Build sources
-                build_library(base_source_paths, options.build_dir, target, options.tool,
+                build_library(base_source_paths, options.build_dir, target, options.tool[0],
                                                 options=options.options,
                                                 jobs=options.jobs,
                                                 clean=options.clean,
@@ -149,8 +168,9 @@
                                                 name="mbed-build",
                                                 macros=options.macros,
                                                 verbose=options.verbose,
+                                                notify=notify,
                                                 archive=False)
-                
+
                 library_build_success = True
             except ToolException, e:
                 # ToolException output is handled by the build log
@@ -161,46 +181,52 @@
             except Exception, e:
                 # Some other exception occurred, print the error message
                 print e
-            
+
             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,
+                test_build_success, test_build = build_tests(tests, [options.build_dir], options.build_dir, target, options.tool[0],
                         options=options.options,
                         clean=options.clean,
                         report=build_report,
                         properties=build_properties,
                         macros=options.macros,
                         verbose=options.verbose,
+                        notify=notify,
                         jobs=options.jobs,
                         continue_on_build_fail=options.continue_on_build_fail)
-                
+
                 # 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
-            
+
             # 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 memory map summary on screen
+            if build_report:
+                print
+                print print_build_memory_usage_results(build_report)
+
             print_report_exporter = ReportExporter(ResultExporterType.PRINT, package="build")
             status = print_report_exporter.report(build_report)
-        
+
             if status:
                 sys.exit(0)
             else: