From f7f9cab5dc5fa779287d09f75507ca1ce2c99bba Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Sat, 4 Jun 2016 14:37:07 +1200 Subject: Rebase on master --- test/mitmproxy/mastertest.py | 33 +++++++++ test/mitmproxy/test_dump.py | 145 ++++++++++++++++++-------------------- test/mitmproxy/test_web_app.py | 0 test/mitmproxy/test_web_master.py | 17 +++++ 4 files changed, 119 insertions(+), 76 deletions(-) create mode 100644 test/mitmproxy/mastertest.py create mode 100644 test/mitmproxy/test_web_app.py create mode 100644 test/mitmproxy/test_web_master.py (limited to 'test') diff --git a/test/mitmproxy/mastertest.py b/test/mitmproxy/mastertest.py new file mode 100644 index 00000000..9bb8826d --- /dev/null +++ b/test/mitmproxy/mastertest.py @@ -0,0 +1,33 @@ +import tutils +import netlib.tutils +import mock + +from mitmproxy import flow, proxy, models + + +class MasterTest: + def cycle(self, master, content): + f = tutils.tflow(req=netlib.tutils.treq(content=content)) + l = proxy.Log("connect") + l.reply = mock.MagicMock() + master.log(l) + master.clientconnect(f.client_conn) + master.serverconnect(f.server_conn) + master.request(f) + if not f.error: + f.response = models.HTTPResponse.wrap(netlib.tutils.tresp(content=content)) + f = master.response(f) + master.clientdisconnect(f.client_conn) + return f + + def dummy_cycle(self, master, n, content): + for i in range(n): + self.cycle(master, content) + master.shutdown() + + def flowfile(self, path): + f = open(path, "wb") + fw = flow.FlowWriter(f) + t = tutils.tflow(resp=True) + fw.add(t) + f.close() diff --git a/test/mitmproxy/test_dump.py b/test/mitmproxy/test_dump.py index 36b78168..234490f8 100644 --- a/test/mitmproxy/test_dump.py +++ b/test/mitmproxy/test_dump.py @@ -1,13 +1,11 @@ import os from six.moves import cStringIO as StringIO from mitmproxy.exceptions import ContentViewException -from mitmproxy.models import HTTPResponse import netlib.tutils -from mitmproxy import dump, flow -from mitmproxy.proxy import Log -from . import tutils +from mitmproxy import dump, flow, models +from . import tutils, mastertest import mock @@ -58,37 +56,28 @@ def test_contentview(get_content_view): assert "Content viewer failed" in m.outfile.getvalue() -class TestDumpMaster: +class TestDumpMaster(mastertest.MasterTest): + def dummy_cycle(self, master, n, content): + mastertest.MasterTest.dummy_cycle(self, master, n, content) + return master.outfile.getvalue() - def _cycle(self, m, content): - f = tutils.tflow(req=netlib.tutils.treq(content=content)) - l = Log("connect") - l.reply = mock.MagicMock() - m.log(l) - m.clientconnect(f.client_conn) - m.serverconnect(f.server_conn) - m.request(f) - if not f.error: - f.response = HTTPResponse.wrap(netlib.tutils.tresp(content=content)) - f = m.response(f) - m.clientdisconnect(f.client_conn) - return f - - def _dummy_cycle(self, n, filt, content, **options): + def mkmaster(self, filt, **options): cs = StringIO() o = dump.Options(filtstr=filt, **options) - m = dump.DumpMaster(None, o, outfile=cs) - for i in range(n): - self._cycle(m, content) - m.shutdown() - return cs.getvalue() - - def _flowfile(self, path): - f = open(path, "wb") - fw = flow.FlowWriter(f) - t = tutils.tflow(resp=True) - fw.add(t) - f.close() + return dump.DumpMaster(None, o, outfile=cs) + + def test_basic(self): + for i in (1, 2, 3): + assert "GET" in self.dummy_cycle(self.mkmaster("~s", flow_detail=i), 1, "") + assert "GET" in self.dummy_cycle( + self.mkmaster("~s", flow_detail=i), + 1, + "\x00\x00\x00" + ) + assert "GET" in self.dummy_cycle( + self.mkmaster("~s", flow_detail=i), + 1, "ascii" + ) def test_error(self): cs = StringIO() @@ -106,7 +95,7 @@ class TestDumpMaster: f = tutils.tflow() f.request.content = None m.request(f) - f.response = HTTPResponse.wrap(netlib.tutils.tresp()) + f.response = models.HTTPResponse.wrap(netlib.tutils.tresp()) f.response.content = None m.response(f) assert "content missing" in cs.getvalue() @@ -119,17 +108,17 @@ class TestDumpMaster: with tutils.tmpdir() as t: p = os.path.join(t, "rep") - self._flowfile(p) + self.flowfile(p) o = dump.Options(server_replay=[p], kill=True) m = dump.DumpMaster(None, o, outfile=cs) - self._cycle(m, "content") - self._cycle(m, "content") + self.cycle(m, "content") + self.cycle(m, "content") o = dump.Options(server_replay=[p], kill=False) m = dump.DumpMaster(None, o, outfile=cs) - self._cycle(m, "nonexistent") + self.cycle(m, "nonexistent") o = dump.Options(client_replay=[p], kill=False) m = dump.DumpMaster(None, o, outfile=cs) @@ -137,22 +126,19 @@ class TestDumpMaster: def test_read(self): with tutils.tmpdir() as t: p = os.path.join(t, "read") - self._flowfile(p) - assert "GET" in self._dummy_cycle( - 0, - None, - "", - flow_detail=1, - rfile=p + self.flowfile(p) + assert "GET" in self.dummy_cycle( + self.mkmaster(None, flow_detail=1, rfile=p), + 0, "", ) tutils.raises( - dump.DumpError, self._dummy_cycle, - 0, None, "", verbosity=1, rfile="/nonexistent" + dump.DumpError, + self.mkmaster, None, verbosity=1, rfile="/nonexistent" ) tutils.raises( - dump.DumpError, self._dummy_cycle, - 0, None, "", verbosity=1, rfile="test_dump.py" + dump.DumpError, + self.mkmaster, None, verbosity=1, rfile="test_dump.py" ) def test_options(self): @@ -160,7 +146,9 @@ class TestDumpMaster: assert o.verbosity == 2 def test_filter(self): - assert "GET" not in self._dummy_cycle(1, "~u foo", "", verbosity=1) + assert "GET" not in self.dummy_cycle( + self.mkmaster("~u foo", verbosity=1), 1, "" + ) def test_app(self): o = dump.Options(app=True) @@ -172,53 +160,50 @@ class TestDumpMaster: cs = StringIO() o = dump.Options(replacements=[(".*", "content", "foo")]) m = dump.DumpMaster(None, o, outfile=cs) - f = self._cycle(m, "content") + f = self.cycle(m, "content") assert f.request.content == "foo" def test_setheader(self): cs = StringIO() o = dump.Options(setheaders=[(".*", "one", "two")]) m = dump.DumpMaster(None, o, outfile=cs) - f = self._cycle(m, "content") + f = self.cycle(m, "content") assert f.request.headers["one"] == "two" - def test_basic(self): - for i in (1, 2, 3): - assert "GET" in self._dummy_cycle(1, "~s", "", flow_detail=i) - assert "GET" in self._dummy_cycle( - 1, - "~s", - "\x00\x00\x00", - flow_detail=i) - assert "GET" in self._dummy_cycle(1, "~s", "ascii", flow_detail=i) - def test_write(self): with tutils.tmpdir() as d: p = os.path.join(d, "a") - self._dummy_cycle(1, None, "", outfile=(p, "wb"), verbosity=0) + self.dummy_cycle( + self.mkmaster(None, outfile=(p, "wb"), verbosity=0), 1, "" + ) assert len(list(flow.FlowReader(open(p, "rb")).stream())) == 1 def test_write_append(self): with tutils.tmpdir() as d: p = os.path.join(d, "a.append") - self._dummy_cycle(1, None, "", outfile=(p, "wb"), verbosity=0) - self._dummy_cycle(1, None, "", outfile=(p, "ab"), verbosity=0) + self.dummy_cycle( + self.mkmaster(None, outfile=(p, "wb"), verbosity=0), + 1, "" + ) + self.dummy_cycle( + self.mkmaster(None, outfile=(p, "ab"), verbosity=0), + 1, "" + ) assert len(list(flow.FlowReader(open(p, "rb")).stream())) == 2 def test_write_err(self): tutils.raises( dump.DumpError, - self._dummy_cycle, - 1, - None, - "", - outfile = ("nonexistentdir/foo", "wb") + self.mkmaster, None, outfile = ("nonexistentdir/foo", "wb") ) def test_script(self): - ret = self._dummy_cycle( - 1, None, "", - scripts=[tutils.test_data.path("data/scripts/all.py")], verbosity=1 + ret = self.dummy_cycle( + self.mkmaster( + None, + scripts=[tutils.test_data.path("data/scripts/all.py")], verbosity=1 + ), + 1, "", ) assert "XCLIENTCONNECT" in ret assert "XSERVERCONNECT" in ret @@ -227,15 +212,23 @@ class TestDumpMaster: assert "XCLIENTDISCONNECT" in ret tutils.raises( dump.DumpError, - self._dummy_cycle, 1, None, "", scripts=["nonexistent"] + self.mkmaster, + None, scripts=["nonexistent"] ) tutils.raises( dump.DumpError, - self._dummy_cycle, 1, None, "", scripts=["starterr.py"] + self.mkmaster, + None, scripts=["starterr.py"] ) def test_stickycookie(self): - self._dummy_cycle(1, None, "", stickycookie = ".*") + self.dummy_cycle( + self.mkmaster(None, stickycookie = ".*"), + 1, "" + ) def test_stickyauth(self): - self._dummy_cycle(1, None, "", stickyauth = ".*") + self.dummy_cycle( + self.mkmaster(None, stickyauth = ".*"), + 1, "" + ) diff --git a/test/mitmproxy/test_web_app.py b/test/mitmproxy/test_web_app.py new file mode 100644 index 00000000..e69de29b diff --git a/test/mitmproxy/test_web_master.py b/test/mitmproxy/test_web_master.py new file mode 100644 index 00000000..98f53c93 --- /dev/null +++ b/test/mitmproxy/test_web_master.py @@ -0,0 +1,17 @@ +from mitmproxy.web import master +from . import mastertest + + +class TestWebMaster(mastertest.MasterTest): + def mkmaster(self, filt, **options): + o = master.Options( + filtstr=filt, + **options + ) + return master.WebMaster(None, o) + + def test_basic(self): + m = self.mkmaster(None) + for i in (1, 2, 3): + self.dummy_cycle(m, 1, "") + assert len(m.state.flows) == i -- cgit v1.2.3 From 12a4f9ecf94760f0c63064ce3b42699ab16fffa6 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Sat, 4 Jun 2016 15:30:28 +1200 Subject: Very basic test truss for web.app --- test/mitmproxy/test_web_app.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'test') diff --git a/test/mitmproxy/test_web_app.py b/test/mitmproxy/test_web_app.py index e69de29b..ae934cfc 100644 --- a/test/mitmproxy/test_web_app.py +++ b/test/mitmproxy/test_web_app.py @@ -0,0 +1,22 @@ +import tornado.testing + +from mitmproxy.web import app, master + + +class TestApp(tornado.testing.AsyncHTTPTestCase): + def get_app(self): + o = master.Options() + m = master.WebMaster(None, o) + return app.Application(m, None, None) + + def test_index(self): + assert self.fetch("/").code == 200 + + def test_filter_help(self): + assert self.fetch("/filter-help").code == 200 + + def test_events(self): + assert self.fetch("/events").code == 200 + + def test_flows(self): + assert self.fetch("/flows").code == 200 -- cgit v1.2.3 From af63a3e064f51db986a84dfc38bd1b136812eae8 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Sat, 4 Jun 2016 16:06:44 +1200 Subject: console/__init__.py -> console/master.py --- test/mitmproxy/console/test_console.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'test') diff --git a/test/mitmproxy/console/test_console.py b/test/mitmproxy/console/test_console.py index b68dd811..52d2c49a 100644 --- a/test/mitmproxy/console/test_console.py +++ b/test/mitmproxy/console/test_console.py @@ -15,7 +15,7 @@ class TestConsoleState: connect -> request -> response """ - c = console.ConsoleState() + c = console.master.ConsoleState() f = self._add_request(c) assert f in c.flows assert c.get_focus() == (f, 0) @@ -26,7 +26,7 @@ class TestConsoleState: connect -> request -> response """ - c = console.ConsoleState() + c = console.master.ConsoleState() f = self._add_request(c) assert c.get_focus() == (f, 0) @@ -62,14 +62,14 @@ class TestConsoleState: state.update_flow(f) def test_add_response(self): - c = console.ConsoleState() + c = console.master.ConsoleState() f = self._add_request(c) f.response = netlib.tutils.tresp() c.focus = None c.update_flow(f) def test_focus_view(self): - c = console.ConsoleState() + c = console.master.ConsoleState() self._add_request(c) self._add_response(c) self._add_request(c) @@ -81,7 +81,7 @@ class TestConsoleState: assert c.focus == 0 def test_settings(self): - c = console.ConsoleState() + c = console.master.ConsoleState() f = self._add_request(c) c.add_flow_setting(f, "foo", "bar") assert c.get_flow_setting(f, "foo") == "bar" @@ -107,4 +107,4 @@ def test_format_keyvals(): def test_options(): - assert console.Options(kill=True) + assert console.master.Options(kill=True) -- cgit v1.2.3 From d5532319c1fef4b10146f8643f9a02a7f948d446 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Sat, 4 Jun 2016 16:29:54 +1200 Subject: Basic ConsoleMaster tests, based on mastertester --- test/mitmproxy/console/test_console.py | 110 ----------------------------- test/mitmproxy/console/test_master.py | 122 +++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 110 deletions(-) delete mode 100644 test/mitmproxy/console/test_console.py create mode 100644 test/mitmproxy/console/test_master.py (limited to 'test') diff --git a/test/mitmproxy/console/test_console.py b/test/mitmproxy/console/test_console.py deleted file mode 100644 index 52d2c49a..00000000 --- a/test/mitmproxy/console/test_console.py +++ /dev/null @@ -1,110 +0,0 @@ -import gc - -import netlib.tutils -from mitmproxy import console -from mitmproxy.console import common - -from .. import tutils - - -class TestConsoleState: - - def test_flow(self): - """ - normal flow: - - connect -> request -> response - """ - c = console.master.ConsoleState() - f = self._add_request(c) - assert f in c.flows - assert c.get_focus() == (f, 0) - - def test_focus(self): - """ - normal flow: - - connect -> request -> response - """ - c = console.master.ConsoleState() - f = self._add_request(c) - - assert c.get_focus() == (f, 0) - assert c.get_from_pos(0) == (f, 0) - assert c.get_from_pos(1) == (None, None) - assert c.get_next(0) == (None, None) - - f2 = self._add_request(c) - assert c.get_focus() == (f, 0) - assert c.get_next(0) == (f2, 1) - assert c.get_prev(1) == (f, 0) - assert c.get_next(1) == (None, None) - - c.set_focus(0) - assert c.get_focus() == (f, 0) - c.set_focus(-1) - assert c.get_focus() == (f, 0) - c.set_focus(2) - assert c.get_focus() == (f2, 1) - - c.delete_flow(f2) - assert c.get_focus() == (f, 0) - c.delete_flow(f) - assert c.get_focus() == (None, None) - - def _add_request(self, state): - f = tutils.tflow() - return state.add_flow(f) - - def _add_response(self, state): - f = self._add_request(state) - f.response = netlib.tutils.tresp() - state.update_flow(f) - - def test_add_response(self): - c = console.master.ConsoleState() - f = self._add_request(c) - f.response = netlib.tutils.tresp() - c.focus = None - c.update_flow(f) - - def test_focus_view(self): - c = console.master.ConsoleState() - self._add_request(c) - self._add_response(c) - self._add_request(c) - self._add_response(c) - self._add_request(c) - self._add_response(c) - assert not c.set_limit("~s") - assert len(c.view) == 3 - assert c.focus == 0 - - def test_settings(self): - c = console.master.ConsoleState() - f = self._add_request(c) - c.add_flow_setting(f, "foo", "bar") - assert c.get_flow_setting(f, "foo") == "bar" - assert c.get_flow_setting(f, "oink") is None - assert c.get_flow_setting(f, "oink", "foo") == "foo" - assert len(c.flowsettings) == 1 - c.delete_flow(f) - del f - gc.collect() - assert len(c.flowsettings) == 0 - - -def test_format_keyvals(): - assert common.format_keyvals( - [ - ("aa", "bb"), - None, - ("cc", "dd"), - (None, "dd"), - (None, "dd"), - ] - ) - - -def test_options(): - assert console.master.Options(kill=True) diff --git a/test/mitmproxy/console/test_master.py b/test/mitmproxy/console/test_master.py new file mode 100644 index 00000000..33261c28 --- /dev/null +++ b/test/mitmproxy/console/test_master.py @@ -0,0 +1,122 @@ +import gc + +import netlib.tutils +from mitmproxy import console +from mitmproxy.console import common + +from .. import tutils, mastertest + + +class TestConsoleState: + + def test_flow(self): + """ + normal flow: + + connect -> request -> response + """ + c = console.master.ConsoleState() + f = self._add_request(c) + assert f in c.flows + assert c.get_focus() == (f, 0) + + def test_focus(self): + """ + normal flow: + + connect -> request -> response + """ + c = console.master.ConsoleState() + f = self._add_request(c) + + assert c.get_focus() == (f, 0) + assert c.get_from_pos(0) == (f, 0) + assert c.get_from_pos(1) == (None, None) + assert c.get_next(0) == (None, None) + + f2 = self._add_request(c) + assert c.get_focus() == (f, 0) + assert c.get_next(0) == (f2, 1) + assert c.get_prev(1) == (f, 0) + assert c.get_next(1) == (None, None) + + c.set_focus(0) + assert c.get_focus() == (f, 0) + c.set_focus(-1) + assert c.get_focus() == (f, 0) + c.set_focus(2) + assert c.get_focus() == (f2, 1) + + c.delete_flow(f2) + assert c.get_focus() == (f, 0) + c.delete_flow(f) + assert c.get_focus() == (None, None) + + def _add_request(self, state): + f = tutils.tflow() + return state.add_flow(f) + + def _add_response(self, state): + f = self._add_request(state) + f.response = netlib.tutils.tresp() + state.update_flow(f) + + def test_add_response(self): + c = console.master.ConsoleState() + f = self._add_request(c) + f.response = netlib.tutils.tresp() + c.focus = None + c.update_flow(f) + + def test_focus_view(self): + c = console.master.ConsoleState() + self._add_request(c) + self._add_response(c) + self._add_request(c) + self._add_response(c) + self._add_request(c) + self._add_response(c) + assert not c.set_limit("~s") + assert len(c.view) == 3 + assert c.focus == 0 + + def test_settings(self): + c = console.master.ConsoleState() + f = self._add_request(c) + c.add_flow_setting(f, "foo", "bar") + assert c.get_flow_setting(f, "foo") == "bar" + assert c.get_flow_setting(f, "oink") is None + assert c.get_flow_setting(f, "oink", "foo") == "foo" + assert len(c.flowsettings) == 1 + c.delete_flow(f) + del f + gc.collect() + assert len(c.flowsettings) == 0 + + +def test_format_keyvals(): + assert common.format_keyvals( + [ + ("aa", "bb"), + None, + ("cc", "dd"), + (None, "dd"), + (None, "dd"), + ] + ) + + +def test_options(): + assert console.master.Options(kill=True) + + +class TestMaster(mastertest.MasterTest): + def mkmaster(self, filt, **options): + o = console.master.Options(filtstr=filt, **options) + return console.master.ConsoleMaster(None, o) + + def test_basic(self): + m = self.mkmaster(None) + for i in (1, 2, 3): + self.dummy_cycle(m, 1, "") + assert len(m.state.flows) == i -- cgit v1.2.3