From 978b8d095c3106e973258376e4a15264288d20f2 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Sun, 17 Dec 2017 13:31:36 +1300 Subject: mitmproxy.types -> mitmproxy.coretypes The types name is valuable, and we have a better use for it in collecting and exposing types for options and commands. The coretypes module should probably be split up anyway - it contains a threading base class, a few container objects, and the defintion of our serialization protocol. I was tempted to rename it to "uncagegorized" for the sake of honesty. --- test/mitmproxy/contentviews/test_auto.py | 2 +- test/mitmproxy/contentviews/test_query.py | 2 +- test/mitmproxy/coretypes/__init__.py | 0 test/mitmproxy/coretypes/test_basethread.py | 7 + test/mitmproxy/coretypes/test_bidi.py | 13 ++ test/mitmproxy/coretypes/test_multidict.py | 211 ++++++++++++++++++++++++++ test/mitmproxy/coretypes/test_serializable.py | 39 +++++ test/mitmproxy/types/__init__.py | 0 test/mitmproxy/types/test_basethread.py | 7 - test/mitmproxy/types/test_bidi.py | 13 -- test/mitmproxy/types/test_multidict.py | 211 -------------------------- test/mitmproxy/types/test_serializable.py | 39 ----- 12 files changed, 272 insertions(+), 272 deletions(-) create mode 100644 test/mitmproxy/coretypes/__init__.py create mode 100644 test/mitmproxy/coretypes/test_basethread.py create mode 100644 test/mitmproxy/coretypes/test_bidi.py create mode 100644 test/mitmproxy/coretypes/test_multidict.py create mode 100644 test/mitmproxy/coretypes/test_serializable.py delete mode 100644 test/mitmproxy/types/__init__.py delete mode 100644 test/mitmproxy/types/test_basethread.py delete mode 100644 test/mitmproxy/types/test_bidi.py delete mode 100644 test/mitmproxy/types/test_multidict.py delete mode 100644 test/mitmproxy/types/test_serializable.py (limited to 'test') diff --git a/test/mitmproxy/contentviews/test_auto.py b/test/mitmproxy/contentviews/test_auto.py index 2ff43139..cd888a2d 100644 --- a/test/mitmproxy/contentviews/test_auto.py +++ b/test/mitmproxy/contentviews/test_auto.py @@ -1,6 +1,6 @@ from mitmproxy.contentviews import auto from mitmproxy.net import http -from mitmproxy.types import multidict +from mitmproxy.coretypes import multidict from . import full_eval diff --git a/test/mitmproxy/contentviews/test_query.py b/test/mitmproxy/contentviews/test_query.py index d2bddd05..741b23f1 100644 --- a/test/mitmproxy/contentviews/test_query.py +++ b/test/mitmproxy/contentviews/test_query.py @@ -1,5 +1,5 @@ from mitmproxy.contentviews import query -from mitmproxy.types import multidict +from mitmproxy.coretypes import multidict from . import full_eval diff --git a/test/mitmproxy/coretypes/__init__.py b/test/mitmproxy/coretypes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/test/mitmproxy/coretypes/test_basethread.py b/test/mitmproxy/coretypes/test_basethread.py new file mode 100644 index 00000000..4a383fea --- /dev/null +++ b/test/mitmproxy/coretypes/test_basethread.py @@ -0,0 +1,7 @@ +import re +from mitmproxy.coretypes import basethread + + +def test_basethread(): + t = basethread.BaseThread('foobar') + assert re.match('foobar - age: \d+s', t._threadinfo()) diff --git a/test/mitmproxy/coretypes/test_bidi.py b/test/mitmproxy/coretypes/test_bidi.py new file mode 100644 index 00000000..3bdad3c2 --- /dev/null +++ b/test/mitmproxy/coretypes/test_bidi.py @@ -0,0 +1,13 @@ +import pytest +from mitmproxy.coretypes import bidi + + +def test_bidi(): + b = bidi.BiDi(a=1, b=2) + assert b.a == 1 + assert b.get_name(1) == "a" + assert b.get_name(5) is None + with pytest.raises(AttributeError): + getattr(b, "c") + with pytest.raises(ValueError): + bidi.BiDi(one=1, two=1) diff --git a/test/mitmproxy/coretypes/test_multidict.py b/test/mitmproxy/coretypes/test_multidict.py new file mode 100644 index 00000000..273d8ca2 --- /dev/null +++ b/test/mitmproxy/coretypes/test_multidict.py @@ -0,0 +1,211 @@ +import pytest + +from mitmproxy.coretypes import multidict + + +class _TMulti: + @staticmethod + def _kconv(key): + return key.lower() + + +class TMultiDict(_TMulti, multidict.MultiDict): + pass + + +class TestMultiDict: + @staticmethod + def _multi(): + return TMultiDict(( + ("foo", "bar"), + ("bar", "baz"), + ("Bar", "bam") + )) + + def test_init(self): + md = TMultiDict() + assert len(md) == 0 + + md = TMultiDict([("foo", "bar")]) + assert len(md) == 1 + assert md.fields == (("foo", "bar"),) + + def test_repr(self): + assert repr(self._multi()) == ( + "TMultiDict[('foo', 'bar'), ('bar', 'baz'), ('Bar', 'bam')]" + ) + + def test_getitem(self): + md = TMultiDict([("foo", "bar")]) + assert "foo" in md + assert "Foo" in md + assert md["foo"] == "bar" + + with pytest.raises(KeyError): + assert md["bar"] + + md_multi = TMultiDict( + [("foo", "a"), ("foo", "b")] + ) + assert md_multi["foo"] == "a" + + def test_setitem(self): + md = TMultiDict() + md["foo"] = "bar" + assert md.fields == (("foo", "bar"),) + + md["foo"] = "baz" + assert md.fields == (("foo", "baz"),) + + md["bar"] = "bam" + assert md.fields == (("foo", "baz"), ("bar", "bam")) + + def test_delitem(self): + md = self._multi() + del md["foo"] + assert "foo" not in md + assert "bar" in md + + with pytest.raises(KeyError): + del md["foo"] + + del md["bar"] + assert md.fields == () + + def test_iter(self): + md = self._multi() + assert list(md.__iter__()) == ["foo", "bar"] + + def test_len(self): + md = TMultiDict() + assert len(md) == 0 + + md = self._multi() + assert len(md) == 2 + + def test_eq(self): + assert TMultiDict() == TMultiDict() + assert not (TMultiDict() == 42) + + md1 = self._multi() + md2 = self._multi() + assert md1 == md2 + md1.fields = md1.fields[1:] + md1.fields[:1] + assert not (md1 == md2) + + def test_hash(self): + """ + If a class defines mutable objects and implements an __eq__() method, + it should not implement __hash__(), since the implementation of hashable + collections requires that a key's hash value is immutable. + """ + with pytest.raises(TypeError): + assert hash(TMultiDict()) + + def test_get_all(self): + md = self._multi() + assert md.get_all("foo") == ["bar"] + assert md.get_all("bar") == ["baz", "bam"] + assert md.get_all("baz") == [] + + def test_set_all(self): + md = TMultiDict() + md.set_all("foo", ["bar", "baz"]) + assert md.fields == (("foo", "bar"), ("foo", "baz")) + + md = TMultiDict(( + ("a", "b"), + ("x", "x"), + ("c", "d"), + ("X", "X"), + ("e", "f"), + )) + md.set_all("x", ["1", "2", "3"]) + assert md.fields == ( + ("a", "b"), + ("x", "1"), + ("c", "d"), + ("X", "2"), + ("e", "f"), + ("x", "3"), + ) + md.set_all("x", ["4"]) + assert md.fields == ( + ("a", "b"), + ("x", "4"), + ("c", "d"), + ("e", "f"), + ) + + def test_add(self): + md = self._multi() + md.add("foo", "foo") + assert md.fields == ( + ("foo", "bar"), + ("bar", "baz"), + ("Bar", "bam"), + ("foo", "foo") + ) + + def test_insert(self): + md = TMultiDict([("b", "b")]) + md.insert(0, "a", "a") + md.insert(2, "c", "c") + assert md.fields == (("a", "a"), ("b", "b"), ("c", "c")) + + def test_keys(self): + md = self._multi() + assert list(md.keys()) == ["foo", "bar"] + assert list(md.keys(multi=True)) == ["foo", "bar", "Bar"] + + def test_values(self): + md = self._multi() + assert list(md.values()) == ["bar", "baz"] + assert list(md.values(multi=True)) == ["bar", "baz", "bam"] + + def test_items(self): + md = self._multi() + assert list(md.items()) == [("foo", "bar"), ("bar", "baz")] + assert list(md.items(multi=True)) == [("foo", "bar"), ("bar", "baz"), ("Bar", "bam")] + + def test_state(self): + md = self._multi() + assert len(md.get_state()) == 3 + assert md == TMultiDict.from_state(md.get_state()) + + md2 = TMultiDict() + assert md != md2 + md2.set_state(md.get_state()) + assert md == md2 + + +class TParent: + def __init__(self): + self.vals = tuple() + + def setter(self, vals): + self.vals = vals + + def getter(self): + return self.vals + + +class TestMultiDictView: + def test_modify(self): + p = TParent() + tv = multidict.MultiDictView(p.getter, p.setter) + assert len(tv) == 0 + tv["a"] = "b" + assert p.vals == (("a", "b"),) + tv["c"] = "b" + assert p.vals == (("a", "b"), ("c", "b")) + assert tv["a"] == "b" + + def test_copy(self): + p = TParent() + tv = multidict.MultiDictView(p.getter, p.setter) + c = tv.copy() + assert isinstance(c, multidict.MultiDict) + assert tv.items() == c.items() + c["foo"] = "bar" + assert tv.items() != c.items() diff --git a/test/mitmproxy/coretypes/test_serializable.py b/test/mitmproxy/coretypes/test_serializable.py new file mode 100644 index 00000000..a316f876 --- /dev/null +++ b/test/mitmproxy/coretypes/test_serializable.py @@ -0,0 +1,39 @@ +import copy + +from mitmproxy.coretypes import serializable + + +class SerializableDummy(serializable.Serializable): + def __init__(self, i): + self.i = i + + def get_state(self): + return copy.copy(self.i) + + def set_state(self, i): + self.i = i + + @classmethod + def from_state(cls, state): + return cls(state) + + +class TestSerializable: + def test_copy(self): + a = SerializableDummy(42) + assert a.i == 42 + b = a.copy() + assert b.i == 42 + + a.set_state(1) + assert a.i == 1 + assert b.i == 42 + + def test_copy_id(self): + a = SerializableDummy({ + "id": "foo", + "foo": 42 + }) + b = a.copy() + assert a.get_state()["id"] != b.get_state()["id"] + assert a.get_state()["foo"] == b.get_state()["foo"] diff --git a/test/mitmproxy/types/__init__.py b/test/mitmproxy/types/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/test/mitmproxy/types/test_basethread.py b/test/mitmproxy/types/test_basethread.py deleted file mode 100644 index a91588eb..00000000 --- a/test/mitmproxy/types/test_basethread.py +++ /dev/null @@ -1,7 +0,0 @@ -import re -from mitmproxy.types import basethread - - -def test_basethread(): - t = basethread.BaseThread('foobar') - assert re.match('foobar - age: \d+s', t._threadinfo()) diff --git a/test/mitmproxy/types/test_bidi.py b/test/mitmproxy/types/test_bidi.py deleted file mode 100644 index e3a259fd..00000000 --- a/test/mitmproxy/types/test_bidi.py +++ /dev/null @@ -1,13 +0,0 @@ -import pytest -from mitmproxy.types import bidi - - -def test_bidi(): - b = bidi.BiDi(a=1, b=2) - assert b.a == 1 - assert b.get_name(1) == "a" - assert b.get_name(5) is None - with pytest.raises(AttributeError): - getattr(b, "c") - with pytest.raises(ValueError): - bidi.BiDi(one=1, two=1) diff --git a/test/mitmproxy/types/test_multidict.py b/test/mitmproxy/types/test_multidict.py deleted file mode 100644 index c76cd753..00000000 --- a/test/mitmproxy/types/test_multidict.py +++ /dev/null @@ -1,211 +0,0 @@ -import pytest - -from mitmproxy.types import multidict - - -class _TMulti: - @staticmethod - def _kconv(key): - return key.lower() - - -class TMultiDict(_TMulti, multidict.MultiDict): - pass - - -class TestMultiDict: - @staticmethod - def _multi(): - return TMultiDict(( - ("foo", "bar"), - ("bar", "baz"), - ("Bar", "bam") - )) - - def test_init(self): - md = TMultiDict() - assert len(md) == 0 - - md = TMultiDict([("foo", "bar")]) - assert len(md) == 1 - assert md.fields == (("foo", "bar"),) - - def test_repr(self): - assert repr(self._multi()) == ( - "TMultiDict[('foo', 'bar'), ('bar', 'baz'), ('Bar', 'bam')]" - ) - - def test_getitem(self): - md = TMultiDict([("foo", "bar")]) - assert "foo" in md - assert "Foo" in md - assert md["foo"] == "bar" - - with pytest.raises(KeyError): - assert md["bar"] - - md_multi = TMultiDict( - [("foo", "a"), ("foo", "b")] - ) - assert md_multi["foo"] == "a" - - def test_setitem(self): - md = TMultiDict() - md["foo"] = "bar" - assert md.fields == (("foo", "bar"),) - - md["foo"] = "baz" - assert md.fields == (("foo", "baz"),) - - md["bar"] = "bam" - assert md.fields == (("foo", "baz"), ("bar", "bam")) - - def test_delitem(self): - md = self._multi() - del md["foo"] - assert "foo" not in md - assert "bar" in md - - with pytest.raises(KeyError): - del md["foo"] - - del md["bar"] - assert md.fields == () - - def test_iter(self): - md = self._multi() - assert list(md.__iter__()) == ["foo", "bar"] - - def test_len(self): - md = TMultiDict() - assert len(md) == 0 - - md = self._multi() - assert len(md) == 2 - - def test_eq(self): - assert TMultiDict() == TMultiDict() - assert not (TMultiDict() == 42) - - md1 = self._multi() - md2 = self._multi() - assert md1 == md2 - md1.fields = md1.fields[1:] + md1.fields[:1] - assert not (md1 == md2) - - def test_hash(self): - """ - If a class defines mutable objects and implements an __eq__() method, - it should not implement __hash__(), since the implementation of hashable - collections requires that a key's hash value is immutable. - """ - with pytest.raises(TypeError): - assert hash(TMultiDict()) - - def test_get_all(self): - md = self._multi() - assert md.get_all("foo") == ["bar"] - assert md.get_all("bar") == ["baz", "bam"] - assert md.get_all("baz") == [] - - def test_set_all(self): - md = TMultiDict() - md.set_all("foo", ["bar", "baz"]) - assert md.fields == (("foo", "bar"), ("foo", "baz")) - - md = TMultiDict(( - ("a", "b"), - ("x", "x"), - ("c", "d"), - ("X", "X"), - ("e", "f"), - )) - md.set_all("x", ["1", "2", "3"]) - assert md.fields == ( - ("a", "b"), - ("x", "1"), - ("c", "d"), - ("X", "2"), - ("e", "f"), - ("x", "3"), - ) - md.set_all("x", ["4"]) - assert md.fields == ( - ("a", "b"), - ("x", "4"), - ("c", "d"), - ("e", "f"), - ) - - def test_add(self): - md = self._multi() - md.add("foo", "foo") - assert md.fields == ( - ("foo", "bar"), - ("bar", "baz"), - ("Bar", "bam"), - ("foo", "foo") - ) - - def test_insert(self): - md = TMultiDict([("b", "b")]) - md.insert(0, "a", "a") - md.insert(2, "c", "c") - assert md.fields == (("a", "a"), ("b", "b"), ("c", "c")) - - def test_keys(self): - md = self._multi() - assert list(md.keys()) == ["foo", "bar"] - assert list(md.keys(multi=True)) == ["foo", "bar", "Bar"] - - def test_values(self): - md = self._multi() - assert list(md.values()) == ["bar", "baz"] - assert list(md.values(multi=True)) == ["bar", "baz", "bam"] - - def test_items(self): - md = self._multi() - assert list(md.items()) == [("foo", "bar"), ("bar", "baz")] - assert list(md.items(multi=True)) == [("foo", "bar"), ("bar", "baz"), ("Bar", "bam")] - - def test_state(self): - md = self._multi() - assert len(md.get_state()) == 3 - assert md == TMultiDict.from_state(md.get_state()) - - md2 = TMultiDict() - assert md != md2 - md2.set_state(md.get_state()) - assert md == md2 - - -class TParent: - def __init__(self): - self.vals = tuple() - - def setter(self, vals): - self.vals = vals - - def getter(self): - return self.vals - - -class TestMultiDictView: - def test_modify(self): - p = TParent() - tv = multidict.MultiDictView(p.getter, p.setter) - assert len(tv) == 0 - tv["a"] = "b" - assert p.vals == (("a", "b"),) - tv["c"] = "b" - assert p.vals == (("a", "b"), ("c", "b")) - assert tv["a"] == "b" - - def test_copy(self): - p = TParent() - tv = multidict.MultiDictView(p.getter, p.setter) - c = tv.copy() - assert isinstance(c, multidict.MultiDict) - assert tv.items() == c.items() - c["foo"] = "bar" - assert tv.items() != c.items() diff --git a/test/mitmproxy/types/test_serializable.py b/test/mitmproxy/types/test_serializable.py deleted file mode 100644 index 390d17e1..00000000 --- a/test/mitmproxy/types/test_serializable.py +++ /dev/null @@ -1,39 +0,0 @@ -import copy - -from mitmproxy.types import serializable - - -class SerializableDummy(serializable.Serializable): - def __init__(self, i): - self.i = i - - def get_state(self): - return copy.copy(self.i) - - def set_state(self, i): - self.i = i - - @classmethod - def from_state(cls, state): - return cls(state) - - -class TestSerializable: - def test_copy(self): - a = SerializableDummy(42) - assert a.i == 42 - b = a.copy() - assert b.i == 42 - - a.set_state(1) - assert a.i == 1 - assert b.i == 42 - - def test_copy_id(self): - a = SerializableDummy({ - "id": "foo", - "foo": 42 - }) - b = a.copy() - assert a.get_state()["id"] != b.get_state()["id"] - assert a.get_state()["foo"] == b.get_state()["foo"] -- cgit v1.2.3