diff options
author | Aldo Cortesi <aldo@corte.si> | 2016-12-08 10:45:23 +1300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-08 10:45:23 +1300 |
commit | 0a68613c8cb4ea96e291b35061c378fbf3ed1f18 (patch) | |
tree | 0552610c1e33707bca30630dff58a9784791c4c8 /test | |
parent | 4771abf2291947d580858c7fe58e25dbf0850abd (diff) | |
parent | b2695dbc6a170cb21771b001059efa7dc5201722 (diff) | |
download | mitmproxy-0a68613c8cb4ea96e291b35061c378fbf3ed1f18.tar.gz mitmproxy-0a68613c8cb4ea96e291b35061c378fbf3ed1f18.tar.bz2 mitmproxy-0a68613c8cb4ea96e291b35061c378fbf3ed1f18.zip |
Merge pull request #1806 from cortesi/options
Options
Diffstat (limited to 'test')
-rw-r--r-- | test/mitmproxy/addons/test_dumper.py | 45 | ||||
-rw-r--r-- | test/mitmproxy/addons/test_termlog.py | 4 | ||||
-rw-r--r-- | test/mitmproxy/console/test_master.py | 11 | ||||
-rw-r--r-- | test/mitmproxy/test_dump.py | 163 | ||||
-rw-r--r-- | test/mitmproxy/test_optmanager.py | 121 | ||||
-rw-r--r-- | test/mitmproxy/test_proxy.py | 3 | ||||
-rw-r--r-- | test/mitmproxy/test_tools_dump.py | 38 | ||||
-rw-r--r-- | test/mitmproxy/test_web_app.py | 3 | ||||
-rw-r--r-- | test/mitmproxy/test_web_master.py | 5 |
9 files changed, 194 insertions, 199 deletions
diff --git a/test/mitmproxy/addons/test_dumper.py b/test/mitmproxy/addons/test_dumper.py index 0d61f800..760efa08 100644 --- a/test/mitmproxy/addons/test_dumper.py +++ b/test/mitmproxy/addons/test_dumper.py @@ -28,43 +28,40 @@ def test_configure(): def test_simple(): - d = dumper.Dumper() + sio = io.StringIO() + d = dumper.Dumper(sio) with taddons.context(options=dump.Options()) as ctx: - sio = io.StringIO() - ctx.configure(d, tfile = sio, flow_detail = 0) + ctx.configure(d, flow_detail=0) d.response(tflow.tflow(resp=True)) assert not sio.getvalue() sio.truncate(0) - ctx.configure(d, tfile = sio, flow_detail = 1) + ctx.configure(d, flow_detail=1) d.response(tflow.tflow(resp=True)) assert sio.getvalue() sio.truncate(0) - ctx.configure(d, tfile = sio, flow_detail = 1) + ctx.configure(d, flow_detail=1) d.error(tflow.tflow(err=True)) assert sio.getvalue() sio.truncate(0) - ctx.configure(d, tfile = sio, flow_detail = 4) + ctx.configure(d, flow_detail=4) d.response(tflow.tflow(resp=True)) assert sio.getvalue() sio.truncate(0) - sio = io.StringIO() - ctx.configure(d, tfile = sio, flow_detail = 4) + ctx.configure(d, flow_detail=4) d.response(tflow.tflow(resp=True)) assert "<<" in sio.getvalue() sio.truncate(0) - sio = io.StringIO() - ctx.configure(d, tfile = sio, flow_detail = 4) + ctx.configure(d, flow_detail=4) d.response(tflow.tflow(err=True)) assert "<<" in sio.getvalue() sio.truncate(0) - sio = io.StringIO() - ctx.configure(d, tfile = sio, flow_detail = 4) + ctx.configure(d, flow_detail=4) flow = tflow.tflow() flow.request = tutils.treq() flow.request.stickycookie = True @@ -77,8 +74,7 @@ def test_simple(): assert sio.getvalue() sio.truncate(0) - sio = io.StringIO() - ctx.configure(d, tfile = sio, flow_detail = 4) + ctx.configure(d, flow_detail=4) flow = tflow.tflow(resp=tutils.tresp(content=b"{")) flow.response.headers["content-type"] = "application/json" flow.response.status_code = 400 @@ -86,8 +82,7 @@ def test_simple(): assert sio.getvalue() sio.truncate(0) - sio = io.StringIO() - ctx.configure(d, tfile = sio, flow_detail = 4) + ctx.configure(d, flow_detail=4) flow = tflow.tflow() flow.request.content = None flow.response = http.HTTPResponse.wrap(tutils.tresp()) @@ -102,20 +97,20 @@ def test_echo_body(): f.response.headers["content-type"] = "text/html" f.response.content = b"foo bar voing\n" * 100 - d = dumper.Dumper() sio = io.StringIO() + d = dumper.Dumper(sio) with taddons.context(options=dump.Options()) as ctx: - ctx.configure(d, tfile=sio, flow_detail = 3) + ctx.configure(d, flow_detail=3) d._echo_message(f.response) t = sio.getvalue() assert "cut off" in t def test_echo_request_line(): - d = dumper.Dumper() sio = io.StringIO() + d = dumper.Dumper(sio) with taddons.context(options=dump.Options()) as ctx: - ctx.configure(d, tfile=sio, flow_detail = 3, showhost = True) + ctx.configure(d, flow_detail=3, showhost=True) f = tflow.tflow(client_conn=None, server_conn=True, resp=True) f.request.is_replay = True d._echo_request_line(f) @@ -139,19 +134,19 @@ class TestContentView: @mock.patch("mitmproxy.contentviews.ViewAuto.__call__") def test_contentview(self, view_auto): view_auto.side_effect = exceptions.ContentViewException("") - d = dumper.Dumper() + sio = io.StringIO() + d = dumper.Dumper(sio) with taddons.context(options=dump.Options()) as ctx: - sio = io.StringIO() - ctx.configure(d, flow_detail=4, verbosity=3, tfile=sio) + ctx.configure(d, flow_detail=4, verbosity=3) d.response(tflow.tflow()) assert "Content viewer failed" in ctx.master.event_log[0][1] def test_tcp(): - d = dumper.Dumper() sio = io.StringIO() + d = dumper.Dumper(sio) with taddons.context(options=dump.Options()) as ctx: - ctx.configure(d, tfile=sio, flow_detail = 3, showhost = True) + ctx.configure(d, flow_detail=3, showhost=True) f = tflow.ttcpflow(client_conn=True, server_conn=True) d.tcp_message(f) assert "it's me" in sio.getvalue() diff --git a/test/mitmproxy/addons/test_termlog.py b/test/mitmproxy/addons/test_termlog.py index 880fcb51..d9e18134 100644 --- a/test/mitmproxy/addons/test_termlog.py +++ b/test/mitmproxy/addons/test_termlog.py @@ -7,9 +7,9 @@ from mitmproxy.tools import dump class TestTermLog: def test_simple(self): - t = termlog.TermLog() sio = io.StringIO() - t.configure(dump.Options(tfile = sio, verbosity = 2), set([])) + t = termlog.TermLog(outfile=sio) + t.configure(dump.Options(verbosity = 2), set([])) t.log(log.LogEntry("one", "info")) assert "one" in sio.getvalue() t.log(log.LogEntry("two", "debug")) diff --git a/test/mitmproxy/console/test_master.py b/test/mitmproxy/console/test_master.py index eb840187..fb3c2527 100644 --- a/test/mitmproxy/console/test_master.py +++ b/test/mitmproxy/console/test_master.py @@ -2,6 +2,7 @@ from mitmproxy.test import tflow import mitmproxy.test.tutils from mitmproxy.tools import console from mitmproxy import proxy +from mitmproxy import options from mitmproxy.tools.console import common from .. import mastertest @@ -20,14 +21,14 @@ def test_format_keyvals(): def test_options(): - assert console.master.Options(replay_kill_extra=True) + assert options.Options(replay_kill_extra=True) class TestMaster(mastertest.MasterTest): - def mkmaster(self, **options): - if "verbosity" not in options: - options["verbosity"] = 0 - o = console.master.Options(**options) + def mkmaster(self, **opts): + if "verbosity" not in opts: + opts["verbosity"] = 0 + o = options.Options(**opts) return console.master.ConsoleMaster(o, proxy.DummyServer()) def test_basic(self): diff --git a/test/mitmproxy/test_dump.py b/test/mitmproxy/test_dump.py deleted file mode 100644 index c6b15c84..00000000 --- a/test/mitmproxy/test_dump.py +++ /dev/null @@ -1,163 +0,0 @@ -from mitmproxy.test import tflow -import os -import io - -from mitmproxy.tools import dump -from mitmproxy import exceptions -from mitmproxy import proxy -from mitmproxy.test import tutils -from . import mastertest - - -class TestDumpMaster(mastertest.MasterTest): - def dummy_cycle(self, master, n, content): - mastertest.MasterTest.dummy_cycle(self, master, n, content) - return master.options.tfile.getvalue() - - def mkmaster(self, flt, **options): - if "verbosity" not in options: - options["verbosity"] = 0 - if "flow_detail" not in options: - options["flow_detail"] = 0 - o = dump.Options(filtstr=flt, tfile=io.StringIO(), **options) - return dump.DumpMaster(o, proxy.DummyServer()) - - def test_basic(self): - for i in (1, 2, 3): - assert "GET" in self.dummy_cycle( - self.mkmaster("~s", flow_detail=i), - 1, - b"" - ) - assert "GET" in self.dummy_cycle( - self.mkmaster("~s", flow_detail=i), - 1, - b"\x00\x00\x00" - ) - assert "GET" in self.dummy_cycle( - self.mkmaster("~s", flow_detail=i), - 1, - b"ascii" - ) - - def test_error(self): - o = dump.Options( - tfile=io.StringIO(), - flow_detail=1 - ) - m = dump.DumpMaster(o, proxy.DummyServer()) - f = tflow.tflow(err=True) - m.error(f) - assert "error" in o.tfile.getvalue() - - def test_replay(self): - o = dump.Options(http2=False, server_replay=["nonexistent"], replay_kill_extra=True) - tutils.raises(exceptions.OptionsError, dump.DumpMaster, o, proxy.DummyServer()) - - with tutils.tmpdir() as t: - p = os.path.join(t, "rep") - self.flowfile(p) - - o = dump.Options(http2=False, server_replay=[p], replay_kill_extra=True) - o.verbosity = 0 - o.flow_detail = 0 - m = dump.DumpMaster(o, proxy.DummyServer()) - - self.cycle(m, b"content") - self.cycle(m, b"content") - - o = dump.Options(http2=False, server_replay=[p], replay_kill_extra=False) - o.verbosity = 0 - o.flow_detail = 0 - m = dump.DumpMaster(o, proxy.DummyServer()) - self.cycle(m, b"nonexistent") - - o = dump.Options(http2=False, client_replay=[p], replay_kill_extra=False) - o.verbosity = 0 - o.flow_detail = 0 - m = dump.DumpMaster(o, proxy.DummyServer()) - - def test_read(self): - with tutils.tmpdir() as t: - p = os.path.join(t, "read") - self.flowfile(p) - assert "GET" in self.dummy_cycle( - self.mkmaster(None, flow_detail=1, rfile=p), - 1, b"", - ) - tutils.raises( - dump.DumpError, - self.mkmaster, None, verbosity=1, rfile="/nonexistent" - ) - tutils.raises( - dump.DumpError, - self.mkmaster, None, verbosity=1, rfile="test_dump.py" - ) - - def test_options(self): - o = dump.Options(verbosity = 2) - assert o.verbosity == 2 - - def test_filter(self): - assert "GET" not in self.dummy_cycle( - self.mkmaster("~u foo", verbosity=1), 1, b"" - ) - - def test_replacements(self): - o = dump.Options( - replacements=[(".*", "content", "foo")], - tfile = io.StringIO(), - ) - o.verbosity = 0 - o.flow_detail = 0 - m = dump.DumpMaster(o, proxy.DummyServer()) - f = self.cycle(m, b"content") - assert f.request.content == b"foo" - - def test_setheader(self): - o = dump.Options( - setheaders=[(".*", "one", "two")], - tfile=io.StringIO() - ) - o.verbosity = 0 - o.flow_detail = 0 - m = dump.DumpMaster(o, proxy.DummyServer()) - f = self.cycle(m, b"content") - assert f.request.headers["one"] == "two" - - def test_script(self): - ret = self.dummy_cycle( - self.mkmaster( - None, - scripts=[tutils.test_data.path("mitmproxy/data/scripts/all.py")], - verbosity=2 - ), - 1, b"", - ) - assert "XCLIENTCONNECT" in ret - assert "XSERVERCONNECT" in ret - assert "XREQUEST" in ret - assert "XRESPONSE" in ret - assert "XCLIENTDISCONNECT" in ret - tutils.raises( - exceptions.AddonError, - self.mkmaster, - None, scripts=["nonexistent"] - ) - tutils.raises( - exceptions.AddonError, - self.mkmaster, - None, scripts=["starterr.py"] - ) - - def test_stickycookie(self): - self.dummy_cycle( - self.mkmaster(None, stickycookie = ".*"), - 1, b"" - ) - - def test_stickyauth(self): - self.dummy_cycle( - self.mkmaster(None, stickyauth = ".*"), - 1, b"" - ) diff --git a/test/mitmproxy/test_optmanager.py b/test/mitmproxy/test_optmanager.py index 3c845707..c6eb2534 100644 --- a/test/mitmproxy/test_optmanager.py +++ b/test/mitmproxy/test_optmanager.py @@ -1,5 +1,7 @@ import copy +import os +from mitmproxy import options from mitmproxy import optmanager from mitmproxy import exceptions from mitmproxy.test import tutils @@ -12,6 +14,51 @@ class TO(optmanager.OptManager): super().__init__() +class TD(optmanager.OptManager): + def __init__(self, *, one="done", two="dtwo", three="error"): + self.one = one + self.two = two + self.three = three + super().__init__() + + +class TD2(TD): + def __init__(self, *, three="dthree", four="dfour", **kwargs): + self.three = three + self.four = four + super().__init__(three=three, **kwargs) + + +def test_defaults(): + assert TD2.default("one") == "done" + assert TD2.default("two") == "dtwo" + assert TD2.default("three") == "dthree" + assert TD2.default("four") == "dfour" + + o = TD2() + assert o._defaults == { + "one": "done", + "two": "dtwo", + "three": "dthree", + "four": "dfour", + } + assert not o.has_changed("one") + newvals = dict( + one="xone", + two="xtwo", + three="xthree", + four="xfour", + ) + o.update(**newvals) + assert o.has_changed("one") + for k, v in newvals.items(): + assert v == getattr(o, k) + o.reset() + assert not o.has_changed("one") + for k, v in o._defaults.items(): + assert v == getattr(o, k) + + def test_options(): o = TO(two="three") assert o.keys() == set(["one", "two"]) @@ -64,6 +111,29 @@ def test_toggler(): o.toggler("nonexistent") +class Rec(): + def __init__(self): + self.called = None + + def __call__(self, *args, **kwargs): + self.called = (args, kwargs) + + +def test_subscribe(): + o = TO() + r = Rec() + o.subscribe(r, ["two"]) + o.one = "foo" + assert not r.called + o.two = "foo" + assert r.called + + assert len(o.changed.receivers) == 1 + del r + o.two = "bar" + assert len(o.changed.receivers) == 0 + + def test_rollback(): o = TO(one="two") @@ -99,3 +169,54 @@ def test_repr(): 'one': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'two': None })""" + + +def test_serialize(): + o = TD2() + o.three = "set" + assert "dfour" in o.serialize(None, defaults=True) + + data = o.serialize(None) + assert "dfour" not in data + + o2 = TD2() + o2.load(data) + assert o2 == o + + t = """ + unknown: foo + """ + data = o.serialize(t) + o2 = TD2() + o2.load(data) + assert o2 == o + + t = "invalid: foo\ninvalid" + tutils.raises("config error", o2.load, t) + + t = "invalid" + tutils.raises("config error", o2.load, t) + + t = "" + o2.load(t) + + +def test_serialize_defaults(): + o = options.Options() + assert o.serialize(None, defaults=True) + + +def test_saving(): + o = TD2() + o.three = "set" + with tutils.tmpdir() as tdir: + dst = os.path.join(tdir, "conf") + o.save(dst, defaults=True) + + o2 = TD2() + o2.load_paths(dst) + o2.three = "foo" + o2.save(dst, defaults=True) + + o.load_paths(dst) + assert o.three == "foo" diff --git a/test/mitmproxy/test_proxy.py b/test/mitmproxy/test_proxy.py index 177bac1f..91da47a0 100644 --- a/test/mitmproxy/test_proxy.py +++ b/test/mitmproxy/test_proxy.py @@ -5,6 +5,7 @@ import argparse from OpenSSL import SSL from mitmproxy.tools import cmdline +from mitmproxy.tools import main from mitmproxy import options from mitmproxy.proxy import ProxyConfig from mitmproxy import connections @@ -76,7 +77,7 @@ class TestProcessProxyOptions: cmdline.common_options(parser) args = parser.parse_args(args=args) opts = cmdline.get_common_options(args) - pconf = config.ProxyConfig(options.Options(**opts)) + pconf = config.ProxyConfig(options.Options(**main.notnone(opts))) return parser, pconf def assert_err(self, err, *args): diff --git a/test/mitmproxy/test_tools_dump.py b/test/mitmproxy/test_tools_dump.py new file mode 100644 index 00000000..1488f33b --- /dev/null +++ b/test/mitmproxy/test_tools_dump.py @@ -0,0 +1,38 @@ +import os + +from mitmproxy.tools import dump +from mitmproxy import proxy +from mitmproxy.test import tutils +from mitmproxy import log +from mitmproxy import controller +from . import mastertest + + +class TestDumpMaster(mastertest.MasterTest): + def mkmaster(self, flt, **options): + o = dump.Options(filtstr=flt, verbosity=-1, flow_detail=0, **options) + return dump.DumpMaster(o, proxy.DummyServer()) + + def test_read(self): + with tutils.tmpdir() as t: + p = os.path.join(t, "read") + self.flowfile(p) + self.dummy_cycle( + self.mkmaster(None, rfile=p), + 1, b"", + ) + tutils.raises( + dump.DumpError, + self.mkmaster, None, rfile="/nonexistent" + ) + tutils.raises( + dump.DumpError, + self.mkmaster, None, rfile="test_dump.py" + ) + + def test_has_error(self): + m = self.mkmaster(None) + ent = log.LogEntry("foo", "error") + ent.reply = controller.DummyReply() + m.log(ent) + assert m.has_errored diff --git a/test/mitmproxy/test_web_app.py b/test/mitmproxy/test_web_app.py index be195528..2cab5bf4 100644 --- a/test/mitmproxy/test_web_app.py +++ b/test/mitmproxy/test_web_app.py @@ -4,6 +4,7 @@ import mock import tornado.testing from mitmproxy import exceptions from mitmproxy import proxy +from mitmproxy import options from mitmproxy.test import tflow from mitmproxy.tools.web import app from mitmproxy.tools.web import master as webmaster @@ -17,7 +18,7 @@ def json(resp: httpclient.HTTPResponse): class TestApp(tornado.testing.AsyncHTTPTestCase): def get_app(self): - o = webmaster.Options() + o = options.Options() m = webmaster.WebMaster(o, proxy.DummyServer()) f = tflow.tflow(resp=True) f.id = "42" diff --git a/test/mitmproxy/test_web_master.py b/test/mitmproxy/test_web_master.py index 298b14eb..08dce8f3 100644 --- a/test/mitmproxy/test_web_master.py +++ b/test/mitmproxy/test_web_master.py @@ -1,11 +1,12 @@ from mitmproxy.tools.web import master from mitmproxy import proxy +from mitmproxy import options from . import mastertest class TestWebMaster(mastertest.MasterTest): - def mkmaster(self, **options): - o = master.Options(**options) + def mkmaster(self, **opts): + o = options.Options(**opts) return master.WebMaster(o, proxy.DummyServer(o)) def test_basic(self): |