1 # Copyright (C) Jean-Paul Calderone
2 # Copyright (C) Twisted Matrix Laboratories.
3 # See LICENSE for details.
6 Helpers for the OpenSSL test suite, largely copied from
7 U{Twisted<http://twistedmatrix.com/>}.
12 from tempfile import mktemp
13 from unittest import TestCase
16 from OpenSSL.crypto import Error, _exception_from_error_queue
18 if sys.version_info < (3, 0):
24 return s.encode("charmap")
28 class TestCase(TestCase):
30 L{TestCase} adds useful testing functionality beyond what is available
31 from the standard library L{unittest.TestCase}.
35 Clean up any files or directories created using L{TestCase.mktemp}.
36 Subclasses must invoke this method if they override it or the
37 cleanup will not occur.
39 if False and self._temporaryFiles is not None:
40 for temp in self._temporaryFiles:
41 if os.path.isdir(temp):
43 elif os.path.exists(temp):
46 _exception_from_error_queue()
50 self.fail("Left over errors in OpenSSL error queue: " + repr(e))
53 def failUnlessIdentical(self, first, second, msg=None):
55 Fail the test if C{first} is not C{second}. This is an
56 obect-identity-equality test, not an object equality
57 (i.e. C{__eq__}) test.
59 @param msg: if msg is None, then the failure message will be
60 '%r is not %r' % (first, second)
62 if first is not second:
63 raise self.failureException(msg or '%r is not %r' % (first, second))
65 assertIdentical = failUnlessIdentical
68 def failIfIdentical(self, first, second, msg=None):
70 Fail the test if C{first} is C{second}. This is an
71 obect-identity-equality test, not an object equality
72 (i.e. C{__eq__}) test.
74 @param msg: if msg is None, then the failure message will be
75 '%r is %r' % (first, second)
78 raise self.failureException(msg or '%r is %r' % (first, second))
80 assertNotIdentical = failIfIdentical
83 def failUnlessRaises(self, exception, f, *args, **kwargs):
85 Fail the test unless calling the function C{f} with the given
86 C{args} and C{kwargs} raises C{exception}. The failure will report
87 the traceback and call stack of the unexpected exception.
89 @param exception: exception type that is to be expected
90 @param f: the function to call
92 @return: The raised exception instance, if it is of the given type.
93 @raise self.failureException: Raised if the function call does
94 not raise an exception or if it raises an exception of a
98 result = f(*args, **kwargs)
100 inst = sys.exc_info()[1]
103 raise self.failureException('%s raised instead of %s'
104 % (sys.exc_info()[0],
108 raise self.failureException('%s not raised (%r returned)'
109 % (exception.__name__, result))
110 assertRaises = failUnlessRaises
113 _temporaryFiles = None
116 Pathetic substitute for twisted.trial.unittest.TestCase.mktemp.
118 if self._temporaryFiles is None:
119 self._temporaryFiles = []
120 temp = mktemp(dir=".")
121 self._temporaryFiles.append(temp)
125 # Python 2.3 compatibility.
126 def assertTrue(self, *a, **kw):
127 return self.failUnless(*a, **kw)
130 def assertFalse(self, *a, **kw):
131 return self.failIf(*a, **kw)
135 def assertConsistentType(self, theType, name, *constructionArgs):
137 Perform various assertions about C{theType} to ensure that it is a
138 well-defined type. This is useful for extension types, where it's
139 pretty easy to do something wacky. If something about the type is
140 unusual, an exception will be raised.
142 @param theType: The type object about which to make assertions.
143 @param name: A string giving the name of the type.
144 @param constructionArgs: Positional arguments to use with C{theType} to
145 create an instance of it.
147 self.assertEqual(theType.__name__, name)
148 self.assertTrue(isinstance(theType, type))
149 instance = theType(*constructionArgs)
150 self.assertIdentical(type(instance), theType)