From c55e8d8f62b34e45ecdd4f7dd09ed2f0b710c335 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Wed, 2 Nov 2016 09:44:18 +1300 Subject: tests: clean up test/mitmproxy/tutils.py Remove aliases, use mitmproxy/test/tutils instead. --- mitmproxy/test/tutils.py | 10 ++++++- mitmproxy/utils/data.py | 7 +++-- test/mitmproxy/addons/test_filestreamer.py | 3 +- test/mitmproxy/addons/test_replace.py | 3 +- test/mitmproxy/addons/test_script.py | 34 +++++++++++---------- test/mitmproxy/addons/test_setheaders.py | 3 +- test/mitmproxy/addons/test_stickycookie.py | 3 +- test/mitmproxy/addons/test_view.py | 4 +-- test/mitmproxy/console/test_pathedit.py | 7 ++--- test/mitmproxy/net/http/test_authentication.py | 6 ++-- test/mitmproxy/net/test_tcp.py | 30 +++++++++---------- test/mitmproxy/net/tservers.py | 4 +-- test/mitmproxy/script/test_concurrent.py | 12 +++++--- test/mitmproxy/test_certs.py | 8 ++--- test/mitmproxy/test_cmdline.py | 4 +-- test/mitmproxy/test_contentview.py | 23 +++++++-------- test/mitmproxy/test_controller.py | 5 ++-- test/mitmproxy/test_dump.py | 5 ++-- test/mitmproxy/test_examples.py | 23 +++++++-------- test/mitmproxy/test_flow.py | 4 +-- test/mitmproxy/test_flow_export.py | 29 +++++++++--------- test/mitmproxy/test_flow_format_compat.py | 6 ++-- test/mitmproxy/test_flowfilter.py | 8 ++--- test/mitmproxy/test_platform_pf.py | 6 ++-- test/mitmproxy/test_proxy.py | 16 +++++----- test/mitmproxy/test_proxy_config.py | 2 +- test/mitmproxy/test_server.py | 41 +++++++++++++------------- test/mitmproxy/tutils.py | 25 ---------------- 28 files changed, 163 insertions(+), 168 deletions(-) diff --git a/mitmproxy/test/tutils.py b/mitmproxy/test/tutils.py index e925b282..f5cec1b1 100644 --- a/mitmproxy/test/tutils.py +++ b/mitmproxy/test/tutils.py @@ -19,6 +19,14 @@ def treader(bytes): return tcp.Reader(fp) +@contextmanager +def chdir(dir): + orig_dir = os.getcwd() + os.chdir(dir) + yield + os.chdir(orig_dir) + + @contextmanager def tmpdir(*args, **kwargs): orig_workdir = os.getcwd() @@ -89,7 +97,7 @@ class RaisesContext: return True -test_data = data.Data(__name__).push("../../test/mitmproxy/net") +test_data = data.Data(__name__).push("../../test/") def treq(**kwargs): diff --git a/mitmproxy/utils/data.py b/mitmproxy/utils/data.py index 2e68d184..12298258 100644 --- a/mitmproxy/utils/data.py +++ b/mitmproxy/utils/data.py @@ -6,6 +6,7 @@ import inspect class Data: def __init__(self, name): + self.name = name m = importlib.import_module(name) dirname = os.path.dirname(inspect.getsourcefile(m)) self.dirname = os.path.abspath(dirname) @@ -14,8 +15,10 @@ class Data: """ Change the data object to a path relative to the module. """ - self.dirname = os.path.join(self.dirname, subpath) - return self + dirname = os.path.join(self.dirname, subpath) + ret = Data(self.name) + ret.dirname = dirname + return ret def path(self, path): """ diff --git a/test/mitmproxy/addons/test_filestreamer.py b/test/mitmproxy/addons/test_filestreamer.py index 49baaf3c..28094c43 100644 --- a/test/mitmproxy/addons/test_filestreamer.py +++ b/test/mitmproxy/addons/test_filestreamer.py @@ -1,6 +1,7 @@ from mitmproxy.test import tflow +from mitmproxy.test import tutils -from .. import tutils, mastertest +from .. import mastertest import os.path diff --git a/test/mitmproxy/addons/test_replace.py b/test/mitmproxy/addons/test_replace.py index e57fd295..94efe9c3 100644 --- a/test/mitmproxy/addons/test_replace.py +++ b/test/mitmproxy/addons/test_replace.py @@ -1,6 +1,7 @@ from mitmproxy.test import tflow +from mitmproxy.test import tutils -from .. import tutils, mastertest, tservers +from .. import mastertest, tservers from mitmproxy.addons import replace from mitmproxy import master from mitmproxy import options diff --git a/test/mitmproxy/addons/test_script.py b/test/mitmproxy/addons/test_script.py index 3ce274d7..c8d7318f 100644 --- a/test/mitmproxy/addons/test_script.py +++ b/test/mitmproxy/addons/test_script.py @@ -4,6 +4,7 @@ import sys import time from mitmproxy.test import tflow +from mitmproxy.test import tutils import re from mitmproxy import exceptions from mitmproxy import options @@ -11,7 +12,8 @@ from mitmproxy import proxy from mitmproxy.addons import script from mitmproxy import master -from .. import tutils, mastertest +from .. import mastertest +from .. import tutils as ttutils class TestParseCommand: @@ -32,25 +34,25 @@ class TestParseCommand: def test_parse_args(self): with tutils.chdir(tutils.test_data.dirname): - assert script.parse_command("data/addonscripts/recorder.py") == ("data/addonscripts/recorder.py", []) - assert script.parse_command("data/addonscripts/recorder.py foo bar") == ("data/addonscripts/recorder.py", ["foo", "bar"]) - assert script.parse_command("data/addonscripts/recorder.py 'foo bar'") == ("data/addonscripts/recorder.py", ["foo bar"]) + assert script.parse_command("mitmproxy/data/addonscripts/recorder.py") == ("mitmproxy/data/addonscripts/recorder.py", []) + assert script.parse_command("mitmproxy/data/addonscripts/recorder.py foo bar") == ("mitmproxy/data/addonscripts/recorder.py", ["foo", "bar"]) + assert script.parse_command("mitmproxy/data/addonscripts/recorder.py 'foo bar'") == ("mitmproxy/data/addonscripts/recorder.py", ["foo bar"]) - @tutils.skip_not_windows + @ttutils.skip_not_windows def test_parse_windows(self): with tutils.chdir(tutils.test_data.dirname): assert script.parse_command( - "data\\addonscripts\\recorder.py" - ) == ("data\\addonscripts\\recorder.py", []) + "mitmproxy/data\\addonscripts\\recorder.py" + ) == ("mitmproxy/data\\addonscripts\\recorder.py", []) assert script.parse_command( - "data\\addonscripts\\recorder.py 'foo \\ bar'" - ) == ("data\\addonscripts\\recorder.py", ['foo \\ bar']) + "mitmproxy/data\\addonscripts\\recorder.py 'foo \\ bar'" + ) == ("mitmproxy/data\\addonscripts\\recorder.py", ['foo \\ bar']) def test_load_script(): ns = script.load_script( tutils.test_data.path( - "data/addonscripts/recorder.py" + "mitmproxy/data/addonscripts/recorder.py" ), [] ) assert ns.start @@ -62,7 +64,7 @@ class TestScript(mastertest.MasterTest): m = master.Master(o, proxy.DummyServer()) sc = script.Script( tutils.test_data.path( - "data/addonscripts/recorder.py" + "mitmproxy/data/addonscripts/recorder.py" ) ) m.addons.add(sc) @@ -100,7 +102,7 @@ class TestScript(mastertest.MasterTest): o = options.Options() m = mastertest.RecordingMaster(o, proxy.DummyServer()) sc = script.Script( - tutils.test_data.path("data/addonscripts/error.py") + tutils.test_data.path("mitmproxy/data/addonscripts/error.py") ) m.addons.add(sc) f = tflow.tflow(resp=True) @@ -116,7 +118,7 @@ class TestScript(mastertest.MasterTest): m = master.Master(o, proxy.DummyServer()) sc = script.Script( tutils.test_data.path( - "data/addonscripts/addon.py" + "mitmproxy/data/addonscripts/addon.py" ) ) m.addons.add(sc) @@ -154,7 +156,7 @@ class TestScriptLoader(mastertest.MasterTest): with m.handlecontext(): sc = sl.run_once( tutils.test_data.path( - "data/addonscripts/recorder.py" + "mitmproxy/data/addonscripts/recorder.py" ), [f] ) evts = [i[1] for i in sc.ns.call_log] @@ -176,7 +178,7 @@ class TestScriptLoader(mastertest.MasterTest): assert len(m.addons) == 1 o.update( scripts = [ - tutils.test_data.path("data/addonscripts/recorder.py") + tutils.test_data.path("mitmproxy/data/addonscripts/recorder.py") ] ) assert len(m.addons) == 2 @@ -190,7 +192,7 @@ class TestScriptLoader(mastertest.MasterTest): tutils.raises(exceptions.OptionsError, m.addons.add, o, sc) def test_order(self): - rec = tutils.test_data.path("data/addonscripts/recorder.py") + rec = tutils.test_data.path("mitmproxy/data/addonscripts/recorder.py") o = options.Options( scripts = [ diff --git a/test/mitmproxy/addons/test_setheaders.py b/test/mitmproxy/addons/test_setheaders.py index 4cdd8e8e..d7bdef61 100644 --- a/test/mitmproxy/addons/test_setheaders.py +++ b/test/mitmproxy/addons/test_setheaders.py @@ -1,6 +1,7 @@ from mitmproxy.test import tflow +from mitmproxy.test import tutils -from .. import tutils, mastertest +from .. import mastertest from mitmproxy.addons import setheaders from mitmproxy import options diff --git a/test/mitmproxy/addons/test_stickycookie.py b/test/mitmproxy/addons/test_stickycookie.py index 56d1ab5d..7f1e83eb 100644 --- a/test/mitmproxy/addons/test_stickycookie.py +++ b/test/mitmproxy/addons/test_stickycookie.py @@ -1,6 +1,7 @@ from mitmproxy.test import tflow +from mitmproxy.test import tutils -from .. import tutils, mastertest +from .. import mastertest from mitmproxy.addons import stickycookie from mitmproxy import master from mitmproxy import options diff --git a/test/mitmproxy/addons/test_view.py b/test/mitmproxy/addons/test_view.py index 63df8307..de752c72 100644 --- a/test/mitmproxy/addons/test_view.py +++ b/test/mitmproxy/addons/test_view.py @@ -1,11 +1,11 @@ from mitmproxy.test import tflow +from mitmproxy.test import tutils + from mitmproxy.addons import view from mitmproxy import flowfilter from mitmproxy import options from mitmproxy.test import taddons -from .. import tutils - class Options(options.Options): def __init__( diff --git a/test/mitmproxy/console/test_pathedit.py b/test/mitmproxy/console/test_pathedit.py index 29f8de17..feb9e7c4 100644 --- a/test/mitmproxy/console/test_pathedit.py +++ b/test/mitmproxy/console/test_pathedit.py @@ -1,18 +1,17 @@ import os from os.path import normpath from mitmproxy.tools.console import pathedit +from mitmproxy.test import tutils from mock import patch -from .. import tutils - class TestPathCompleter: def test_lookup_construction(self): c = pathedit._PathCompleter() - cd = tutils.test_data.path("completion") + cd = tutils.test_data.path("mitmproxy/completion") ca = os.path.join(cd, "a") assert c.complete(ca).endswith(normpath("/completion/aaa")) assert c.complete(ca).endswith(normpath("/completion/aab")) @@ -60,7 +59,7 @@ class TestPathEdit: with patch('urwid.widget.Edit.get_edit_text') as get_text, \ patch('urwid.widget.Edit.set_edit_text') as set_text: - cd = tutils.test_data.path("completion") + cd = tutils.test_data.path("mitmproxy/completion") get_text.return_value = os.path.join(cd, "a") # Pressing tab should set completed path diff --git a/test/mitmproxy/net/http/test_authentication.py b/test/mitmproxy/net/http/test_authentication.py index 11b6e2e0..01eae52d 100644 --- a/test/mitmproxy/net/http/test_authentication.py +++ b/test/mitmproxy/net/http/test_authentication.py @@ -29,10 +29,10 @@ class TestPassManHtpasswd: tutils.raises( "malformed htpasswd file", authentication.PassManHtpasswd, - tutils.test_data.path("data/server.crt")) + tutils.test_data.path("mitmproxy/net/data/server.crt")) def test_simple(self): - pm = authentication.PassManHtpasswd(tutils.test_data.path("data/htpasswd")) + pm = authentication.PassManHtpasswd(tutils.test_data.path("mitmproxy/net/data/htpasswd")) vals = ("basic", "test", "test") authentication.assemble_http_basic_auth(*vals) @@ -118,5 +118,5 @@ class TestAuthAction: def test_httppasswd(self): m = Bunch() aa = authentication.HtpasswdAuthAction(None, "authenticator") - aa(None, m, tutils.test_data.path("data/htpasswd"), None) + aa(None, m, tutils.test_data.path("mitmproxy/net/data/htpasswd"), None) assert m.authenticator diff --git a/test/mitmproxy/net/test_tcp.py b/test/mitmproxy/net/test_tcp.py index 8a7c692a..151cb12b 100644 --- a/test/mitmproxy/net/test_tcp.py +++ b/test/mitmproxy/net/test_tcp.py @@ -164,7 +164,7 @@ class TestServerSSL(tservers.ServerTestBase): handler = EchoHandler ssl = dict( cipher_list="AES256-SHA", - chain_file=tutils.test_data.path("data/server.crt") + chain_file=tutils.test_data.path("mitmproxy/net/data/server.crt") ) def test_echo(self): @@ -203,8 +203,8 @@ class TestSSLUpstreamCertVerificationWBadServerCert(tservers.ServerTestBase): handler = EchoHandler ssl = dict( - cert=tutils.test_data.path("data/verificationcerts/self-signed.crt"), - key=tutils.test_data.path("data/verificationcerts/self-signed.key") + cert=tutils.test_data.path("mitmproxy/net/data/verificationcerts/self-signed.crt"), + key=tutils.test_data.path("mitmproxy/net/data/verificationcerts/self-signed.key") ) def test_mode_default_should_pass(self): @@ -241,7 +241,7 @@ class TestSSLUpstreamCertVerificationWBadServerCert(tservers.ServerTestBase): c.convert_to_ssl( sni="example.mitmproxy.org", verify_options=SSL.VERIFY_PEER, - ca_pemfile=tutils.test_data.path("data/verificationcerts/trusted-root.crt") + ca_pemfile=tutils.test_data.path("mitmproxy/net/data/verificationcerts/trusted-root.crt") ) assert c.ssl_verification_error @@ -255,8 +255,8 @@ class TestSSLUpstreamCertVerificationWBadHostname(tservers.ServerTestBase): handler = EchoHandler ssl = dict( - cert=tutils.test_data.path("data/verificationcerts/trusted-leaf.crt"), - key=tutils.test_data.path("data/verificationcerts/trusted-leaf.key") + cert=tutils.test_data.path("mitmproxy/net/data/verificationcerts/trusted-leaf.crt"), + key=tutils.test_data.path("mitmproxy/net/data/verificationcerts/trusted-leaf.key") ) def test_should_fail_without_sni(self): @@ -265,7 +265,7 @@ class TestSSLUpstreamCertVerificationWBadHostname(tservers.ServerTestBase): with tutils.raises(exceptions.TlsException): c.convert_to_ssl( verify_options=SSL.VERIFY_PEER, - ca_pemfile=tutils.test_data.path("data/verificationcerts/trusted-root.crt") + ca_pemfile=tutils.test_data.path("mitmproxy/net/data/verificationcerts/trusted-root.crt") ) def test_should_fail(self): @@ -275,7 +275,7 @@ class TestSSLUpstreamCertVerificationWBadHostname(tservers.ServerTestBase): c.convert_to_ssl( sni="mitmproxy.org", verify_options=SSL.VERIFY_PEER, - ca_pemfile=tutils.test_data.path("data/verificationcerts/trusted-root.crt") + ca_pemfile=tutils.test_data.path("mitmproxy/net/data/verificationcerts/trusted-root.crt") ) assert c.ssl_verification_error @@ -284,8 +284,8 @@ class TestSSLUpstreamCertVerificationWValidCertChain(tservers.ServerTestBase): handler = EchoHandler ssl = dict( - cert=tutils.test_data.path("data/verificationcerts/trusted-leaf.crt"), - key=tutils.test_data.path("data/verificationcerts/trusted-leaf.key") + cert=tutils.test_data.path("mitmproxy/net/data/verificationcerts/trusted-leaf.crt"), + key=tutils.test_data.path("mitmproxy/net/data/verificationcerts/trusted-leaf.key") ) def test_mode_strict_w_pemfile_should_pass(self): @@ -294,7 +294,7 @@ class TestSSLUpstreamCertVerificationWValidCertChain(tservers.ServerTestBase): c.convert_to_ssl( sni="example.mitmproxy.org", verify_options=SSL.VERIFY_PEER, - ca_pemfile=tutils.test_data.path("data/verificationcerts/trusted-root.crt") + ca_pemfile=tutils.test_data.path("mitmproxy/net/data/verificationcerts/trusted-root.crt") ) assert c.ssl_verification_error is None @@ -310,7 +310,7 @@ class TestSSLUpstreamCertVerificationWValidCertChain(tservers.ServerTestBase): c.convert_to_ssl( sni="example.mitmproxy.org", verify_options=SSL.VERIFY_PEER, - ca_path=tutils.test_data.path("data/verificationcerts/") + ca_path=tutils.test_data.path("mitmproxy/net/data/verificationcerts/") ) assert c.ssl_verification_error is None @@ -342,7 +342,7 @@ class TestSSLClientCert(tservers.ServerTestBase): c = tcp.TCPClient(("127.0.0.1", self.port)) with c.connect(): c.convert_to_ssl( - cert=tutils.test_data.path("data/clientcert/client.pem")) + cert=tutils.test_data.path("mitmproxy/net/data/clientcert/client.pem")) assert c.rfile.readline().strip() == b"1" def test_clientcert_err(self): @@ -351,7 +351,7 @@ class TestSSLClientCert(tservers.ServerTestBase): tutils.raises( exceptions.TlsException, c.convert_to_ssl, - cert=tutils.test_data.path("data/clientcert/make") + cert=tutils.test_data.path("mitmproxy/net/data/clientcert/make") ) @@ -570,7 +570,7 @@ class TestDHParams(tservers.ServerTestBase): handler = HangHandler ssl = dict( dhparams=certs.CertStore.load_dhparam( - tutils.test_data.path("data/dhparam.pem"), + tutils.test_data.path("mitmproxy/net/data/dhparam.pem"), ), cipher_list="DHE-RSA-AES256-SHA" ) diff --git a/test/mitmproxy/net/tservers.py b/test/mitmproxy/net/tservers.py index ba10ef5e..68a2caa0 100644 --- a/test/mitmproxy/net/tservers.py +++ b/test/mitmproxy/net/tservers.py @@ -50,10 +50,10 @@ class _TServer(tcp.TCPServer): if self.ssl is not None: cert = self.ssl.get( "cert", - tutils.test_data.path("data/server.crt")) + tutils.test_data.path("mitmproxy/net/data/server.crt")) raw_key = self.ssl.get( "key", - tutils.test_data.path("data/server.key")) + tutils.test_data.path("mitmproxy/net/data/server.key")) key = OpenSSL.crypto.load_privatekey( OpenSSL.crypto.FILETYPE_PEM, open(raw_key, "rb").read()) diff --git a/test/mitmproxy/script/test_concurrent.py b/test/mitmproxy/script/test_concurrent.py index fec0d1b7..71b87d28 100644 --- a/test/mitmproxy/script/test_concurrent.py +++ b/test/mitmproxy/script/test_concurrent.py @@ -1,12 +1,16 @@ from mitmproxy.test import tflow -from test.mitmproxy import tutils, mastertest +from mitmproxy.test import tutils from mitmproxy import controller from mitmproxy.addons import script from mitmproxy import options from mitmproxy import proxy from mitmproxy import master + import time +from test.mitmproxy import mastertest +from test.mitmproxy import tutils as ttutils + class Thing: def __init__(self): @@ -15,12 +19,12 @@ class Thing: class TestConcurrent(mastertest.MasterTest): - @tutils.skip_appveyor + @ttutils.skip_appveyor def test_concurrent(self): m = master.Master(options.Options(), proxy.DummyServer()) sc = script.Script( tutils.test_data.path( - "data/addonscripts/concurrent_decorator.py" + "mitmproxy/data/addonscripts/concurrent_decorator.py" ) ) m.addons.add(sc) @@ -37,7 +41,7 @@ class TestConcurrent(mastertest.MasterTest): m = mastertest.RecordingMaster(options.Options(), proxy.DummyServer()) sc = script.Script( tutils.test_data.path( - "data/addonscripts/concurrent_decorator_err.py" + "mitmproxy/data/addonscripts/concurrent_decorator_err.py" ) ) with m.handlecontext(): diff --git a/test/mitmproxy/test_certs.py b/test/mitmproxy/test_certs.py index 2e706fa6..f1eff9ba 100644 --- a/test/mitmproxy/test_certs.py +++ b/test/mitmproxy/test_certs.py @@ -143,13 +143,13 @@ class TestDummyCert: class TestSSLCert: def test_simple(self): - with open(tutils.test_data.path("data/text_cert"), "rb") as f: + with open(tutils.test_data.path("mitmproxy/net/data/text_cert"), "rb") as f: d = f.read() c1 = certs.SSLCert.from_pem(d) assert c1.cn == b"google.com" assert len(c1.altnames) == 436 - with open(tutils.test_data.path("data/text_cert_2"), "rb") as f: + with open(tutils.test_data.path("mitmproxy/net/data/text_cert_2"), "rb") as f: d = f.read() c2 = certs.SSLCert.from_pem(d) assert c2.cn == b"www.inode.co.nz" @@ -168,14 +168,14 @@ class TestSSLCert: assert c1 != c2 def test_err_broken_sans(self): - with open(tutils.test_data.path("data/text_cert_weird1"), "rb") as f: + with open(tutils.test_data.path("mitmproxy/net/data/text_cert_weird1"), "rb") as f: d = f.read() c = certs.SSLCert.from_pem(d) # This breaks unless we ignore a decoding error. assert c.altnames is not None def test_der(self): - with open(tutils.test_data.path("data/dercert"), "rb") as f: + with open(tutils.test_data.path("mitmproxy/net/data/dercert"), "rb") as f: d = f.read() s = certs.SSLCert.from_der(d) assert s.cn diff --git a/test/mitmproxy/test_cmdline.py b/test/mitmproxy/test_cmdline.py index d664430a..d2e0c8a5 100644 --- a/test/mitmproxy/test_cmdline.py +++ b/test/mitmproxy/test_cmdline.py @@ -1,6 +1,6 @@ import argparse from mitmproxy.tools import cmdline -from . import tutils +from mitmproxy.test import tutils def test_parse_replace_hook(): @@ -91,7 +91,7 @@ def test_common(): opts ) - p = tutils.test_data.path("data/replace") + p = tutils.test_data.path("mitmproxy/data/replace") opts.replace_file = [("/foo/bar/%s" % p)] v = cmdline.get_common_options(opts)["replacements"] assert len(v) == 1 diff --git a/test/mitmproxy/test_contentview.py b/test/mitmproxy/test_contentview.py index e7d8b1f7..1f16765b 100644 --- a/test/mitmproxy/test_contentview.py +++ b/test/mitmproxy/test_contentview.py @@ -5,8 +5,7 @@ from mitmproxy.net.http import url from mitmproxy.types import multidict import mitmproxy.contentviews as cv -from . import tutils -import mitmproxy.test.tutils +from mitmproxy.test import tutils try: import pyamf @@ -117,7 +116,7 @@ class TestContentView: def test_view_css(self): v = cv.ViewCSS() - with open(tutils.test_data.path('data/1.css'), 'r') as fp: + with open(tutils.test_data.path('mitmproxy/data/1.css'), 'r') as fp: fixture_1 = fp.read() result = v('a') @@ -140,16 +139,16 @@ class TestContentView: def test_view_image(self): v = cv.ViewImage() - p = tutils.test_data.path("data/image.png") + p = tutils.test_data.path("mitmproxy/data/image.png") assert v(open(p, "rb").read()) - p = tutils.test_data.path("data/image.gif") + p = tutils.test_data.path("mitmproxy/data/image.gif") assert v(open(p, "rb").read()) - p = tutils.test_data.path("data/image-err1.jpg") + p = tutils.test_data.path("mitmproxy/data/image-err1.jpg") assert v(open(p, "rb").read()) - p = tutils.test_data.path("data/image.ico") + p = tutils.test_data.path("mitmproxy/data/image.ico") assert v(open(p, "rb").read()) assert not v(b"flibble") @@ -232,7 +231,7 @@ def test_get_content_view(): def test_get_message_content_view(): - r = mitmproxy.test.tutils.treq() + r = tutils.treq() desc, lines, err = cv.get_message_content_view("raw", r) assert desc == "Raw" @@ -253,22 +252,22 @@ if pyamf: def test_view_amf_request(): v = cv.ViewAMF() - p = tutils.test_data.path("data/amf01") + p = tutils.test_data.path("mitmproxy/data/amf01") assert v(open(p, "rb").read()) - p = tutils.test_data.path("data/amf02") + p = tutils.test_data.path("mitmproxy/data/amf02") assert v(open(p, "rb").read()) def test_view_amf_response(): v = cv.ViewAMF() - p = tutils.test_data.path("data/amf03") + p = tutils.test_data.path("mitmproxy/data/amf03") assert v(open(p, "rb").read()) if cv.ViewProtobuf.is_available(): def test_view_protobuf_request(): v = cv.ViewProtobuf() - p = tutils.test_data.path("data/protobuf01") + p = tutils.test_data.path("mitmproxy/data/protobuf01") content_type, output = v(open(p, "rb").read()) assert content_type == "Protobuf" assert output.next()[0][1] == '1: "3bbc333c-e61c-433b-819a-0b9a8cc103b8"' diff --git a/test/mitmproxy/test_controller.py b/test/mitmproxy/test_controller.py index 3bcb7013..5cc36532 100644 --- a/test/mitmproxy/test_controller.py +++ b/test/mitmproxy/test_controller.py @@ -1,4 +1,3 @@ -from test.mitmproxy import tutils from threading import Thread, Event from mock import Mock @@ -9,7 +8,7 @@ import queue from mitmproxy.exceptions import Kill, ControlException from mitmproxy import proxy from mitmproxy import master -from mitmproxy.test.tutils import raises +from mitmproxy.test import tutils class TMsg: @@ -81,7 +80,7 @@ class TestChannel: done = Event() done.set() channel = controller.Channel(q, done) - with raises(Kill): + with tutils.raises(Kill): channel.ask("test", Mock(name="test_ask_shutdown")) diff --git a/test/mitmproxy/test_dump.py b/test/mitmproxy/test_dump.py index 8d699984..aa3228e4 100644 --- a/test/mitmproxy/test_dump.py +++ b/test/mitmproxy/test_dump.py @@ -6,7 +6,8 @@ import mitmproxy.io from mitmproxy.tools import dump from mitmproxy import exceptions from mitmproxy import proxy -from . import tutils, mastertest +from mitmproxy.test import tutils +from . import mastertest class TestDumpMaster(mastertest.MasterTest): @@ -156,7 +157,7 @@ class TestDumpMaster(mastertest.MasterTest): ret = self.dummy_cycle( self.mkmaster( None, - scripts=[tutils.test_data.path("data/scripts/all.py")], + scripts=[tutils.test_data.path("mitmproxy/data/scripts/all.py")], verbosity=2 ), 1, b"", diff --git a/test/mitmproxy/test_examples.py b/test/mitmproxy/test_examples.py index 4275b3c8..7f194a18 100644 --- a/test/mitmproxy/test_examples.py +++ b/test/mitmproxy/test_examples.py @@ -8,16 +8,15 @@ from mitmproxy import options from mitmproxy import contentviews from mitmproxy import proxy from mitmproxy.addons import script -from mitmproxy.utils import data from mitmproxy import master -from mitmproxy.test import tutils as netutils +from mitmproxy.test import tutils from mitmproxy.net.http import Headers from mitmproxy.net.http import cookies -from . import tutils, mastertest +from . import mastertest -example_dir = data.Data(__name__).push("../../examples") +example_dir = tutils.test_data.push("../examples") class ScriptError(Exception): @@ -42,7 +41,7 @@ def tscript(cmd, args=""): class TestScripts(mastertest.MasterTest): def test_add_header(self): m, _ = tscript("add_header.py") - f = tflow.tflow(resp=netutils.tresp()) + f = tflow.tflow(resp=tutils.tresp()) m.response(f) assert f.response.headers["newheader"] == "foo" @@ -58,7 +57,7 @@ class TestScripts(mastertest.MasterTest): tscript("iframe_injector.py") m, sc = tscript("iframe_injector.py", "http://example.org/evil_iframe") - f = tflow.tflow(resp=netutils.tresp(content=b"mitmproxy")) + f = tflow.tflow(resp=tutils.tresp(content=b"mitmproxy")) m.response(f) content = f.response.content assert b'iframe' in content and b'evil_iframe' in content @@ -67,7 +66,7 @@ class TestScripts(mastertest.MasterTest): m, sc = tscript("modify_form.py") form_header = Headers(content_type="application/x-www-form-urlencoded") - f = tflow.tflow(req=netutils.treq(headers=form_header)) + f = tflow.tflow(req=tutils.treq(headers=form_header)) m.request(f) assert f.request.urlencoded_form[b"mitmproxy"] == b"rocks" @@ -78,7 +77,7 @@ class TestScripts(mastertest.MasterTest): def test_modify_querystring(self): m, sc = tscript("modify_querystring.py") - f = tflow.tflow(req=netutils.treq(path="/search?q=term")) + f = tflow.tflow(req=tutils.treq(path="/search?q=term")) m.request(f) assert f.request.query["mitmproxy"] == "rocks" @@ -89,13 +88,13 @@ class TestScripts(mastertest.MasterTest): def test_arguments(self): m, sc = tscript("arguments.py", "mitmproxy rocks") - f = tflow.tflow(resp=netutils.tresp(content=b"I <3 mitmproxy")) + f = tflow.tflow(resp=tutils.tresp(content=b"I <3 mitmproxy")) m.response(f) assert f.response.content == b"I <3 rocks" def test_redirect_requests(self): m, sc = tscript("redirect_requests.py") - f = tflow.tflow(req=netutils.treq(host="example.org")) + f = tflow.tflow(req=tutils.treq(host="example.org")) m.request(f) assert f.request.host == "mitmproxy.org" @@ -110,8 +109,8 @@ class TestHARDump: # Create a dummy flow for testing return tflow.tflow( - req=netutils.treq(method=b'GET', **times), - resp=netutils.tresp(content=resp_content, **times) + req=tutils.treq(method=b'GET', **times), + resp=tutils.tresp(content=resp_content, **times) ) def test_no_file_arg(self): diff --git a/test/mitmproxy/test_flow.py b/test/mitmproxy/test_flow.py index 295e2bea..c297e8f9 100644 --- a/test/mitmproxy/test_flow.py +++ b/test/mitmproxy/test_flow.py @@ -2,7 +2,7 @@ from mitmproxy.test import tflow import mock import io -import mitmproxy.test.tutils +from mitmproxy.test import tutils from mitmproxy.net.http import Headers import mitmproxy.io from mitmproxy import flowfilter, options @@ -14,7 +14,7 @@ from mitmproxy import connections from mitmproxy.proxy import ProxyConfig from mitmproxy.proxy.server import DummyServer from mitmproxy import master -from . import tutils, tservers +from . import tservers class TestHTTPFlow: diff --git a/test/mitmproxy/test_flow_export.py b/test/mitmproxy/test_flow_export.py index bf675d50..457d8836 100644 --- a/test/mitmproxy/test_flow_export.py +++ b/test/mitmproxy/test_flow_export.py @@ -1,10 +1,9 @@ from mitmproxy.test import tflow import re -import mitmproxy.test.tutils from mitmproxy.net.http import Headers from mitmproxy import export # heh -from . import tutils +from mitmproxy.test import tutils def clean_blanks(s): @@ -21,15 +20,15 @@ def python_equals(testdata, text): def req_get(): - return mitmproxy.test.tutils.treq(method=b'GET', content=b'', path=b"/path?a=foo&a=bar&b=baz") + return tutils.treq(method=b'GET', content=b'', path=b"/path?a=foo&a=bar&b=baz") def req_post(): - return mitmproxy.test.tutils.treq(method=b'POST', headers=()) + return tutils.treq(method=b'POST', headers=()) def req_patch(): - return mitmproxy.test.tutils.treq(method=b'PATCH', path=b"/path?query=param") + return tutils.treq(method=b'PATCH', path=b"/path?query=param") class TestExportCurlCommand: @@ -52,53 +51,53 @@ class TestExportCurlCommand: class TestExportPythonCode: def test_get(self): flow = tflow.tflow(req=req_get()) - python_equals("data/test_flow_export/python_get.py", export.python_code(flow)) + python_equals("mitmproxy/data/test_flow_export/python_get.py", export.python_code(flow)) def test_post(self): flow = tflow.tflow(req=req_post()) - python_equals("data/test_flow_export/python_post.py", export.python_code(flow)) + python_equals("mitmproxy/data/test_flow_export/python_post.py", export.python_code(flow)) def test_post_json(self): p = req_post() p.content = b'{"name": "example", "email": "example@example.com"}' p.headers = Headers(content_type="application/json") flow = tflow.tflow(req=p) - python_equals("data/test_flow_export/python_post_json.py", export.python_code(flow)) + python_equals("mitmproxy/data/test_flow_export/python_post_json.py", export.python_code(flow)) def test_patch(self): flow = tflow.tflow(req=req_patch()) - python_equals("data/test_flow_export/python_patch.py", export.python_code(flow)) + python_equals("mitmproxy/data/test_flow_export/python_patch.py", export.python_code(flow)) class TestExportLocustCode: def test_get(self): flow = tflow.tflow(req=req_get()) - python_equals("data/test_flow_export/locust_get.py", export.locust_code(flow)) + python_equals("mitmproxy/data/test_flow_export/locust_get.py", export.locust_code(flow)) def test_post(self): p = req_post() p.content = b'content' p.headers = '' flow = tflow.tflow(req=p) - python_equals("data/test_flow_export/locust_post.py", export.locust_code(flow)) + python_equals("mitmproxy/data/test_flow_export/locust_post.py", export.locust_code(flow)) def test_patch(self): flow = tflow.tflow(req=req_patch()) - python_equals("data/test_flow_export/locust_patch.py", export.locust_code(flow)) + python_equals("mitmproxy/data/test_flow_export/locust_patch.py", export.locust_code(flow)) class TestExportLocustTask: def test_get(self): flow = tflow.tflow(req=req_get()) - python_equals("data/test_flow_export/locust_task_get.py", export.locust_task(flow)) + python_equals("mitmproxy/data/test_flow_export/locust_task_get.py", export.locust_task(flow)) def test_post(self): flow = tflow.tflow(req=req_post()) - python_equals("data/test_flow_export/locust_task_post.py", export.locust_task(flow)) + python_equals("mitmproxy/data/test_flow_export/locust_task_post.py", export.locust_task(flow)) def test_patch(self): flow = tflow.tflow(req=req_patch()) - python_equals("data/test_flow_export/locust_task_patch.py", export.locust_task(flow)) + python_equals("mitmproxy/data/test_flow_export/locust_task_patch.py", export.locust_task(flow)) class TestURL: diff --git a/test/mitmproxy/test_flow_format_compat.py b/test/mitmproxy/test_flow_format_compat.py index 4997aff9..0bb9cf15 100644 --- a/test/mitmproxy/test_flow_format_compat.py +++ b/test/mitmproxy/test_flow_format_compat.py @@ -1,10 +1,10 @@ from mitmproxy import io from mitmproxy import exceptions -from . import tutils +from mitmproxy.test import tutils def test_load(): - with open(tutils.test_data.path("data/dumpfile-011"), "rb") as f: + with open(tutils.test_data.path("mitmproxy/data/dumpfile-011"), "rb") as f: flow_reader = io.FlowReader(f) flows = list(flow_reader.stream()) assert len(flows) == 1 @@ -12,7 +12,7 @@ def test_load(): def test_cannot_convert(): - with open(tutils.test_data.path("data/dumpfile-010"), "rb") as f: + with open(tutils.test_data.path("mitmproxy/data/dumpfile-010"), "rb") as f: flow_reader = io.FlowReader(f) with tutils.raises(exceptions.FlowReadException): list(flow_reader.stream()) diff --git a/test/mitmproxy/test_flowfilter.py b/test/mitmproxy/test_flowfilter.py index 16d61d25..a1b77c05 100644 --- a/test/mitmproxy/test_flowfilter.py +++ b/test/mitmproxy/test_flowfilter.py @@ -3,8 +3,8 @@ from mitmproxy.test import tflow from mock import patch from mitmproxy import flowfilter - -from . import tutils +from mitmproxy.test import tutils +from . import tutils as ttutils class TestParsing: @@ -382,10 +382,10 @@ class TestMatchingTCPFlow: class TestMatchingDummyFlow: def flow(self): - return tutils.tdummyflow() + return ttutils.tdummyflow() def err(self): - return tutils.tdummyflow(err=True) + return ttutils.tdummyflow(err=True) def q(self, q, o): return flowfilter.parse(q)(o) diff --git a/test/mitmproxy/test_platform_pf.py b/test/mitmproxy/test_platform_pf.py index 5082fafb..29ecb842 100644 --- a/test/mitmproxy/test_platform_pf.py +++ b/test/mitmproxy/test_platform_pf.py @@ -1,16 +1,16 @@ import sys from mitmproxy.platform import pf -from . import tutils +from mitmproxy.test import tutils class TestLookup: def test_simple(self): if sys.platform == "freebsd10": - p = tutils.test_data.path("data/pf02") + p = tutils.test_data.path("mitmproxy/data/pf02") d = open(p, "rb").read() else: - p = tutils.test_data.path("data/pf01") + p = tutils.test_data.path("mitmproxy/data/pf01") d = open(p, "rb").read() assert pf.lookup("192.168.1.111", 40000, d) == ("5.5.5.5", 80) tutils.raises( diff --git a/test/mitmproxy/test_proxy.py b/test/mitmproxy/test_proxy.py index ab210e65..7cadb6c2 100644 --- a/test/mitmproxy/test_proxy.py +++ b/test/mitmproxy/test_proxy.py @@ -13,7 +13,9 @@ from mitmproxy.proxy import config from mitmproxy import exceptions from pathod import test from mitmproxy.net.http import http1 -from . import tutils +from mitmproxy.test import tutils + +from . import tutils as ttutils class TestServerConnection: @@ -127,7 +129,7 @@ class TestProcessProxyOptions: self.assert_noerr("--client-certs", cadir) self.assert_noerr( "--client-certs", - os.path.join(tutils.test_data.path("data/clientcert"), "client.pem")) + os.path.join(tutils.test_data.path("mitmproxy/data/clientcert"), "client.pem")) self.assert_err( "path does not exist", "--client-certs", @@ -136,7 +138,7 @@ class TestProcessProxyOptions: def test_certs(self): self.assert_noerr( "--cert", - tutils.test_data.path("data/testkey.pem")) + tutils.test_data.path("mitmproxy/data/testkey.pem")) self.assert_err("does not exist", "--cert", "nonexistent") def test_auth(self): @@ -145,12 +147,12 @@ class TestProcessProxyOptions: p = self.assert_noerr( "--htpasswd", - tutils.test_data.path("data/htpasswd")) + tutils.test_data.path("mitmproxy/data/htpasswd")) assert p.authenticator self.assert_err( "malformed htpasswd file", "--htpasswd", - tutils.test_data.path("data/htpasswd.invalid")) + tutils.test_data.path("mitmproxy/data/htpasswd.invalid")) p = self.assert_noerr("--singleuser", "test:test") assert p.authenticator @@ -177,7 +179,7 @@ class TestProcessProxyOptions: class TestProxyServer: # binding to 0.0.0.0:1 works without special permissions on Windows - @tutils.skip_windows + @ttutils.skip_windows def test_err(self): conf = ProxyConfig( options.Options(listen_port=1), @@ -217,5 +219,5 @@ class TestConnectionHandler: config, channel ) - with tutils.capture_stderr(c.handle) as output: + with ttutils.capture_stderr(c.handle) as output: assert "mitmproxy has crashed" in output diff --git a/test/mitmproxy/test_proxy_config.py b/test/mitmproxy/test_proxy_config.py index d8085eb8..e012cb5e 100644 --- a/test/mitmproxy/test_proxy_config.py +++ b/test/mitmproxy/test_proxy_config.py @@ -1,4 +1,4 @@ -from . import tutils +from mitmproxy.test import tutils import base64 from mitmproxy.proxy import config diff --git a/test/mitmproxy/test_server.py b/test/mitmproxy/test_server.py index 74cb5ae8..9fa6ed06 100644 --- a/test/mitmproxy/test_server.py +++ b/test/mitmproxy/test_server.py @@ -2,7 +2,7 @@ import os import socket import time -import mitmproxy.test.tutils +from mitmproxy.test import tutils from mitmproxy import controller from mitmproxy import options from mitmproxy.addons import script @@ -16,11 +16,12 @@ from mitmproxy import exceptions from mitmproxy.net.http import authentication from mitmproxy.net.http import http1 from mitmproxy.net.tcp import Address -from mitmproxy.test.tutils import raises from pathod import pathoc from pathod import pathod -from . import tutils, tservers +from . import tutils as ttutils + +from . import tservers """ Note that the choice of response code in these tests matters more than you @@ -159,7 +160,7 @@ class TcpMixin: # mitmproxy responds with bad gateway assert self.pathod(spec).status_code == 502 self._ignore_on() - with raises(exceptions.HttpException): + with tutils.raises(exceptions.HttpException): self.pathod(spec) # pathoc tries to parse answer as HTTP self._ignore_off() @@ -238,7 +239,7 @@ class TestHTTP(tservers.HTTPProxyTest, CommonMixin): # There's a race here, which means we can get any of a number of errors. # Rather than introduce yet another sleep into the test suite, we just # relax the Exception specification. - with raises(Exception): + with tutils.raises(Exception): p.request("get:'%s'" % response) def test_reconnect(self): @@ -277,7 +278,7 @@ class TestHTTP(tservers.HTTPProxyTest, CommonMixin): def test_stream_modify(self): s = script.Script( - tutils.test_data.path("data/addonscripts/stream_modify.py") + tutils.test_data.path("mitmproxy/data/addonscripts/stream_modify.py") ) self.master.addons.add(s) d = self.pathod('200:b"foo"') @@ -327,7 +328,7 @@ class TestHTTPS(tservers.HTTPProxyTest, CommonMixin, TcpMixin): def test_clientcert_file(self): try: self.config.clientcerts = os.path.join( - tutils.test_data.path("data/clientcert"), "client.pem") + tutils.test_data.path("mitmproxy/data/clientcert"), "client.pem") f = self.pathod("304") assert f.status_code == 304 assert self.server.last_log()["request"]["clientcert"]["keyinfo"] @@ -336,7 +337,7 @@ class TestHTTPS(tservers.HTTPProxyTest, CommonMixin, TcpMixin): def test_clientcert_dir(self): try: - self.config.clientcerts = tutils.test_data.path("data/clientcert") + self.config.clientcerts = tutils.test_data.path("mitmproxy/data/clientcert") f = self.pathod("304") assert f.status_code == 304 assert self.server.last_log()["request"]["clientcert"]["keyinfo"] @@ -375,7 +376,7 @@ class TestHTTPSUpstreamServerVerificationWTrustedCert(tservers.HTTPProxyTest): ssloptions = pathod.SSLOptions( cn=b"example.mitmproxy.org", certs=[ - ("example.mitmproxy.org", tutils.test_data.path("data/servercert/trusted-leaf.pem")) + ("example.mitmproxy.org", tutils.test_data.path("mitmproxy/data/servercert/trusted-leaf.pem")) ] ) @@ -388,7 +389,7 @@ class TestHTTPSUpstreamServerVerificationWTrustedCert(tservers.HTTPProxyTest): self.config.options.update( ssl_insecure=False, ssl_verify_upstream_trusted_cadir=tutils.test_data.path( - "data/servercert/" + "mitmproxy/data/servercert/" ), ssl_verify_upstream_trusted_ca=None, ) @@ -399,7 +400,7 @@ class TestHTTPSUpstreamServerVerificationWTrustedCert(tservers.HTTPProxyTest): ssl_insecure=False, ssl_verify_upstream_trusted_cadir=None, ssl_verify_upstream_trusted_ca=tutils.test_data.path( - "data/servercert/trusted-root.pem" + "mitmproxy/data/servercert/trusted-root.pem" ), ) assert self._request().status_code == 242 @@ -414,7 +415,7 @@ class TestHTTPSUpstreamServerVerificationWBadCert(tservers.HTTPProxyTest): ssloptions = pathod.SSLOptions( cn=b"example.mitmproxy.org", certs=[ - ("example.mitmproxy.org", tutils.test_data.path("data/servercert/self-signed.pem")) + ("example.mitmproxy.org", tutils.test_data.path("mitmproxy/data/servercert/self-signed.pem")) ]) def _request(self): @@ -426,7 +427,7 @@ class TestHTTPSUpstreamServerVerificationWBadCert(tservers.HTTPProxyTest): def get_options(cls): opts = super().get_options() opts.ssl_verify_upstream_trusted_ca = tutils.test_data.path( - "data/servercert/trusted-root.pem" + "mitmproxy/data/servercert/trusted-root.pem" ) return opts @@ -453,7 +454,7 @@ class TestHTTPSNoCommonName(tservers.HTTPProxyTest): ssl = True ssloptions = pathod.SSLOptions( certs=[ - (b"*", tutils.test_data.path("data/no_common_name.pem")) + (b"*", tutils.test_data.path("mitmproxy/data/no_common_name.pem")) ] ) @@ -563,7 +564,7 @@ class TestTransparent(tservers.TransparentProxyTest, CommonMixin, TcpMixin): def test_tcp_stream_modify(self): s = script.Script( - tutils.test_data.path("data/addonscripts/tcp_stream_modify.py") + tutils.test_data.path("mitmproxy/data/addonscripts/tcp_stream_modify.py") ) self.master.addons.add(s) self._tcpproxy_on() @@ -594,7 +595,7 @@ class TestProxy(tservers.HTTPProxyTest): assert "host" in f.request.headers assert f.response.status_code == 304 - @tutils.skip_appveyor + @ttutils.skip_appveyor def test_response_timestamps(self): # test that we notice at least 1 sec delay between timestamps # in response object @@ -605,7 +606,7 @@ class TestProxy(tservers.HTTPProxyTest): # timestamp_start might fire a bit late, so we play safe and only require 300ms. assert 0.3 <= response.timestamp_end - response.timestamp_start - @tutils.skip_appveyor + @ttutils.skip_appveyor def test_request_timestamps(self): # test that we notice a delay between timestamps in request object connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -833,7 +834,7 @@ class TestKillRequest(tservers.HTTPProxyTest): masterclass = MasterKillRequest def test_kill(self): - with raises(exceptions.HttpReadDisconnect): + with tutils.raises(exceptions.HttpReadDisconnect): self.pathod("200") # Nothing should have hit the server assert not self.server.last_log() @@ -850,7 +851,7 @@ class TestKillResponse(tservers.HTTPProxyTest): masterclass = MasterKillResponse def test_kill(self): - with raises(exceptions.HttpReadDisconnect): + with tutils.raises(exceptions.HttpReadDisconnect): self.pathod("200") # The server should have seen a request assert self.server.last_log() @@ -1042,7 +1043,7 @@ class TestProxyChainingSSLReconnect(tservers.HTTPUpstreamProxyTest): class AddUpstreamCertsToClientChainMixin: ssl = True - servercert = tutils.test_data.path("data/servercert/trusted-root.pem") + servercert = tutils.test_data.path("mitmproxy/data/servercert/trusted-root.pem") ssloptions = pathod.SSLOptions( cn=b"example.mitmproxy.org", certs=[ diff --git a/test/mitmproxy/tutils.py b/test/mitmproxy/tutils.py index e95c5ea3..35e3295d 100644 --- a/test/mitmproxy/tutils.py +++ b/test/mitmproxy/tutils.py @@ -5,12 +5,9 @@ from unittest.case import SkipTest import io import mitmproxy.test.tutils import os -import shutil -import tempfile from mitmproxy import controller from mitmproxy import flow import mitmproxy.test.tflow -from mitmproxy.utils import data def _skip_windows(*args): @@ -63,31 +60,9 @@ def tdummyflow(client_conn=True, server_conn=True, err=None): return f -@contextmanager -def chdir(dir): - orig_dir = os.getcwd() - os.chdir(dir) - yield - os.chdir(orig_dir) - - -@contextmanager -def tmpdir(*args, **kwargs): - temp_workdir = tempfile.mkdtemp(*args, **kwargs) - with chdir(temp_workdir): - yield temp_workdir - shutil.rmtree(temp_workdir) - - -raises = mitmproxy.test.tutils.raises - - @contextmanager def capture_stderr(command, *args, **kwargs): out, sys.stderr = sys.stderr, io.StringIO() command(*args, **kwargs) yield sys.stderr.getvalue() sys.stderr = out - - -test_data = data.Data(__name__) -- cgit v1.2.3