runtests.py (3287B)
1 # This Source Code Form is subject to the terms of the Mozilla Public 2 # License, v. 2.0. If a copy of the MPL was not distributed with this 3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 5 import sys 6 7 import mozlog 8 from marionette_driver import __version__ as driver_version 9 10 from marionette_harness import ( 11 BaseMarionetteArguments, 12 BaseMarionetteTestRunner, 13 MarionetteTestCase, 14 __version__, 15 ) 16 17 18 class MarionetteTestRunner(BaseMarionetteTestRunner): 19 def __init__(self, **kwargs): 20 BaseMarionetteTestRunner.__init__(self, **kwargs) 21 self.test_handlers = [MarionetteTestCase] 22 23 24 class MarionetteArguments(BaseMarionetteArguments): 25 pass 26 27 28 class MarionetteHarness: 29 def __init__( 30 self, 31 runner_class=MarionetteTestRunner, 32 parser_class=MarionetteArguments, 33 testcase_class=MarionetteTestCase, 34 args=None, 35 ): 36 self._runner_class = runner_class 37 self._parser_class = parser_class 38 self._testcase_class = testcase_class 39 self.args = args or self.parse_args() 40 41 def parse_args(self, logger_defaults=None): 42 parser = self._parser_class( 43 usage="%(prog)s [options] test_file_or_dir <test_file_or_dir> ..." 44 ) 45 parser.add_argument( 46 "--version", 47 action="version", 48 help="Show version information.", 49 version=f"%(prog)s {__version__}" 50 f" (using marionette-driver: {driver_version}, ", 51 ) 52 mozlog.commandline.add_logging_group(parser) 53 args = parser.parse_args() 54 parser.verify_usage(args) 55 56 logger = mozlog.commandline.setup_logging( 57 args.logger_name, args, logger_defaults or {"tbpl": sys.stdout} 58 ) 59 60 args.logger = logger 61 return vars(args) 62 63 def process_args(self): 64 if self.args.get("pydebugger"): 65 self._testcase_class.pydebugger = __import__(self.args["pydebugger"]) 66 # Remove mozlog arguments from the return value since these aren't 67 # used directly by the rest of marionette 68 self.args = { 69 key: value for key, value in self.args.items() if not key.startswith("log_") 70 } 71 72 def run(self): 73 self.process_args() 74 tests = self.args.pop("tests") 75 runner = self._runner_class(**self.args) 76 try: 77 runner.run_tests(tests) 78 finally: 79 runner.cleanup() 80 return runner.failed + runner.crashed 81 82 83 def cli( 84 runner_class=MarionetteTestRunner, 85 parser_class=MarionetteArguments, 86 harness_class=MarionetteHarness, 87 testcase_class=MarionetteTestCase, 88 args=None, 89 ): 90 """ 91 Call the harness to parse args and run tests. 92 93 The following exit codes are expected: 94 - Test failures: 10 95 - Harness/other failures: 1 96 - Success: 0 97 """ 98 logger = mozlog.commandline.setup_logging("Marionette test runner", {}) 99 try: 100 harness_instance = harness_class( 101 runner_class, parser_class, testcase_class, args=args 102 ) 103 failed = harness_instance.run() 104 if failed > 0: 105 sys.exit(10) 106 except Exception as e: 107 logger.error(str(e), exc_info=True) 108 sys.exit(1) 109 sys.exit(0) 110 111 112 if __name__ == "__main__": 113 cli()