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