diff --git a/tests/debug/__init__.py b/tests/debug/__init__.py index 5e5995d6..d721c7b6 100644 --- a/tests/debug/__init__.py +++ b/tests/debug/__init__.py @@ -4,9 +4,5 @@ from __future__ import absolute_import, division, print_function, unicode_literals - # Expose Session directly. -def Session(*args, **kwargs): - from tests.debug import session - - return session.Session(*args, **kwargs) +from tests.debug.session import Session # noqa diff --git a/tests/debug/session.py b/tests/debug/session.py index 2081ee6e..2b391063 100644 --- a/tests/debug/session.py +++ b/tests/debug/session.py @@ -484,6 +484,12 @@ class Session(object): pid, fmt("{0}-subprocess-{1}", self.debuggee_id, pid) ) + def run_in_terminal(self, args, cwd, env): + exe = args.pop(0) + self.spawn_debuggee.env.update(env) + self.spawn_debuggee(args, cwd, exe=exe) + return {} + def _process_request(self, request): self.timeline.record_request(request, block=False) if request.command == "runInTerminal": @@ -491,11 +497,8 @@ class Session(object): cwd = request("cwd", ".") env = request("env", json.object(unicode)) try: - exe = args.pop(0) - self.spawn_debuggee.env.update(env) - self.spawn_debuggee(args, cwd, exe=exe) - return {} - except OSError as exc: + return self.run_in_terminal(args, cwd, env) + except Exception as exc: log.swallow_exception('"runInTerminal" failed:') raise request.cant_handle(str(exc)) else: diff --git a/tests/debugpy/test_args.py b/tests/debugpy/test_args.py index 6a74b97f..d8d728de 100644 --- a/tests/debugpy/test_args.py +++ b/tests/debugpy/test_args.py @@ -31,3 +31,37 @@ def test_args(pyfile, target, run): pass argv = backchannel.receive() assert argv == [some.str] + args + + +@pytest.mark.parametrize("target", targets.all) +@pytest.mark.parametrize("run", runners.all_launch) +def test_shell_expansion(pyfile, target, run): + @pyfile + def code_to_debug(): + import sys + import debuggee + from debuggee import backchannel + + debuggee.setup() + backchannel.send(sys.argv) + + def expand(args): + for i, arg in enumerate(args): + if arg.startswith("$"): + args[i] = arg[1:] + + class Session(debug.Session): + def run_in_terminal(self, args, cwd, env): + expand(args) + return super(Session, self).run_in_terminal(args, cwd, env) + + args = ["0", "$1", "2"] + with Session() as session: + backchannel = session.open_backchannel() + with run(session, target(code_to_debug, args=args)): + pass + argv = backchannel.receive() + + if session.config["console"] != "internalConsole": + expand(args) + assert argv == [some.str] + args