diff --git a/gdbgui/statemanager.py b/gdbgui/statemanager.py index 4406361b..f28232a3 100644 --- a/gdbgui/statemanager.py +++ b/gdbgui/statemanager.py @@ -1,13 +1,12 @@ import logging import traceback from collections import defaultdict -from copy import deepcopy from typing import Any, Dict, List, Optional - +import copy from pygdbmi.gdbcontroller import GdbController # type: ignore -REQUIRED_GDB_FLAGS = ["--interpreter=mi2"] logger = logging.getLogger(__name__) +GDB_MI_FLAG = ["--interpreter=mi2"] class StateManager(object): @@ -18,6 +17,16 @@ def __init__(self, config: Dict[str, Any]): self.gdb_reader_thread = None self.config = config + def get_gdb_args(self): + gdb_args = copy.copy(GDB_MI_FLAG) + if self.config["gdb_args"]: + gdb_args += self.config["gdb_args"] + + if self.config["initial_binary_and_args"]: + gdb_args += ["--args"] + gdb_args += self.config["initial_binary_and_args"] + return gdb_args + def connect_client(self, client_id: str, desired_gdbpid: int) -> Dict[str, Any]: message = "" pid: Optional[int] = 0 @@ -45,11 +54,7 @@ def connect_client(self, client_id: str, desired_gdbpid: int) -> Dict[str, Any]: if self.get_controller_from_client_id(client_id) is None: logger.info("new sid", client_id) - gdb_args = ( - deepcopy(self.config["initial_binary_and_args"]) - + deepcopy(self.config["gdb_args"]) - + REQUIRED_GDB_FLAGS - ) + gdb_args = self.get_gdb_args() controller = GdbController( gdb_path=self.config["gdb_path"], diff --git a/noxfile.py b/noxfile.py index 7490b1c8..409e0441 100644 --- a/noxfile.py +++ b/noxfile.py @@ -8,6 +8,7 @@ doc_dependencies = [".", "mkdocs", "mkdocs-material"] lint_dependencies = ["black", "flake8", "mypy", "check-manifest"] +files_to_lint = ["gdbgui", "tests"] + [str(p) for p in Path(".").glob("*.py")] @nox.session(python=python) @@ -53,10 +54,9 @@ def lint(session): external=True, ) session.install(*lint_dependencies) - files = ["gdbgui", "tests"] + [str(p) for p in Path(".").glob("*.py")] - session.run("black", "--check", *files) - session.run("flake8", *files) - session.run("mypy", *files) # + session.run("black", "--check", *files_to_lint) + session.run("flake8", *files_to_lint) + session.run("mypy", *files_to_lint) # session.run( "check-manifest", "--ignore", @@ -65,6 +65,12 @@ def lint(session): session.run("python", "setup.py", "check", "--metadata", "--strict") +@nox.session(python="3.7") +def autoformat(session): + session.install("black") + session.run("black", *files_to_lint) + + @nox.session(python="3.7") def docs(session): session.install(*doc_dependencies) @@ -76,7 +82,7 @@ def develop(session): session.install(*doc_dependencies, *lint_dependencies) session.install("-e", ".") command = "source %s/bin/activate" % (session.virtualenv.location_name) - session.log("Virtual Envrionment is ready to be used for development") + session.log("Virtual Environment is ready to be used for development") session.log("To use, run: '%s'", command) diff --git a/tests/test_main.py b/tests/test_main.py index cb91cb04..ea13fd56 100755 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -1,22 +1,31 @@ import gdbgui import pytest # type: ignore import sys +from gdbgui.statemanager import StateManager, GDB_MI_FLAG @pytest.mark.parametrize( - "test_argv, init_bin_args, gdb_args", + "test_argv, expected_gdb_args", [ - (["gdbgui"], [], []), - (["gdbgui", "--gdb-args", "mybin -myargs"], [], ["mybin", "-myargs"]), - (["gdbgui", "--args", "mybin", "-myargs"], ["mybin", "-myargs"], []), + (["gdbgui"], GDB_MI_FLAG), + (["gdbgui", "mybin -myargs"], GDB_MI_FLAG + ["mybin", "-myargs"]), + ( + ["gdbgui", "--gdb-args", "--nx --tty=/dev/ttys002 mybin -myargs"], + GDB_MI_FLAG + ["--nx", "--tty=/dev/ttys002", "mybin", "-myargs"], + ), + ( + ["gdbgui", "-n", "--args", "mybin", "-myargs"], + GDB_MI_FLAG + ["--args", "mybin", "-myargs"], + ), ], ) -def test_argument_parsing(monkeypatch, test_argv, init_bin_args, gdb_args): +def test_arguments_passed_to_gdb(monkeypatch, test_argv, expected_gdb_args): def mock_setup_backend(*args, **kwargs): pass monkeypatch.setattr(gdbgui.backend, "setup_backend", mock_setup_backend) monkeypatch.setattr(sys, "argv", test_argv) gdbgui.backend.main() - assert gdbgui.backend.app.config.get("initial_binary_and_args") == init_bin_args - assert gdbgui.backend.app.config.get("gdb_args") == gdb_args + + state = StateManager(gdbgui.backend.app.config) + assert len(state.get_gdb_args()) == len(expected_gdb_args)