1#
2# This file is part of pyasn1 software.
3#
4# Copyright (c) 2005-2017, 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 univ
18from pyasn1.type import tag
19from pyasn1.type import namedtype
20from pyasn1.type import opentype
21from pyasn1.compat.octets import str2octs
22from pyasn1.error import PyAsn1Error
23
24
25class UntaggedAnyTestCase(BaseTestCase):
26
27    def setUp(self):
28        BaseTestCase.setUp(self)
29
30        class Sequence(univ.Sequence):
31            componentType = namedtype.NamedTypes(
32                namedtype.NamedType('id', univ.Integer()),
33                namedtype.NamedType('blob', univ.Any())
34            )
35
36        self.s = Sequence()
37
38    def testTypeCheckOnAssignment(self):
39
40        self.s.clear()
41
42        self.s['blob'] = univ.Any(str2octs('xxx'))
43
44        # this should succeed because Any is untagged and unconstrained
45        self.s['blob'] = univ.Integer(123)
46
47
48class TaggedAnyTestCase(BaseTestCase):
49
50    def setUp(self):
51        BaseTestCase.setUp(self)
52
53        self.taggedAny = univ.Any().subtype(implicitTag=tag.Tag(tag.tagClassPrivate, tag.tagFormatSimple, 20))
54
55        class Sequence(univ.Sequence):
56            componentType = namedtype.NamedTypes(
57                namedtype.NamedType('id', univ.Integer()),
58                namedtype.NamedType('blob', self.taggedAny)
59            )
60
61        self.s = Sequence()
62
63    def testTypeCheckOnAssignment(self):
64
65        self.s.clear()
66
67        self.s['blob'] = self.taggedAny.clone('xxx')
68
69        try:
70            self.s.setComponentByName('blob', univ.Integer(123))
71
72        except PyAsn1Error:
73            pass
74
75        else:
76            assert False, 'non-open type assignment tolerated'
77
78
79class TaggedAnyOpenTypeTestCase(BaseTestCase):
80
81    def setUp(self):
82        BaseTestCase.setUp(self)
83
84        self.taggedAny = univ.Any().subtype(implicitTag=tag.Tag(tag.tagClassPrivate, tag.tagFormatSimple, 20))
85
86        class Sequence(univ.Sequence):
87            componentType = namedtype.NamedTypes(
88                namedtype.NamedType('id', univ.Integer()),
89                namedtype.NamedType('blob', self.taggedAny, openType=opentype.OpenType(name='id'))
90            )
91
92        self.s = Sequence()
93
94    def testTypeCheckOnAssignment(self):
95
96        self.s.clear()
97
98        self.s['blob'] = univ.Any(str2octs('xxx'))
99        self.s['blob'] = univ.Integer(123)
100
101
102suite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__])
103
104
105if __name__ == '__main__':
106    unittest.TextTestRunner(verbosity=2).run(suite)
107