from datetime import datetime
from string import ascii_letters
+from string import digits
from string import printable
from string import whitespace
from unittest import TestCase
from six import iterbytes
from six import PY2
from six import text_type
+from six import unichr as six_unichr
from pyderasn import _pp
from pyderasn import abs_decode_path
from pyderasn import Boolean
from pyderasn import BoundsError
from pyderasn import Choice
-from pyderasn import decode_path_defby
from pyderasn import DecodeError
+from pyderasn import DecodePathDefBy
from pyderasn import Enumerated
from pyderasn import GeneralizedTime
from pyderasn import GeneralString
from pyderasn import VisibleString
-settings.register_profile('local', settings(
+settings.register_profile("local", settings(
deadline=5000,
perform_health_check=False,
))
-settings.load_profile('local')
+settings.load_profile("local")
LONG_TEST_MAX_EXAMPLES = settings().max_examples * 4
tag_classes = sampled_from((
booleans(),
integers(min_value=1).map(tag_ctxc),
integers(min_value=0),
+ binary(max_size=5),
)
- def test_symmetric(self, values, value, tag_expl, offset):
+ def test_symmetric(self, values, value, tag_expl, offset, tail_junk):
for klass in (Boolean, BooleanInherited):
_, _, _, default, optional, _decoded = values
obj = klass(
repr(obj_expled)
pprint(obj_expled)
obj_expled_encoded = obj_expled.encode()
- obj_decoded, tail = obj_expled.decode(obj_expled_encoded, offset=offset)
+ obj_decoded, tail = obj_expled.decode(
+ obj_expled_encoded + tail_junk,
+ offset=offset,
+ )
repr(obj_decoded)
pprint(obj_decoded)
- self.assertEqual(tail, b"")
+ self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertNotEqual(obj_decoded, obj)
self.assertEqual(bool(obj_decoded), bool(obj_expled))
integers(),
integers(min_value=1).map(tag_ctxc),
integers(min_value=0),
+ binary(max_size=5),
)
- def test_symmetric(self, values, value, tag_expl, offset):
+ def test_symmetric(self, values, value, tag_expl, offset, tail_junk):
for klass in (Integer, IntegerInherited):
_, _, _, _, default, optional, _, _decoded = values
obj = klass(
repr(obj_expled)
pprint(obj_expled)
obj_expled_encoded = obj_expled.encode()
- obj_decoded, tail = obj_expled.decode(obj_expled_encoded, offset=offset)
+ obj_decoded, tail = obj_expled.decode(
+ obj_expled_encoded + tail_junk,
+ offset=offset,
+ )
repr(obj_decoded)
pprint(obj_decoded)
- self.assertEqual(tail, b"")
+ self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertNotEqual(obj_decoded, obj)
self.assertEqual(int(obj_decoded), int(obj_expled))
optional,
_decoded,
) = d.draw(bit_string_values_strategy(value_required=True))
+ tail_junk = d.draw(binary(max_size=5))
tag_expl = tag_ctxc(d.draw(integers(min_value=1)))
offset = d.draw(integers(min_value=0))
for klass in (BitString, BitStringInherited):
repr(obj_expled)
pprint(obj_expled)
obj_expled_encoded = obj_expled.encode()
- obj_decoded, tail = obj_expled.decode(obj_expled_encoded, offset=offset)
+ obj_decoded, tail = obj_expled.decode(
+ obj_expled_encoded + tail_junk,
+ offset=offset,
+ )
repr(obj_decoded)
pprint(obj_decoded)
- self.assertEqual(tail, b"")
+ self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertNotEqual(obj_decoded, obj)
self.assertEqual(bytes(obj_decoded), bytes(obj_expled))
binary(),
integers(min_value=1).map(tag_ctxc),
integers(min_value=0),
+ binary(max_size=5),
)
- def test_symmetric(self, values, value, tag_expl, offset):
+ def test_symmetric(self, values, value, tag_expl, offset, tail_junk):
for klass in (OctetString, OctetStringInherited):
_, _, _, _, default, optional, _decoded = values
obj = klass(
repr(obj_expled)
pprint(obj_expled)
obj_expled_encoded = obj_expled.encode()
- obj_decoded, tail = obj_expled.decode(obj_expled_encoded, offset=offset)
+ obj_decoded, tail = obj_expled.decode(
+ obj_expled_encoded + tail_junk,
+ offset=offset,
+ )
repr(obj_decoded)
pprint(obj_decoded)
- self.assertEqual(tail, b"")
+ self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertNotEqual(obj_decoded, obj)
self.assertEqual(bytes(obj_decoded), bytes(obj_expled))
null_values_strategy(),
integers(min_value=1).map(tag_ctxc),
integers(min_value=0),
+ binary(max_size=5),
)
- def test_symmetric(self, values, tag_expl, offset):
+ def test_symmetric(self, values, tag_expl, offset, tail_junk):
for klass in (Null, NullInherited):
_, _, optional, _decoded = values
obj = klass(optional=optional, _decoded=_decoded)
repr(obj_expled)
pprint(obj_expled)
obj_expled_encoded = obj_expled.encode()
- obj_decoded, tail = obj_expled.decode(obj_expled_encoded, offset=offset)
+ obj_decoded, tail = obj_expled.decode(
+ obj_expled_encoded + tail_junk,
+ offset=offset,
+ )
repr(obj_decoded)
pprint(obj_decoded)
- self.assertEqual(tail, b"")
+ self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertNotEqual(obj_decoded, obj)
self.assertSequenceEqual(obj_decoded.encode(), obj_expled_encoded)
oid_strategy(),
integers(min_value=1).map(tag_ctxc),
integers(min_value=0),
+ binary(max_size=5),
)
- def test_symmetric(self, values, value, tag_expl, offset):
+ def test_symmetric(self, values, value, tag_expl, offset, tail_junk):
for klass in (ObjectIdentifier, ObjectIdentifierInherited):
_, _, _, default, optional, _decoded = values
obj = klass(
repr(obj_expled)
pprint(obj_expled)
obj_expled_encoded = obj_expled.encode()
- obj_decoded, tail = obj_expled.decode(obj_expled_encoded, offset=offset)
+ obj_decoded, tail = obj_expled.decode(
+ obj_expled_encoded + tail_junk,
+ offset=offset,
+ )
repr(obj_decoded)
pprint(obj_decoded)
- self.assertEqual(tail, b"")
+ self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertNotEqual(obj_decoded, obj)
self.assertEqual(tuple(obj_decoded), tuple(obj_expled))
tag_expl = d.draw(integers(min_value=1).map(tag_ctxc))
offset = d.draw(integers(min_value=0))
value = d.draw(sampled_from(sorted([v for _, v in schema_input])))
+ tail_junk = d.draw(binary(max_size=5))
class E(Enumerated):
schema = schema_input
repr(obj_expled)
pprint(obj_expled)
obj_expled_encoded = obj_expled.encode()
- obj_decoded, tail = obj_expled.decode(obj_expled_encoded, offset=offset)
+ obj_decoded, tail = obj_expled.decode(
+ obj_expled_encoded + tail_junk,
+ offset=offset,
+ )
repr(obj_decoded)
pprint(obj_decoded)
- self.assertEqual(tail, b"")
+ self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertNotEqual(obj_decoded, obj)
self.assertEqual(int(obj_decoded), int(obj_expled))
value = d.draw(text(alphabet=self.text_alphabet()))
tag_expl = tag_ctxc(d.draw(integers(min_value=1)))
offset = d.draw(integers(min_value=0))
+ tail_junk = d.draw(binary(max_size=5))
_, _, _, _, default, optional, _decoded = values
obj = self.base_klass(
value=value,
repr(obj_expled)
pprint(obj_expled)
obj_expled_encoded = obj_expled.encode()
- obj_decoded, tail = obj_expled.decode(obj_expled_encoded, offset=offset)
+ obj_decoded, tail = obj_expled.decode(
+ obj_expled_encoded + tail_junk,
+ offset=offset,
+ )
repr(obj_decoded)
pprint(obj_decoded)
- self.assertEqual(tail, b"")
+ self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertNotEqual(obj_decoded, obj)
self.assertEqual(bytes(obj_decoded), bytes(obj_expled))
base_klass = UTF8String
+class UnicodeDecodeErrorMixin(object):
+ @given(text(
+ alphabet="".join(six_unichr(i) for i in list(range(0x0410, 0x044f + 1))),
+ min_size=1,
+ max_size=5,
+ ))
+ def test_unicode_decode_error(self, cyrillic_text):
+ with self.assertRaises(DecodeError):
+ self.base_klass(cyrillic_text)
+
+
class TestNumericString(StringMixin, CommonMixin, TestCase):
base_klass = NumericString
+ def text_alphabet(self):
+ return digits
+
+ @given(text(alphabet=ascii_letters, min_size=1, max_size=5))
+ def test_non_numeric(self, cyrillic_text):
+ with assertRaisesRegex(self, DecodeError, "non-numeric"):
+ self.base_klass(cyrillic_text)
+
+ @given(
+ sets(integers(min_value=0, max_value=10), min_size=2, max_size=2),
+ integers(min_value=0),
+ lists(integers()),
+ )
+ def test_invalid_bounds_while_decoding(self, ints, offset, decode_path):
+ decode_path = tuple(str(i) for i in decode_path)
+ value, bound_min = list(sorted(ints))
-class TestPrintableString(StringMixin, CommonMixin, TestCase):
+ class String(self.base_klass):
+ bounds = (bound_min, bound_min)
+ with self.assertRaises(DecodeError) as err:
+ String().decode(
+ self.base_klass(b"1" * value).encode(),
+ offset=offset,
+ decode_path=decode_path,
+ )
+ repr(err.exception)
+ self.assertEqual(err.exception.offset, offset)
+ self.assertEqual(err.exception.decode_path, decode_path)
+
+
+class TestPrintableString(
+ UnicodeDecodeErrorMixin,
+ StringMixin,
+ CommonMixin,
+ TestCase,
+):
base_klass = PrintableString
-class TestTeletexString(StringMixin, CommonMixin, TestCase):
+class TestTeletexString(
+ UnicodeDecodeErrorMixin,
+ StringMixin,
+ CommonMixin,
+ TestCase,
+):
base_klass = TeletexString
-class TestVideotexString(StringMixin, CommonMixin, TestCase):
+class TestVideotexString(
+ UnicodeDecodeErrorMixin,
+ StringMixin,
+ CommonMixin,
+ TestCase,
+):
base_klass = VideotexString
-class TestIA5String(StringMixin, CommonMixin, TestCase):
+class TestIA5String(
+ UnicodeDecodeErrorMixin,
+ StringMixin,
+ CommonMixin,
+ TestCase,
+):
base_klass = IA5String
-class TestGraphicString(StringMixin, CommonMixin, TestCase):
+class TestGraphicString(
+ UnicodeDecodeErrorMixin,
+ StringMixin,
+ CommonMixin,
+ TestCase,
+):
base_klass = GraphicString
-class TestVisibleString(StringMixin, CommonMixin, TestCase):
+class TestVisibleString(
+ UnicodeDecodeErrorMixin,
+ StringMixin,
+ CommonMixin,
+ TestCase,
+):
base_klass = VisibleString
-class TestGeneralString(StringMixin, CommonMixin, TestCase):
+class TestGeneralString(
+ UnicodeDecodeErrorMixin,
+ StringMixin,
+ CommonMixin,
+ TestCase,
+):
base_klass = GeneralString
))
tag_expl = tag_ctxc(d.draw(integers(min_value=1)))
offset = d.draw(integers(min_value=0))
+ tail_junk = d.draw(binary(max_size=5))
_, _, _, default, optional, _decoded = values
obj = self.base_klass(
value=value,
repr(obj_expled)
pprint(obj_expled)
obj_expled_encoded = obj_expled.encode()
- obj_decoded, tail = obj_expled.decode(obj_expled_encoded, offset=offset)
+ obj_decoded, tail = obj_expled.decode(
+ obj_expled_encoded + tail_junk,
+ offset=offset,
+ )
repr(obj_decoded)
pprint(obj_decoded)
- self.assertEqual(tail, b"")
+ self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertEqual(obj_decoded.todatetime(), obj_expled.todatetime())
self.assertEqual(obj_decoded.todatetime(), obj.todatetime())
integers().map(lambda x: Integer(x).encode()),
integers(min_value=1).map(tag_ctxc),
integers(min_value=0),
+ binary(max_size=5),
)
- def test_symmetric(self, values, value, tag_expl, offset):
+ def test_symmetric(self, values, value, tag_expl, offset, tail_junk):
for klass in (Any, AnyInherited):
_, _, optional, _decoded = values
obj = klass(value=value, optional=optional, _decoded=_decoded)
repr(obj_expled)
pprint(obj_expled)
obj_expled_encoded = obj_expled.encode()
- obj_decoded, tail = obj_expled.decode(obj_expled_encoded, offset=offset)
+ obj_decoded, tail = obj_expled.decode(
+ obj_expled_encoded + tail_junk,
+ offset=offset,
+ )
repr(obj_decoded)
pprint(obj_decoded)
- self.assertEqual(tail, b"")
+ self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertEqual(bytes(obj_decoded), bytes(obj_expled))
self.assertEqual(bytes(obj_decoded), bytes(obj))
)
tag_expl = tag_ctxc(d.draw(integers(min_value=1)))
offset = d.draw(integers(min_value=0))
+ tail_junk = d.draw(binary(max_size=5))
class Wahl(self.base_klass):
schema = _schema
repr(obj_expled)
pprint(obj_expled)
obj_expled_encoded = obj_expled.encode()
- obj_decoded, tail = obj_expled.decode(obj_expled_encoded, offset=offset)
+ obj_decoded, tail = obj_expled.decode(
+ obj_expled_encoded + tail_junk,
+ offset=offset,
+ )
repr(obj_decoded)
pprint(obj_decoded)
- self.assertEqual(tail, b"")
+ self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertEqual(obj_decoded.choice, obj_expled.choice)
self.assertEqual(obj_decoded.value, obj_expled.value)
with self.assertRaises(TagMismatch):
obj.decode(int_encoded)
+ def test_tag_mismatch_underlying(self):
+ class SeqOfBoolean(SequenceOf):
+ schema = Boolean()
+
+ class SeqOfInteger(SequenceOf):
+ schema = Integer()
+
+ class Wahl(Choice):
+ schema = (
+ ("erste", SeqOfBoolean()),
+ )
+
+ int_encoded = SeqOfInteger((Integer(123),)).encode()
+ bool_encoded = SeqOfBoolean((Boolean(False),)).encode()
+ obj = Wahl()
+ obj.decode(bool_encoded)
+ with self.assertRaises(TagMismatch) as err:
+ obj.decode(int_encoded)
+ self.assertEqual(err.exception.decode_path, ("erste", "0"))
+
@composite
def seq_values_strategy(draw, seq_klass, do_expl=False):
@given(data_strategy())
def test_symmetric(self, d):
seq, expects = d.draw(sequence_strategy(seq_klass=self.base_klass))
+ tail_junk = d.draw(binary(max_size=5))
self.assertTrue(seq.ready)
self.assertFalse(seq.decoded)
self._assert_expects(seq, expects)
repr(seq)
pprint(seq)
seq_encoded = seq.encode()
- seq_decoded, tail = seq.decode(seq_encoded)
- self.assertEqual(tail, b"")
+ seq_decoded, tail = seq.decode(seq_encoded + tail_junk)
+ self.assertEqual(tail, tail_junk)
self.assertTrue(seq.ready)
self._assert_expects(seq_decoded, expects)
self.assertEqual(seq, seq_decoded)
lists(integers().map(Integer)),
integers(min_value=1).map(tag_ctxc),
integers(min_value=0),
+ binary(max_size=5),
)
- def test_symmetric(self, values, value, tag_expl, offset):
+ def test_symmetric(self, values, value, tag_expl, offset, tail_junk):
_, _, _, _, _, default, optional, _decoded = values
class SeqOf(self.base_klass):
repr(obj_expled)
pprint(obj_expled)
obj_expled_encoded = obj_expled.encode()
- obj_decoded, tail = obj_expled.decode(obj_expled_encoded, offset=offset)
+ obj_decoded, tail = obj_expled.decode(
+ obj_expled_encoded + tail_junk,
+ offset=offset,
+ )
repr(obj_decoded)
pprint(obj_decoded)
- self.assertEqual(tail, b"")
+ self.assertEqual(tail, tail_junk)
self._test_symmetric_compare_objs(obj_decoded, obj_expled)
self.assertSequenceEqual(obj_decoded.encode(), obj_expled_encoded)
self.assertSequenceEqual(obj_decoded.expl_tag, tag_expl)
self.assertIsNotNone(seq_integered["value"].defined)
self.assertEqual(seq_integered["value"].defined[0], type_integered)
self.assertEqual(seq_integered["value"].defined[1], Integer(123))
+ self.assertTrue(seq_integered_raw[
+ seq_integered["value"].defined[1].offset:
+ ].startswith(Integer(123).encode()))
seq_sequenced, _ = Seq().decode(
seq_sequenced_raw,
self.assertIsNone(seq_inner["valueInner"].defined)
defines_by_path.append((
- ("value", decode_path_defby(type_sequenced), "typeInner"),
+ ("value", DecodePathDefBy(type_sequenced), "typeInner"),
((("valueInner",), {type_innered: Pairs()}),),
))
seq_sequenced, _ = Seq().decode(
defines_by_path.append((
(
"value",
- decode_path_defby(type_sequenced),
+ DecodePathDefBy(type_sequenced),
"valueInner",
- decode_path_defby(type_innered),
+ DecodePathDefBy(type_innered),
any,
"type",
),