aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/examples/test_xss_scanner.py8
-rw-r--r--test/mitmproxy/addons/test_cut.py27
-rw-r--r--test/mitmproxy/addons/test_export.py28
-rw-r--r--test/mitmproxy/addons/test_script.py12
-rw-r--r--test/mitmproxy/contentviews/test_base.py18
-rw-r--r--test/mitmproxy/test_connections.py9
-rw-r--r--test/mitmproxy/tools/console/test_keymap.py2
7 files changed, 91 insertions, 13 deletions
diff --git a/test/examples/test_xss_scanner.py b/test/examples/test_xss_scanner.py
index e15d7e10..8cf06a2a 100644
--- a/test/examples/test_xss_scanner.py
+++ b/test/examples/test_xss_scanner.py
@@ -343,10 +343,10 @@ class TestXSSScanner():
monkeypatch.setattr("mitmproxy.ctx.log", logger)
xss.log_SQLi_data(None)
assert logger.args == []
- xss.log_SQLi_data(xss.SQLiData(b'https://example.com',
- b'Location',
- b'Oracle.*Driver',
- b'Oracle'))
+ xss.log_SQLi_data(xss.SQLiData('https://example.com',
+ 'Location',
+ 'Oracle.*Driver',
+ 'Oracle'))
assert logger.args[0] == '===== SQLi Found ====='
assert logger.args[1] == 'SQLi URL: https://example.com'
assert logger.args[2] == 'Injection Point: Location'
diff --git a/test/mitmproxy/addons/test_cut.py b/test/mitmproxy/addons/test_cut.py
index c444b8ee..56568f21 100644
--- a/test/mitmproxy/addons/test_cut.py
+++ b/test/mitmproxy/addons/test_cut.py
@@ -7,6 +7,7 @@ from mitmproxy.test import taddons
from mitmproxy.test import tflow
from mitmproxy.test import tutils
import pytest
+import pyperclip
from unittest import mock
@@ -89,6 +90,13 @@ def test_cut_clip():
tctx.command(c.clip, "@all", "request.method,request.content")
assert pc.called
+ with mock.patch('pyperclip.copy') as pc:
+ log_message = "Pyperclip could not find a " \
+ "copy/paste mechanism for your system."
+ pc.side_effect = pyperclip.PyperclipException(log_message)
+ tctx.command(c.clip, "@all", "request.method")
+ assert tctx.master.has_log(log_message, level="error")
+
def test_cut_save(tmpdir):
f = str(tmpdir.join("path"))
@@ -112,6 +120,25 @@ def test_cut_save(tmpdir):
assert qr(f).splitlines() == [b"GET,content", b"GET,content"]
+@pytest.mark.parametrize("exception, log_message", [
+ (PermissionError, "Permission denied"),
+ (IsADirectoryError, "Is a directory"),
+ (FileNotFoundError, "No such file or directory")
+])
+def test_cut_save_open(exception, log_message, tmpdir):
+ f = str(tmpdir.join("path"))
+ v = view.View()
+ c = cut.Cut()
+ with taddons.context() as tctx:
+ tctx.master.addons.add(v, c)
+ v.add([tflow.tflow(resp=True)])
+
+ with mock.patch("mitmproxy.addons.cut.open") as m:
+ m.side_effect = exception(log_message)
+ tctx.command(c.save, "@all", "request.method", f)
+ assert tctx.master.has_log(log_message, level="error")
+
+
def test_cut():
c = cut.Cut()
with taddons.context():
diff --git a/test/mitmproxy/addons/test_export.py b/test/mitmproxy/addons/test_export.py
index 233c62d5..07227a7a 100644
--- a/test/mitmproxy/addons/test_export.py
+++ b/test/mitmproxy/addons/test_export.py
@@ -1,6 +1,8 @@
-import pytest
import os
+import pytest
+import pyperclip
+
from mitmproxy import exceptions
from mitmproxy.addons import export # heh
from mitmproxy.test import tflow
@@ -94,9 +96,24 @@ def test_export(tmpdir):
os.unlink(f)
+@pytest.mark.parametrize("exception, log_message", [
+ (PermissionError, "Permission denied"),
+ (IsADirectoryError, "Is a directory"),
+ (FileNotFoundError, "No such file or directory")
+])
+def test_export_open(exception, log_message, tmpdir):
+ f = str(tmpdir.join("path"))
+ e = export.Export()
+ with taddons.context() as tctx:
+ with mock.patch("mitmproxy.addons.export.open") as m:
+ m.side_effect = exception(log_message)
+ e.file("raw", tflow.tflow(resp=True), f)
+ assert tctx.master.has_log(log_message, level="error")
+
+
def test_clip(tmpdir):
e = export.Export()
- with taddons.context():
+ with taddons.context() as tctx:
with pytest.raises(exceptions.CommandError):
e.clip("nonexistent", tflow.tflow(resp=True))
@@ -107,3 +124,10 @@ def test_clip(tmpdir):
with mock.patch('pyperclip.copy') as pc:
e.clip("curl", tflow.tflow(resp=True))
assert pc.called
+
+ with mock.patch('pyperclip.copy') as pc:
+ log_message = "Pyperclip could not find a " \
+ "copy/paste mechanism for your system."
+ pc.side_effect = pyperclip.PyperclipException(log_message)
+ e.clip("raw", tflow.tflow(resp=True))
+ assert tctx.master.has_log(log_message, level="error")
diff --git a/test/mitmproxy/addons/test_script.py b/test/mitmproxy/addons/test_script.py
index c4fe6b43..78a5be6c 100644
--- a/test/mitmproxy/addons/test_script.py
+++ b/test/mitmproxy/addons/test_script.py
@@ -68,6 +68,18 @@ class TestScript:
with pytest.raises(exceptions.OptionsError):
script.Script("nonexistent")
+ def test_quotes_around_filename(self):
+ """
+ Test that a script specified as '"foo.py"' works to support the calling convention of
+ mitmproxy 2.0, as e.g. used by Cuckoo Sandbox.
+ """
+ path = tutils.test_data.path("mitmproxy/data/addonscripts/recorder/recorder.py")
+
+ s = script.Script(
+ '"{}"'.format(path)
+ )
+ assert '"' not in s.fullpath
+
def test_simple(self):
with taddons.context() as tctx:
sc = script.Script(
diff --git a/test/mitmproxy/contentviews/test_base.py b/test/mitmproxy/contentviews/test_base.py
index 777ab4dd..c94d8be2 100644
--- a/test/mitmproxy/contentviews/test_base.py
+++ b/test/mitmproxy/contentviews/test_base.py
@@ -1 +1,17 @@
-# TODO: write tests
+import pytest
+from mitmproxy.contentviews import base
+
+
+def test_format_dict():
+ d = {"one": "two", "three": "four"}
+ f_d = base.format_dict(d)
+ assert next(f_d)
+
+ d = {"adsfa": ""}
+ f_d = base.format_dict(d)
+ assert next(f_d)
+
+ d = {}
+ f_d = base.format_dict(d)
+ with pytest.raises(StopIteration):
+ next(f_d)
diff --git a/test/mitmproxy/test_connections.py b/test/mitmproxy/test_connections.py
index 9e5d89f1..00cdbc87 100644
--- a/test/mitmproxy/test_connections.py
+++ b/test/mitmproxy/test_connections.py
@@ -155,7 +155,7 @@ class TestServerConnection:
def test_sni(self):
c = connections.ServerConnection(('', 1234))
with pytest.raises(ValueError, matches='sni must be str, not '):
- c.establish_tls(None, b'foobar')
+ c.establish_tls(sni=b'foobar')
def test_state(self):
c = tflow.tserver_conn()
@@ -222,17 +222,16 @@ class TestServerConnectionTLS(tservers.ServerTestBase):
def handle(self):
self.finish()
- @pytest.mark.parametrize("clientcert", [
+ @pytest.mark.parametrize("client_certs", [
None,
tutils.test_data.path("mitmproxy/data/clientcert"),
tutils.test_data.path("mitmproxy/data/clientcert/client.pem"),
])
- def test_tls(self, clientcert):
+ def test_tls(self, client_certs):
c = connections.ServerConnection(("127.0.0.1", self.port))
c.connect()
- c.establish_tls(clientcert, "foo.com")
+ c.establish_tls(client_certs=client_certs)
assert c.connected()
- assert c.sni == "foo.com"
assert c.tls_established
c.close()
c.finish()
diff --git a/test/mitmproxy/tools/console/test_keymap.py b/test/mitmproxy/tools/console/test_keymap.py
index 00e64991..7b475ff8 100644
--- a/test/mitmproxy/tools/console/test_keymap.py
+++ b/test/mitmproxy/tools/console/test_keymap.py
@@ -42,7 +42,7 @@ def test_join():
km = keymap.Keymap(tctx.master)
km.add("key", "str", ["options"], "help1")
km.add("key", "str", ["commands"])
- return
+
assert len(km.bindings) == 1
assert len(km.bindings[0].contexts) == 2
assert km.bindings[0].help == "help1"