aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@corte.si>2016-12-08 10:45:23 +1300
committerGitHub <noreply@github.com>2016-12-08 10:45:23 +1300
commit0a68613c8cb4ea96e291b35061c378fbf3ed1f18 (patch)
tree0552610c1e33707bca30630dff58a9784791c4c8 /test
parent4771abf2291947d580858c7fe58e25dbf0850abd (diff)
parentb2695dbc6a170cb21771b001059efa7dc5201722 (diff)
downloadmitmproxy-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.py45
-rw-r--r--test/mitmproxy/addons/test_termlog.py4
-rw-r--r--test/mitmproxy/console/test_master.py11
-rw-r--r--test/mitmproxy/test_dump.py163
-rw-r--r--test/mitmproxy/test_optmanager.py121
-rw-r--r--test/mitmproxy/test_proxy.py3
-rw-r--r--test/mitmproxy/test_tools_dump.py38
-rw-r--r--test/mitmproxy/test_web_app.py3
-rw-r--r--test/mitmproxy/test_web_master.py5
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):