diff options
Diffstat (limited to 'testing/geckodriver/mach_commands.py')
-rw-r--r-- | testing/geckodriver/mach_commands.py | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/testing/geckodriver/mach_commands.py b/testing/geckodriver/mach_commands.py new file mode 100644 index 0000000000..cb56d3acf2 --- /dev/null +++ b/testing/geckodriver/mach_commands.py @@ -0,0 +1,122 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import logging +import os + +from mach.decorators import Command, CommandArgument, CommandArgumentGroup +from mozbuild.base import BinaryNotFoundException + + +@Command( + "geckodriver", + category="post-build", + description="Run the WebDriver implementation for Gecko.", +) +@CommandArgument( + "--binary", type=str, help="Firefox binary (defaults to the local build)." +) +@CommandArgument( + "params", nargs="...", help="Flags to be passed through to geckodriver." +) +@CommandArgumentGroup("debugging") +@CommandArgument( + "--debug", + action="store_true", + group="debugging", + help="Enable the debugger. Not specifying a --debugger " + "option will result in the default debugger " + "being used.", +) +@CommandArgument( + "--debugger", + default=None, + type=str, + group="debugging", + help="Name of debugger to use.", +) +@CommandArgument( + "--debugger-args", + default=None, + metavar="params", + type=str, + group="debugging", + help="Flags to pass to the debugger itself; split as the Bourne shell would.", +) +def run(command_context, binary, params, debug, debugger, debugger_args): + try: + binpath = command_context.get_binary_path("geckodriver") + except BinaryNotFoundException as e: + command_context.log( + logging.ERROR, "geckodriver", {"error": str(e)}, "ERROR: {error}" + ) + command_context.log( + logging.INFO, + "geckodriver", + {}, + "It looks like geckodriver isn't built. " + "Add ac_add_options --enable-geckodriver to your " + "mozconfig " + "and run |./mach build| to build it.", + ) + return 1 + + args = [binpath] + + if params: + args.extend(params) + + if binary is None: + try: + binary = command_context.get_binary_path("app") + except BinaryNotFoundException as e: + command_context.log( + logging.ERROR, "geckodriver", {"error": str(e)}, "ERROR: {error}" + ) + command_context.log( + logging.INFO, "geckodriver", {"help": e.help()}, "{help}" + ) + return 1 + + args.extend(["--binary", binary]) + + if debug or debugger or debugger_args: + if "INSIDE_EMACS" in os.environ: + command_context.log_manager.terminal_handler.setLevel(logging.WARNING) + + import mozdebug + + if not debugger: + # No debugger name was provided. Look for the default ones on + # current OS. + debugger = mozdebug.get_default_debugger_name( + mozdebug.DebuggerSearch.KeepLooking + ) + + if debugger: + debuggerInfo = mozdebug.get_debugger_info(debugger, debugger_args) + if not debuggerInfo: + print("Could not find a suitable debugger in your PATH.") + return 1 + + # Parameters come from the CLI. We need to convert them before + # their use. + if debugger_args: + from mozbuild import shellutil + + try: + debugger_args = shellutil.split(debugger_args) + except shellutil.MetaCharacterException as e: + print( + "The --debugger-args you passed require a real shell to parse them." + ) + print("(We can't handle the %r character.)" % e.char) + return 1 + + # Prepend the debugger args. + args = [debuggerInfo.path] + debuggerInfo.args + args + + return command_context.run_process( + args=args, ensure_exit_code=False, pass_thru=True + ) |