1#
2# This file is part of pyasn1 software.
3#
4# Copyright (c) 2005-2018, Ilya Etingof <etingof@gmail.com>
5# License: http://snmplabs.com/pyasn1/license.html
6#
7import sys
8
9try:
10    import unittest2 as unittest
11
12except ImportError:
13    import unittest
14
15from tests.base import BaseTestCase
16
17from pyasn1.type import namedtype
18from pyasn1.type import univ
19from pyasn1.codec.native import encoder
20from pyasn1.compat.octets import str2octs
21from pyasn1.error import PyAsn1Error
22
23
24class BadAsn1SpecTestCase(BaseTestCase):
25    def testBadValueType(self):
26        try:
27            encoder.encode('not an Asn1Item')
28
29        except PyAsn1Error:
30            pass
31
32        else:
33            assert 0, 'Invalid value type accepted'
34
35
36class IntegerEncoderTestCase(BaseTestCase):
37    def testPosInt(self):
38        assert encoder.encode(univ.Integer(12)) == 12
39
40    def testNegInt(self):
41        assert encoder.encode(univ.Integer(-12)) == -12
42
43
44class BooleanEncoderTestCase(BaseTestCase):
45    def testTrue(self):
46        assert encoder.encode(univ.Boolean(1)) is True
47
48    def testFalse(self):
49        assert encoder.encode(univ.Boolean(0)) is False
50
51
52class BitStringEncoderTestCase(BaseTestCase):
53    def setUp(self):
54        BaseTestCase.setUp(self)
55        self.b = univ.BitString((1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1))
56
57    def testValue(self):
58        assert encoder.encode(self.b) == '101010011000101'
59
60
61class OctetStringEncoderTestCase(BaseTestCase):
62    def setUp(self):
63        BaseTestCase.setUp(self)
64        self.o = univ.OctetString('Quick brown fox')
65
66    def testValue(self):
67        assert encoder.encode(self.o) == str2octs('Quick brown fox')
68
69
70class NullEncoderTestCase(BaseTestCase):
71    def testNull(self):
72        assert encoder.encode(univ.Null('')) is None
73
74
75class ObjectIdentifierEncoderTestCase(BaseTestCase):
76    def testOne(self):
77        assert encoder.encode(univ.ObjectIdentifier((1, 3, 6, 0, 12345))) == '1.3.6.0.12345'
78
79
80class RealEncoderTestCase(BaseTestCase):
81    def testChar(self):
82        assert encoder.encode(univ.Real((123, 10, 11))) == 1.23e+13
83
84    def testPlusInf(self):
85        assert encoder.encode(univ.Real('inf')) == float('inf')
86
87    def testMinusInf(self):
88        assert encoder.encode(univ.Real('-inf')) == float('-inf')
89
90
91class SequenceEncoderTestCase(BaseTestCase):
92    def setUp(self):
93        BaseTestCase.setUp(self)
94
95        self.s = univ.Sequence(componentType=namedtype.NamedTypes(
96            namedtype.NamedType('place-holder', univ.Null('')),
97            namedtype.OptionalNamedType('first-name', univ.OctetString('')),
98            namedtype.DefaultedNamedType('age', univ.Integer(33)),
99        ))
100
101    def testSimple(self):
102        s = self.s.clone()
103        s[0] = univ.Null('')
104        s[1] = 'abc'
105        s[2] = 123
106        assert encoder.encode(s) == {'place-holder': None, 'first-name': str2octs('abc'), 'age': 123}
107
108
109class ChoiceEncoderTestCase(BaseTestCase):
110    def setUp(self):
111        BaseTestCase.setUp(self)
112
113        self.s = univ.Choice(
114            componentType=namedtype.NamedTypes(
115                namedtype.NamedType('place-holder', univ.Null('')),
116                namedtype.NamedType('number', univ.Integer(0)),
117                namedtype.NamedType('string', univ.OctetString())
118           )
119        )
120
121    def testEmpty(self):
122        try:
123            encoder.encode(self.s)
124        except PyAsn1Error:
125            pass
126        else:
127            assert False, 'encoded unset choice'
128
129    def testFilled(self):
130        self.s.setComponentByPosition(0, univ.Null(''))
131        assert encoder.encode(self.s) == {'place-holder': None}
132
133
134class AnyEncoderTestCase(BaseTestCase):
135    def setUp(self):
136        BaseTestCase.setUp(self)
137        self.s = univ.Any(encoder.encode(univ.OctetString('fox')))
138
139    def testSimple(self):
140        assert encoder.encode(self.s) == str2octs('fox')
141
142
143suite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__])
144
145if __name__ == '__main__':
146    unittest.TextTestRunner(verbosity=2).run(suite)
147