aboutsummaryrefslogtreecommitdiffstats
path: root/test/pathod/test_language_base.py
diff options
context:
space:
mode:
authorThomas Kriechbaumer <thomas@kriechbaumer.name>2017-02-14 22:48:43 +0100
committerThomas Kriechbaumer <thomas@kriechbaumer.name>2017-02-14 23:31:37 +0100
commita12c3d3f8ea255dd03bb7e993fa85eb00f47ab29 (patch)
tree82595e20d3fbbbb568de9178b7645a40fb7b0923 /test/pathod/test_language_base.py
parent04748e6f3f654733afafea3701d4ed03b08b8167 (diff)
downloadmitmproxy-a12c3d3f8ea255dd03bb7e993fa85eb00f47ab29.tar.gz
mitmproxy-a12c3d3f8ea255dd03bb7e993fa85eb00f47ab29.tar.bz2
mitmproxy-a12c3d3f8ea255dd03bb7e993fa85eb00f47ab29.zip
restructure and move test files
add empty test files to satisfy linter
Diffstat (limited to 'test/pathod/test_language_base.py')
-rw-r--r--test/pathod/test_language_base.py354
1 files changed, 0 insertions, 354 deletions
diff --git a/test/pathod/test_language_base.py b/test/pathod/test_language_base.py
deleted file mode 100644
index 85e9e53b..00000000
--- a/test/pathod/test_language_base.py
+++ /dev/null
@@ -1,354 +0,0 @@
-import os
-import pytest
-
-from pathod import language
-from pathod.language import base, exceptions
-
-from mitmproxy.test import tutils
-
-
-def parse_request(s):
- return language.parse_pathoc(s).next()
-
-
-def test_times():
- reqs = list(language.parse_pathoc("get:/:x5"))
- assert len(reqs) == 5
- assert not reqs[0].times
-
-
-def test_caseless_literal():
- class CL(base.CaselessLiteral):
- TOK = "foo"
- v = CL("foo")
- assert v.expr()
- assert v.values(language.Settings())
-
-
-class TestTokValueNakedLiteral:
-
- def test_expr(self):
- v = base.TokValueNakedLiteral("foo")
- assert v.expr()
-
- def test_spec(self):
- v = base.TokValueNakedLiteral("foo")
- assert v.spec() == repr(v) == "foo"
-
- v = base.TokValueNakedLiteral("f\x00oo")
- assert v.spec() == repr(v) == r"f\x00oo"
-
-
-class TestTokValueLiteral:
-
- def test_expr(self):
- v = base.TokValueLiteral("foo")
- assert v.expr()
- assert v.val == b"foo"
-
- v = base.TokValueLiteral("foo\n")
- assert v.expr()
- assert v.val == b"foo\n"
- assert repr(v)
-
- def test_spec(self):
- v = base.TokValueLiteral("foo")
- assert v.spec() == r"'foo'"
-
- v = base.TokValueLiteral("f\x00oo")
- assert v.spec() == repr(v) == r"'f\x00oo'"
-
- v = base.TokValueLiteral('"')
- assert v.spec() == repr(v) == """ '"' """.strip()
-
- # While pyparsing has a escChar argument for QuotedString,
- # escChar only performs scapes single-character escapes and does not work for e.g. r"\x02".
- # Thus, we cannot use that option, which means we cannot have single quotes in strings.
- # To fix this, we represent single quotes as r"\x07".
- v = base.TokValueLiteral("'")
- assert v.spec() == r"'\x27'"
-
- def roundtrip(self, spec):
- e = base.TokValueLiteral.expr()
- v = base.TokValueLiteral(spec)
- v2 = e.parseString(v.spec())
- assert v.val == v2[0].val
- assert v.spec() == v2[0].spec()
-
- def test_roundtrip(self):
- self.roundtrip("'")
- self.roundtrip(r"\'")
- self.roundtrip("a")
- self.roundtrip("\"")
- # self.roundtrip("\\")
- self.roundtrip("200:b'foo':i23,'\\''")
- self.roundtrip("\a")
-
-
-class TestTokValueGenerate:
-
- def test_basic(self):
- v = base.TokValue.parseString("@10b")[0]
- assert v.usize == 10
- assert v.unit == "b"
- assert v.bytes() == 10
- v = base.TokValue.parseString("@10")[0]
- assert v.unit == "b"
- v = base.TokValue.parseString("@10k")[0]
- assert v.bytes() == 10240
- v = base.TokValue.parseString("@10g")[0]
- assert v.bytes() == 1024 ** 3 * 10
-
- v = base.TokValue.parseString("@10g,digits")[0]
- assert v.datatype == "digits"
- g = v.get_generator({})
- assert g[:100]
-
- v = base.TokValue.parseString("@10,digits")[0]
- assert v.unit == "b"
- assert v.datatype == "digits"
-
- def test_spec(self):
- v = base.TokValueGenerate(1, "b", "bytes")
- assert v.spec() == repr(v) == "@1"
-
- v = base.TokValueGenerate(1, "k", "bytes")
- assert v.spec() == repr(v) == "@1k"
-
- v = base.TokValueGenerate(1, "k", "ascii")
- assert v.spec() == repr(v) == "@1k,ascii"
-
- v = base.TokValueGenerate(1, "b", "ascii")
- assert v.spec() == repr(v) == "@1,ascii"
-
- def test_freeze(self):
- v = base.TokValueGenerate(100, "b", "ascii")
- f = v.freeze(language.Settings())
- assert len(f.val) == 100
-
-
-class TestTokValueFile:
-
- def test_file_value(self):
- v = base.TokValue.parseString("<'one two'")[0]
- assert str(v)
- assert v.path == "one two"
-
- v = base.TokValue.parseString("<path")[0]
- assert v.path == "path"
-
- def test_access_control(self):
- v = base.TokValue.parseString("<path")[0]
- with tutils.tmpdir() as t:
- p = os.path.join(t, "path")
- with open(p, "wb") as f:
- f.write(b"x" * 10000)
-
- assert v.get_generator(language.Settings(staticdir=t))
-
- v = base.TokValue.parseString("<path2")[0]
- with pytest.raises(exceptions.FileAccessDenied):
- v.get_generator(language.Settings(staticdir=t))
- with pytest.raises(Exception, match="access disabled"):
- v.get_generator(language.Settings())
-
- v = base.TokValue.parseString("</outside")[0]
- with pytest.raises(Exception, match="outside"):
- v.get_generator(language.Settings(staticdir=t))
-
- def test_spec(self):
- v = base.TokValue.parseString("<'one two'")[0]
- v2 = base.TokValue.parseString(v.spec())[0]
- assert v2.path == "one two"
-
- def test_freeze(self):
- v = base.TokValue.parseString("<'one two'")[0]
- v2 = v.freeze({})
- assert v2.path == v.path
-
-
-class TestMisc:
-
- def test_generators(self):
- v = base.TokValue.parseString("'val'")[0]
- g = v.get_generator({})
- assert g[:] == b"val"
-
- def test_value(self):
- assert base.TokValue.parseString("'val'")[0].val == b"val"
- assert base.TokValue.parseString('"val"')[0].val == b"val"
- assert base.TokValue.parseString('"\'val\'"')[0].val == b"'val'"
-
- def test_value2(self):
- class TT(base.Value):
- preamble = "m"
- e = TT.expr()
- v = e.parseString("m'msg'")[0]
- assert v.value.val == b"msg"
-
- s = v.spec()
- assert s == e.parseString(s)[0].spec()
-
- v = e.parseString("m@100")[0]
- v2 = v.freeze({})
- v3 = v2.freeze({})
- assert v2.value.val == v3.value.val
-
- def test_fixedlengthvalue(self, tmpdir):
- class TT(base.FixedLengthValue):
- preamble = "m"
- length = 4
-
- e = TT.expr()
- assert e.parseString("m@4")
- with pytest.raises(Exception, match="Invalid value length"):
- e.parseString("m@100")
- with pytest.raises(Exception, match="Invalid value length"):
- e.parseString("m@1")
-
- s = base.Settings(staticdir=str(tmpdir))
- tmpdir.join("path").write_binary(b"a" * 20, ensure=True)
- v = e.parseString("m<path")[0]
- with pytest.raises(Exception, match="Invalid value length"):
- v.values(s)
-
- tmpdir.join("path2").write_binary(b"a" * 4, ensure=True)
- v = e.parseString("m<path2")[0]
- assert v.values(s)
-
-
-class TKeyValue(base.KeyValue):
- preamble = "h"
-
- def values(self, settings):
- return [
- self.key.get_generator(settings),
- ": ",
- self.value.get_generator(settings),
- "\r\n",
- ]
-
-
-class TestKeyValue:
-
- def test_simple(self):
- e = TKeyValue.expr()
- v = e.parseString("h'foo'='bar'")[0]
- assert v.key.val == b"foo"
- assert v.value.val == b"bar"
-
- v2 = e.parseString(v.spec())[0]
- assert v2.key.val == v.key.val
- assert v2.value.val == v.value.val
-
- s = v.spec()
- assert s == e.parseString(s)[0].spec()
-
- def test_freeze(self):
- e = TKeyValue.expr()
- v = e.parseString("h@10=@10'")[0]
- v2 = v.freeze({})
- v3 = v2.freeze({})
- assert v2.key.val == v3.key.val
- assert v2.value.val == v3.value.val
-
-
-def test_intfield():
- class TT(base.IntField):
- preamble = "t"
- names = {
- "one": 1,
- "two": 2,
- "three": 3
- }
- max = 4
- e = TT.expr()
-
- v = e.parseString("tone")[0]
- assert v.value == 1
- assert v.spec() == "tone"
- assert v.values(language.Settings())
-
- v = e.parseString("t1")[0]
- assert v.value == 1
- assert v.spec() == "t1"
-
- v = e.parseString("t4")[0]
- assert v.value == 4
- assert v.spec() == "t4"
-
- with pytest.raises(Exception, match="can't exceed"):
- e.parseString("t5")
-
-
-def test_options_or_value():
- class TT(base.OptionsOrValue):
- options = [
- "one",
- "two",
- "three"
- ]
- e = TT.expr()
- assert e.parseString("one")[0].value.val == b"one"
- assert e.parseString("'foo'")[0].value.val == b"foo"
- assert e.parseString("'get'")[0].value.val == b"get"
-
- assert e.parseString("one")[0].spec() == "one"
- assert e.parseString("'foo'")[0].spec() == "'foo'"
-
- s = e.parseString("one")[0].spec()
- assert s == e.parseString(s)[0].spec()
-
- s = e.parseString("'foo'")[0].spec()
- assert s == e.parseString(s)[0].spec()
-
- v = e.parseString("@100")[0]
- v2 = v.freeze({})
- v3 = v2.freeze({})
- assert v2.value.val == v3.value.val
-
-
-def test_integer():
- e = base.Integer.expr()
- v = e.parseString("200")[0]
- assert v.string() == b"200"
- assert v.spec() == "200"
-
- assert v.freeze({}).value == v.value
-
- class BInt(base.Integer):
- bounds = (1, 5)
-
- with pytest.raises(Exception, match="must be between"):
- BInt(0)
- with pytest.raises(Exception, match="must be between"):
- BInt(6)
- assert BInt(5)
- assert BInt(1)
- assert BInt(3)
-
-
-class TBoolean(base.Boolean):
- name = "test"
-
-
-def test_unique_name():
- b = TBoolean(True)
- assert b.unique_name
-
-
-class test_boolean:
- e = TBoolean.expr()
- assert e.parseString("test")[0].value
- assert not e.parseString("-test")[0].value
-
- def roundtrip(s):
- e = TBoolean.expr()
- s2 = e.parseString(s)[0].spec()
- v1 = e.parseString(s)[0].value
- v2 = e.parseString(s2)[0].value
- assert s == s2
- assert v1 == v2
-
- roundtrip("test")
- roundtrip("-test")