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 5from __future__ import absolute_import 6 7import sys 8 9import mozlog 10 11from marionette_driver import __version__ as driver_version 12 13from marionette_harness import ( 14 __version__, 15 BaseMarionetteTestRunner, 16 BaseMarionetteArguments, 17 MarionetteTestCase, 18) 19 20 21class MarionetteTestRunner(BaseMarionetteTestRunner): 22 def __init__(self, **kwargs): 23 BaseMarionetteTestRunner.__init__(self, **kwargs) 24 self.test_handlers = [MarionetteTestCase] 25 26 27class MarionetteArguments(BaseMarionetteArguments): 28 pass 29 30 31class MarionetteHarness(object): 32 def __init__(self, 33 runner_class=MarionetteTestRunner, 34 parser_class=MarionetteArguments, 35 testcase_class=MarionetteTestCase, 36 args=None): 37 self._runner_class = runner_class 38 self._parser_class = parser_class 39 self._testcase_class = testcase_class 40 self.args = args or self.parse_args() 41 42 def parse_args(self, logger_defaults=None): 43 parser = self._parser_class( 44 usage='%(prog)s [options] test_file_or_dir <test_file_or_dir> ...') 45 parser.add_argument('--version', action='version', 46 help="Show version information.", 47 version="%(prog)s {version}" 48 " (using marionette-driver: {driver_version}, ".format( 49 version=__version__, 50 driver_version=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 args.logger = logger 60 return vars(args) 61 62 def process_args(self): 63 if self.args.get('pydebugger'): 64 self._testcase_class.pydebugger = __import__(self.args['pydebugger']) 65 66 def run(self): 67 self.process_args() 68 tests = self.args.pop('tests') 69 runner = self._runner_class(**self.args) 70 try: 71 runner.run_tests(tests) 72 finally: 73 runner.cleanup() 74 return runner.failed + runner.crashed 75 76 77def cli(runner_class=MarionetteTestRunner, parser_class=MarionetteArguments, 78 harness_class=MarionetteHarness, testcase_class=MarionetteTestCase, args=None): 79 """ 80 Call the harness to parse args and run tests. 81 82 The following exit codes are expected: 83 - Test failures: 10 84 - Harness/other failures: 1 85 - Success: 0 86 """ 87 logger = mozlog.commandline.setup_logging('Marionette test runner', {}) 88 try: 89 harness_instance = harness_class(runner_class, parser_class, testcase_class, 90 args=args) 91 failed = harness_instance.run() 92 if failed > 0: 93 sys.exit(10) 94 except Exception as e: 95 logger.error(e.message, exc_info=True) 96 sys.exit(1) 97 sys.exit(0) 98 99 100if __name__ == "__main__": 101 cli() 102