blob: 74550c00ecb3fca47d0f20730a0e522345091a61 [file] [log] [blame]
#
# This file is part of pyasn1 software.
#
# Copyright (c) 2005-2017, Ilya Etingof <etingof@gmail.com>
# License: http://pyasn1.sf.net/license.html
#
import sys
try:
import unittest2 as unittest
except ImportError:
import unittest
from tests.base import BaseTestCase
from pyasn1.type import char, univ, constraint
from pyasn1.compat.octets import ints2octs
from pyasn1.error import PyAsn1Error
class AbstractStringTestCase(object):
initializer = ()
encoding = 'us-ascii'
asn1Type = None
def setUp(self):
BaseTestCase.setUp(self)
self.asn1String = self.asn1Type(ints2octs(self.initializer), encoding=self.encoding)
self.pythonString = ints2octs(self.initializer).decode(self.encoding)
def testUnicode(self):
assert self.asn1String == self.pythonString, 'unicode init fails'
def testLength(self):
assert len(self.asn1String) == len(self.pythonString), 'unicode len() fails'
def testSizeConstraint(self):
asn1Spec = self.asn1Type(subtypeSpec=constraint.ValueSizeConstraint(1, 1))
try:
asn1Spec.clone(self.pythonString)
except PyAsn1Error:
pass
else:
assert False, 'Size constraint tolerated'
try:
asn1Spec.clone(self.pythonString[0])
except PyAsn1Error:
assert False, 'Size constraint failed'
def testSerialized(self):
if sys.version_info[0] < 3:
assert str(self.asn1String) == self.pythonString.encode(self.encoding), '__str__() fails'
else:
assert bytes(self.asn1String) == self.pythonString.encode(self.encoding), '__str__() fails'
def testPrintable(self):
if sys.version_info[0] < 3:
assert unicode(self.asn1String) == self.pythonString, '__str__() fails'
else:
assert str(self.asn1String) == self.pythonString, '__str__() fails'
def testInit(self):
assert self.asn1Type(self.pythonString) == self.pythonString
assert self.asn1Type(self.pythonString.encode(self.encoding)) == self.pythonString
assert self.asn1Type(univ.OctetString(self.pythonString.encode(self.encoding))) == self.pythonString
assert self.asn1Type(self.asn1Type(self.pythonString)) == self.pythonString
assert self.asn1Type(self.initializer, encoding=self.encoding) == self.pythonString
def testInitFromAsn1(self):
assert self.asn1Type(self.asn1Type(self.pythonString)) == self.pythonString
assert self.asn1Type(univ.OctetString(self.pythonString.encode(self.encoding), encoding=self.encoding)) == self.pythonString
def testAsOctets(self):
assert self.asn1String.asOctets() == self.pythonString.encode(self.encoding), 'testAsOctets() fails'
def testAsNumbers(self):
assert self.asn1String.asNumbers() == self.initializer, 'testAsNumbers() fails'
def testSeq(self):
assert self.asn1String[0] == self.pythonString[0], '__getitem__() fails'
def testEmpty(self):
try:
str(self.asn1Type())
except PyAsn1Error:
pass
else:
assert 0, 'Value operation on ASN1 type tolerated'
def testAdd(self):
assert self.asn1String + self.pythonString.encode(self.encoding) == self.pythonString + self.pythonString, '__add__() fails'
def testRadd(self):
assert self.pythonString.encode(self.encoding) + self.asn1String == self.pythonString + self.pythonString, '__radd__() fails'
def testMul(self):
assert self.asn1String * 2 == self.pythonString * 2, '__mul__() fails'
def testRmul(self):
assert 2 * self.asn1String == 2 * self.pythonString, '__rmul__() fails'
def testContains(self):
assert self.pythonString in self.asn1String
assert self.pythonString + self.pythonString not in self.asn1String
if sys.version_info[:2] > (2, 4):
def testReverse(self):
assert list(reversed(self.asn1String)) == list(reversed(self.pythonString))
class VisibleStringTestCase(AbstractStringTestCase, BaseTestCase):
initializer = (97, 102)
encoding = 'us-ascii'
asn1Type = char.VisibleString
class GeneralStringTestCase(AbstractStringTestCase, BaseTestCase):
initializer = (169, 174)
encoding = 'iso-8859-1'
asn1Type = char.GeneralString
class UTF8StringTestCase(AbstractStringTestCase, BaseTestCase):
initializer = (209, 132, 208, 176)
encoding = 'utf-8'
asn1Type = char.UTF8String
class BMPStringTestCase(AbstractStringTestCase, BaseTestCase):
initializer = (4, 48, 4, 68)
encoding = 'utf-16-be'
asn1Type = char.BMPString
if sys.version_info[0] > 2:
# Somehow comparison of UTF-32 encoded strings does not work in Py2
class UniversalStringTestCase(AbstractStringTestCase, BaseTestCase):
initializer = (0, 0, 4, 48, 0, 0, 4, 68)
encoding = 'utf-32-be'
asn1Type = char.UniversalString
suite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__])
if __name__ == '__main__':
unittest.TextTestRunner(verbosity=2).run(suite)