From 8eb173b44e6c9fe093e58428dc6dd8d812b80318 Mon Sep 17 00:00:00 2001 From: Henrique Date: Wed, 27 Nov 2019 09:21:30 -0500 Subject: [PATCH] Fixed small bugs on command_history and tests --- mitmproxy/addons/command_history.py | 10 +- test/mitmproxy/addons/test_command_history.py | 294 +++++++++--------- 2 files changed, 160 insertions(+), 144 deletions(-) diff --git a/mitmproxy/addons/command_history.py b/mitmproxy/addons/command_history.py index f86a61964..2c1bf8879 100644 --- a/mitmproxy/addons/command_history.py +++ b/mitmproxy/addons/command_history.py @@ -33,11 +33,12 @@ class CommandHistory: if "command_history" in updated or "confdir" in updated: if ctx.options.command_history and self.history_file.is_file(): self.history = self.history_file.read_text().splitlines() + self.set_filter('') def done(self): if ctx.options.command_history and len(self.history) > self.VACUUM_SIZE: # vacuum history so that it doesn't grow indefinitely. - history_str = "\n".join(self.history[-self.VACUUM_SIZE/2:]) + "\n" + history_str = "\n".join(self.history[-self.VACUUM_SIZE / 2:]) + "\n" self.history_file.write_text(history_str) @command.command("commands.history.add") @@ -49,6 +50,9 @@ class CommandHistory: if ctx.options.command_history: with self.history_file.open("a") as f: f.write(f"{command}\n") + f.close() + + self.set_filter('') @command.command("commands.history.get") def get_history(self) -> typing.Sequence[str]: @@ -57,8 +61,10 @@ class CommandHistory: @command.command("commands.history.clear") def clear_history(self): - self.history_file.unlink() + if self.history_file.exists(): + self.history_file.unlink() self.history = [] + self.set_filter('') # Functionality to provide a filtered list that can be iterated through. diff --git a/test/mitmproxy/addons/test_command_history.py b/test/mitmproxy/addons/test_command_history.py index e38b40612..df20fba71 100644 --- a/test/mitmproxy/addons/test_command_history.py +++ b/test/mitmproxy/addons/test_command_history.py @@ -26,200 +26,210 @@ class TestCommandHistory: history.add_command('') assert history.history == ['cmd1', 'cmd2'] - def test_get_next_and_prev(self, tctx): - history = command_history.CommandHistory(5) - history.configure([]) + def test_get_next_and_prev(self, tmpdir): + ch = command_history.CommandHistory() - history.add_command('cmd1') + with taddons.context(ch) as tctx: + tctx.options.confdir = str(tmpdir) - assert history.get_next() == '' - assert history.get_next() == '' - assert history.get_prev() == 'cmd1' - assert history.get_prev() == 'cmd1' - assert history.get_prev() == 'cmd1' - assert history.get_next() == '' - assert history.get_next() == '' + ch.add_command('cmd1') - history.add_command('cmd2') + assert ch.get_next() == '' + assert ch.get_next() == '' + assert ch.get_prev() == 'cmd1' + assert ch.get_prev() == 'cmd1' + assert ch.get_prev() == 'cmd1' + assert ch.get_next() == '' + assert ch.get_next() == '' - assert history.get_next() == '' - assert history.get_next() == '' - assert history.get_prev() == 'cmd2' - assert history.get_prev() == 'cmd1' - assert history.get_prev() == 'cmd1' - assert history.get_next() == 'cmd2' - assert history.get_next() == '' - assert history.get_next() == '' + ch.add_command('cmd2') - history.add_command('cmd3') + assert ch.get_next() == '' + assert ch.get_next() == '' + assert ch.get_prev() == 'cmd2' + assert ch.get_prev() == 'cmd1' + assert ch.get_prev() == 'cmd1' + assert ch.get_next() == 'cmd2' + assert ch.get_next() == '' + assert ch.get_next() == '' - assert history.get_next() == '' - assert history.get_next() == '' - assert history.get_prev() == 'cmd3' - assert history.get_prev() == 'cmd2' - assert history.get_prev() == 'cmd1' - assert history.get_prev() == 'cmd1' - assert history.get_next() == 'cmd2' - assert history.get_next() == 'cmd3' - assert history.get_next() == '' - assert history.get_next() == '' - assert history.get_prev() == 'cmd3' - assert history.get_prev() == 'cmd2' + ch.add_command('cmd3') - history.add_command('cmd4') + assert ch.get_next() == '' + assert ch.get_next() == '' + assert ch.get_prev() == 'cmd3' + assert ch.get_prev() == 'cmd2' + assert ch.get_prev() == 'cmd1' + assert ch.get_prev() == 'cmd1' + assert ch.get_next() == 'cmd2' + assert ch.get_next() == 'cmd3' + assert ch.get_next() == '' + assert ch.get_next() == '' + assert ch.get_prev() == 'cmd3' + assert ch.get_prev() == 'cmd2' - assert history.get_prev() == 'cmd4' - assert history.get_prev() == 'cmd3' - assert history.get_prev() == 'cmd2' - assert history.get_prev() == 'cmd1' - assert history.get_prev() == 'cmd1' - assert history.get_next() == 'cmd2' - assert history.get_next() == 'cmd3' - assert history.get_next() == 'cmd4' - assert history.get_next() == '' - assert history.get_next() == '' + ch.add_command('cmd4') - history.add_command('cmd5') - history.add_command('cmd6') + assert ch.get_prev() == 'cmd4' + assert ch.get_prev() == 'cmd3' + assert ch.get_prev() == 'cmd2' + assert ch.get_prev() == 'cmd1' + assert ch.get_prev() == 'cmd1' + assert ch.get_next() == 'cmd2' + assert ch.get_next() == 'cmd3' + assert ch.get_next() == 'cmd4' + assert ch.get_next() == '' + assert ch.get_next() == '' - assert history.get_next() == '' - assert history.get_prev() == 'cmd6' - assert history.get_prev() == 'cmd5' - assert history.get_prev() == 'cmd4' - assert history.get_next() == 'cmd5' - assert history.get_prev() == 'cmd4' - assert history.get_prev() == 'cmd3' - assert history.get_prev() == 'cmd2' - assert history.get_next() == 'cmd3' - assert history.get_prev() == 'cmd2' - assert history.get_prev() == 'cmd2' - assert history.get_next() == 'cmd3' - assert history.get_next() == 'cmd4' - assert history.get_next() == 'cmd5' - assert history.get_next() == 'cmd6' - assert history.get_next() == '' - assert history.get_next() == '' + ch.add_command('cmd5') + ch.add_command('cmd6') - history.cleanup() + assert ch.get_next() == '' + assert ch.get_prev() == 'cmd6' + assert ch.get_prev() == 'cmd5' + assert ch.get_prev() == 'cmd4' + assert ch.get_next() == 'cmd5' + assert ch.get_prev() == 'cmd4' + assert ch.get_prev() == 'cmd3' + assert ch.get_prev() == 'cmd2' + assert ch.get_next() == 'cmd3' + assert ch.get_prev() == 'cmd2' + assert ch.get_prev() == 'cmd1' + assert ch.get_prev() == 'cmd1' + assert ch.get_prev() == 'cmd1' + assert ch.get_next() == 'cmd2' + assert ch.get_next() == 'cmd3' + assert ch.get_next() == 'cmd4' + assert ch.get_next() == 'cmd5' + assert ch.get_next() == 'cmd6' + assert ch.get_next() == '' + assert ch.get_next() == '' - def test_clear(self, tctx): - history = command_history.CommandHistory(3) - history.configure([]) + ch.clear_history() - history.add_command('cmd1') - history.add_command('cmd2') - history.clear_history() + def test_clear(self, tmpdir): + ch = command_history.CommandHistory() - saved_commands = [cmd for cmd in history.history] - assert saved_commands == [] + with taddons.context(ch) as tctx: + tctx.options.confdir = str(tmpdir) + ch.add_command('cmd1') + ch.add_command('cmd2') + ch.clear_history() - assert history.get_next() == '' - assert history.get_next() == '' - assert history.get_prev() == '' - assert history.get_prev() == '' + saved_commands = ch.get_history() + assert saved_commands == [] - history.cleanup() + assert ch.get_next() == '' + assert ch.get_next() == '' + assert ch.get_prev() == '' + assert ch.get_prev() == '' - def test_filter(self, tctx): - history = command_history.CommandHistory(3) - history.configure([]) + ch.clear_history() - history.add_command('cmd1') - history.add_command('cmd2') - history.add_command('abc') - history.set_filter('c') + def test_filter(self, tmpdir): + ch = command_history.CommandHistory() - assert history.get_next() == '' - assert history.get_next() == '' - assert history.get_prev() == 'c' - assert history.get_prev() == 'cmd2' - assert history.get_prev() == 'cmd1' - assert history.get_prev() == 'cmd1' - assert history.get_next() == 'cmd2' - assert history.get_next() == 'c' - assert history.get_next() == '' - assert history.get_next() == '' + with taddons.context(ch) as tctx: + tctx.options.confdir = str(tmpdir) - history.set_filter('') + ch.add_command('cmd1') + ch.add_command('cmd2') + ch.add_command('abc') + ch.set_filter('c') - assert history.get_next() == '' - assert history.get_next() == '' - assert history.get_prev() == 'abc' - assert history.get_prev() == 'cmd2' - assert history.get_prev() == 'cmd1' - assert history.get_prev() == 'cmd1' - assert history.get_next() == 'cmd2' - assert history.get_next() == 'abc' - assert history.get_next() == '' - assert history.get_next() == '' + assert ch.get_next() == 'c' + assert ch.get_next() == 'c' + assert ch.get_prev() == 'cmd2' + assert ch.get_prev() == 'cmd1' + assert ch.get_prev() == 'cmd1' + assert ch.get_next() == 'cmd2' + assert ch.get_next() == 'c' + assert ch.get_next() == 'c' - history.cleanup() + ch.set_filter('') + + assert ch.get_next() == '' + assert ch.get_next() == '' + assert ch.get_prev() == 'abc' + assert ch.get_prev() == 'cmd2' + assert ch.get_prev() == 'cmd1' + assert ch.get_prev() == 'cmd1' + assert ch.get_next() == 'cmd2' + assert ch.get_next() == 'abc' + assert ch.get_next() == '' + assert ch.get_next() == '' + + ch.clear_history() + + def test_multiple_instances(self, tmpdir): + ch = command_history.CommandHistory() + with taddons.context(ch) as tctx: + tctx.options.confdir = str(tmpdir) - def test_multiple_instances(self, tctx): instances = [ - command_history.CommandHistory(10), - command_history.CommandHistory(10), - command_history.CommandHistory(10) + command_history.CommandHistory(), + command_history.CommandHistory(), + command_history.CommandHistory() ] for i in instances: - i.configure([]) - saved_commands = [cmd for cmd in i.history] + i.configure('command_history') + saved_commands = i.get_history() assert saved_commands == [] instances[0].add_command('cmd1') - saved_commands = [cmd for cmd in instances[0].history] + saved_commands = instances[0].get_history() assert saved_commands == ['cmd1'] # These instances haven't yet added a new command, so they haven't # yet reloaded their commands from the command file. # This is expected, because if the user is filtering a command on # another window, we don't want to interfere with that - saved_commands = [cmd for cmd in instances[1].history] + saved_commands = instances[1].get_history() assert saved_commands == [] - saved_commands = [cmd for cmd in instances[2].history] + saved_commands = instances[2].get_history() assert saved_commands == [] # Since the second instanced added a new command, its list of # saved commands has been updated to have the commands from the # first instance + its own commands instances[1].add_command('cmd2') - saved_commands = [cmd for cmd in instances[1].history] - assert saved_commands == ['cmd1', 'cmd2'] + saved_commands = instances[1].get_history() + assert saved_commands == ['cmd2'] - saved_commands = [cmd for cmd in instances[0].history] + saved_commands = instances[0].get_history() assert saved_commands == ['cmd1'] # Third instance is still empty as it has not yet ran any command - saved_commands = [cmd for cmd in instances[2].history] + saved_commands = instances[2].get_history() assert saved_commands == [] instances[2].add_command('cmd3') - saved_commands = [cmd for cmd in instances[2].history] - assert saved_commands == ['cmd1', 'cmd2', 'cmd3'] + saved_commands = instances[2].get_history() + assert saved_commands == ['cmd3'] instances[0].add_command('cmd4') - saved_commands = [cmd for cmd in instances[0].history] - assert saved_commands == ['cmd1', 'cmd2', 'cmd3', 'cmd4'] + saved_commands = instances[0].get_history() + assert saved_commands == ['cmd1', 'cmd4'] - instances.append(command_history.CommandHistory(10)) - instances[3].configure([]) - saved_commands = [cmd for cmd in instances[3].history] + instances.append(command_history.CommandHistory()) + instances[3].configure('command_history') + saved_commands = instances[3].get_history() assert saved_commands == ['cmd1', 'cmd2', 'cmd3', 'cmd4'] instances[0].add_command('cmd_before_close') - instances.pop(0) + instances.pop(0).done() - saved_commands = [cmd for cmd in instances[0].history] - assert saved_commands == ['cmd1', 'cmd2'] + saved_commands = instances[0].get_history() + assert saved_commands == ['cmd2'] instances[0].add_command('new_cmd') - saved_commands = [cmd for cmd in instances[0].history] - assert saved_commands == ['cmd1', 'cmd2', 'cmd3', 'cmd4', 'cmd_before_close', 'new_cmd'] + saved_commands = instances[0].get_history() + assert saved_commands == ['cmd2', 'new_cmd'] - instances.pop(0) - instances.pop(0) - instances.pop(0) + instances.pop(0).done() + instances.pop(0).done() + instances.pop(0).done() _path = os.path.join(tctx.options.confdir, 'command_history') lines = open(_path, 'r').readlines() @@ -227,14 +237,14 @@ class TestCommandHistory: assert saved_commands == ['cmd1', 'cmd2', 'cmd3', 'cmd4', 'cmd_before_close', 'new_cmd'] instances = [ - command_history.CommandHistory(10), - command_history.CommandHistory(10) + command_history.CommandHistory(), + command_history.CommandHistory() ] for i in instances: - i.configure([]) + i.configure('command_history') i.clear_history() - saved_commands = [cmd for cmd in i.history] + saved_commands = i.get_history() assert saved_commands == [] instances[0].add_command('cmd1') @@ -243,11 +253,11 @@ class TestCommandHistory: instances[1].add_command('cmd4') instances[1].add_command('cmd5') - saved_commands = [cmd for cmd in instances[1].history] - assert saved_commands == ['cmd1', 'cmd2', 'cmd3', 'cmd4', 'cmd5'] + saved_commands = instances[1].get_history() + assert saved_commands == ['cmd3', 'cmd4', 'cmd5'] - instances.pop() - instances.pop() + instances.pop().done() + instances.pop().done() _path = os.path.join(tctx.options.confdir, 'command_history') lines = open(_path, 'r').readlines()