mitmproxy/netlib/tutils.py

131 lines
3.4 KiB
Python
Raw Normal View History

2015-09-15 17:12:15 +00:00
from io import BytesIO
import tempfile
import os
2015-08-01 08:39:14 +00:00
import time
import shutil
2012-06-18 21:42:32 +00:00
from contextlib import contextmanager
2015-09-15 17:12:15 +00:00
import sys
2012-06-18 21:42:32 +00:00
from netlib import utils, tcp, http
def treader(bytes):
"""
Construct a tcp.Read object from bytes.
"""
2015-09-15 17:12:15 +00:00
fp = BytesIO(bytes)
return tcp.Reader(fp)
2012-06-18 21:42:32 +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)
2015-09-15 17:12:15 +00:00
def _check_exception(expected, actual, exc_tb):
if isinstance(expected, str):
2015-09-15 17:12:15 +00:00
if expected.lower() not in str(actual).lower():
raise AssertionError(
2015-09-15 17:12:15 +00:00
"Expected %s, but caught %s" % (
2015-09-16 16:43:24 +00:00
repr(expected), repr(actual)
2015-09-15 17:12:15 +00:00
)
)
2015-09-15 17:12:15 +00:00
else:
if not isinstance(actual, expected):
raise AssertionError(
2015-09-15 17:12:15 +00:00
"Expected %s, but caught %s %s" % (
2015-09-16 16:43:24 +00:00
expected.__name__, actual.__class__.__name__, repr(actual)
2015-09-15 17:12:15 +00:00
)
)
2015-09-15 17:12:15 +00:00
def raises(expected_exception, obj=None, *args, **kwargs):
2012-06-18 21:42:32 +00:00
"""
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.
"""
2015-09-15 17:12:15 +00:00
if obj is None:
return RaisesContext(expected_exception)
else:
try:
ret = obj(*args, **kwargs)
except Exception as actual:
_check_exception(expected_exception, actual, sys.exc_info()[2])
2012-06-18 21:42:32 +00:00
else:
2015-09-15 17:12:15 +00:00
raise AssertionError("No exception raised. Return value: {}".format(ret))
class RaisesContext(object):
def __init__(self, expected_exception):
self.expected_exception = expected_exception
def __enter__(self):
return
def __exit__(self, exc_type, exc_val, exc_tb):
if not exc_type:
raise AssertionError("No exception raised.")
else:
_check_exception(self.expected_exception, exc_val, exc_tb)
return True
2012-06-18 21:42:32 +00:00
test_data = utils.Data(__name__)
2016-02-15 15:34:38 +00:00
# FIXME: Temporary workaround during repo merge.
2016-05-28 20:17:02 +00:00
test_data.dirname = os.path.join(test_data.dirname, "..", "test", "netlib")
2015-08-01 08:39:14 +00:00
2015-09-15 22:04:23 +00:00
def treq(**kwargs):
2015-08-01 08:39:14 +00:00
"""
2015-09-15 22:04:23 +00:00
Returns:
netlib.http.Request
2015-08-01 08:39:14 +00:00
"""
2015-09-15 22:04:23 +00:00
default = dict(
2015-09-25 22:39:04 +00:00
first_line_format="relative",
2015-09-15 22:04:23 +00:00
method=b"GET",
scheme=b"http",
host=b"address",
port=22,
path=b"/path",
2015-09-17 13:16:12 +00:00
http_version=b"HTTP/1.1",
headers=http.Headers(((b"header", b"qvalue"), (b"content-length", b"7"))),
2015-09-25 22:39:04 +00:00
content=b"content"
2015-08-01 08:39:14 +00:00
)
2015-09-15 22:04:23 +00:00
default.update(kwargs)
return http.Request(**default)
2015-08-01 08:39:14 +00:00
2015-09-15 22:04:23 +00:00
def tresp(**kwargs):
2015-08-01 08:39:14 +00:00
"""
2015-09-15 22:04:23 +00:00
Returns:
netlib.http.Response
2015-08-01 08:39:14 +00:00
"""
2015-09-15 22:04:23 +00:00
default = dict(
2015-09-17 13:16:12 +00:00
http_version=b"HTTP/1.1",
2015-09-15 22:04:23 +00:00
status_code=200,
2015-09-26 15:39:50 +00:00
reason=b"OK",
headers=http.Headers(((b"header-response", b"svalue"), (b"content-length", b"7"))),
2015-09-26 15:39:50 +00:00
content=b"message",
2015-09-17 15:29:55 +00:00
timestamp_start=time.time(),
timestamp_end=time.time(),
2015-08-01 08:39:14 +00:00
)
2015-09-15 22:04:23 +00:00
default.update(kwargs)
return http.Response(**default)