From 465044c3731ac0077387f1cbb39ae4f90d3f06c8 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Sun, 17 Dec 2017 18:46:00 +0100 Subject: [PATCH] test that defaultkeys are valid commands --- mitmproxy/command.py | 16 ++++++++----- .../tools/console/test_defaultkeys.py | 23 +++++++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 test/mitmproxy/tools/console/test_defaultkeys.py diff --git a/mitmproxy/command.py b/mitmproxy/command.py index e1e56d3a5..7bb2bf8e9 100644 --- a/mitmproxy/command.py +++ b/mitmproxy/command.py @@ -76,11 +76,7 @@ class Command: ret = " -> " + ret return "%s %s%s" % (self.path, params, ret) - def call(self, args: typing.Sequence[str]) -> typing.Any: - """ - Call the command with a list of arguments. At this point, all - arguments are strings. - """ + def prepare_args(self, args: typing.Sequence[str]) -> typing.List[typing.Any]: verify_arg_signature(self.func, list(args), {}) remainder = [] # type: typing.Sequence[str] @@ -92,6 +88,14 @@ class Command: for arg, paramtype in zip(args, self.paramtypes): pargs.append(parsearg(self.manager, arg, paramtype)) pargs.extend(remainder) + return pargs + + def call(self, args: typing.Sequence[str]) -> typing.Any: + """ + Call the command with a list of arguments. At this point, all + arguments are strings. + """ + pargs = self.prepare_args(args) with self.manager.master.handlecontext(): ret = self.func(*pargs) @@ -121,7 +125,7 @@ ParseResult = typing.NamedTuple( class CommandManager(mitmproxy.types._CommandBase): def __init__(self, master): self.master = master - self.commands = {} + self.commands = {} # type: typing.Dict[str, Command] def collect_commands(self, addon): for i in dir(addon): diff --git a/test/mitmproxy/tools/console/test_defaultkeys.py b/test/mitmproxy/tools/console/test_defaultkeys.py new file mode 100644 index 000000000..1f17c8885 --- /dev/null +++ b/test/mitmproxy/tools/console/test_defaultkeys.py @@ -0,0 +1,23 @@ +from mitmproxy.test.tflow import tflow +from mitmproxy.tools.console import defaultkeys +from mitmproxy.tools.console import keymap +from mitmproxy.tools.console import master +from mitmproxy import command + + +def test_commands_exist(): + km = keymap.Keymap(None) + defaultkeys.map(km) + assert km.bindings + m = master.ConsoleMaster(None) + m.load_flow(tflow()) + + for binding in km.bindings: + cmd, *args = command.lexer(binding.command) + assert cmd in m.commands.commands + + cmd_obj = m.commands.commands[cmd] + try: + cmd_obj.prepare_args(args) + except Exception as e: + raise ValueError("Invalid command: {}".format(binding.command)) from e