mitmproxy/test/tutils.py

163 lines
4.1 KiB
Python
Raw Normal View History

2014-10-24 01:01:34 +00:00
import tempfile
import os
import re
2014-10-24 01:01:34 +00:00
import shutil
2015-05-03 01:54:52 +00:00
import cStringIO
2012-06-09 03:08:51 +00:00
from contextlib import contextmanager
from libpathod import utils, test, pathoc, pathod, language
import requests
2015-04-19 20:56:47 +00:00
class DaemonTests(object):
noweb = False
noapi = False
nohang = False
ssl = False
timeout = None
hexdump = False
ssloptions = None
2015-06-04 08:36:50 +00:00
nocraft = False
2014-10-24 01:01:34 +00:00
@classmethod
2015-04-19 20:56:47 +00:00
def setUpAll(klass):
opts = klass.ssloptions or {}
klass.confdir = tempfile.mkdtemp()
opts["confdir"] = klass.confdir
so = pathod.SSLOptions(**opts)
2015-04-19 20:56:47 +00:00
klass.d = test.Daemon(
staticdir=test_data.path("data"),
anchors=[
(re.compile("/anchor/.*"), "202:da")
],
2015-06-18 16:12:11 +00:00
ssl=klass.ssl,
ssloptions=so,
sizelimit=1 * 1024 * 1024,
noweb=klass.noweb,
noapi=klass.noapi,
nohang=klass.nohang,
timeout=klass.timeout,
hexdump=klass.hexdump,
nocraft=klass.nocraft,
logreq=True,
logresp=True,
explain=True
)
@classmethod
def tearDownAll(self):
self.d.shutdown()
shutil.rmtree(self.confdir)
def setUp(self):
if not (self.noweb or self.noapi):
self.d.clear_log()
2012-07-23 04:28:34 +00:00
def getpath(self, path, params=None):
scheme = "https" if self.ssl else "http"
2012-07-23 04:28:34 +00:00
return requests.get(
2015-05-30 00:03:13 +00:00
"%s://localhost:%s/%s" % (
2014-10-24 01:01:34 +00:00
scheme,
self.d.port,
path
),
verify=False,
params=params
2012-07-23 04:28:34 +00:00
)
def get(self, spec):
return requests.get(self.d.p(spec), verify=False)
2015-04-29 20:03:26 +00:00
def pathoc(
self,
specs,
2015-04-29 20:03:26 +00:00
timeout=None,
connect_to=None,
ssl=None,
ws_read_limit=None,
use_http2=False,
2015-04-29 20:03:26 +00:00
):
"""
Returns a (messages, text log) tuple.
"""
if ssl is None:
ssl = self.ssl
logfp = cStringIO.StringIO()
2015-04-29 20:03:26 +00:00
c = pathoc.Pathoc(
("localhost", self.d.port),
ssl=ssl,
ws_read_limit=ws_read_limit,
2015-06-18 16:12:11 +00:00
timeout=timeout,
fp=logfp,
use_http2=use_http2,
2015-04-29 20:03:26 +00:00
)
c.connect(connect_to)
ret = []
for i in specs:
resp = c.request(i)
if resp:
ret.append(resp)
for frm in c.wait():
ret.append(frm)
c.stop()
return ret, logfp.getvalue()
2012-06-09 03:08:51 +00:00
2015-06-18 16:12:11 +00:00
2012-06-09 03:08:51 +00:00
@contextmanager
def tmpdir(*args, **kwargs):
orig_workdir = os.getcwd()
temp_workdir = tempfile.mkdtemp(*args, **kwargs)
os.chdir(temp_workdir)
yield temp_workdir
os.chdir(orig_workdir)
shutil.rmtree(temp_workdir)
def raises(exc, obj, *args, **kwargs):
"""
Assert that a callable raises a specified exception.
:exc An exception class or a string. If a class, assert that an
exception of this type is raised. If a string, assert that the string
occurs in the string representation of the exception, based on a
case-insenstivie match.
:obj A callable object.
:args Arguments to be passsed to the callable.
:kwargs Arguments to be passed to the callable.
"""
try:
2015-05-30 00:03:13 +00:00
obj(*args, **kwargs)
except (Exception, SystemExit) as v:
2012-06-09 03:08:51 +00:00
if isinstance(exc, basestring):
if exc.lower() in str(v).lower():
return
else:
raise AssertionError(
2015-05-30 00:03:13 +00:00
"Expected %s, but caught %s" % (
2012-06-09 03:08:51 +00:00
repr(str(exc)), v
)
)
else:
if isinstance(v, exc):
return
else:
raise AssertionError(
2015-05-30 00:03:13 +00:00
"Expected %s, but caught %s %s" % (
2012-06-09 03:08:51 +00:00
exc.__name__, v.__class__.__name__, str(v)
)
)
raise AssertionError("No exception raised.")
test_data = utils.Data(__name__)
2015-05-03 01:54:52 +00:00
def render(r, settings=language.Settings()):
r = r.resolve(settings)
2015-05-03 01:54:52 +00:00
s = cStringIO.StringIO()
assert language.serve(r, s, settings)
return s.getvalue()