blob: f6e9291980e2036ad251221908cd7cd6f28281c3 [file] [log] [blame]
Jean-Paul Calderone8671c852011-03-02 19:26:20 -05001# Copyright (C) Jean-Paul Calderone
2# Copyright (C) Twisted Matrix Laboratories.
Jean-Paul Calderone0ef63ed2009-07-05 13:05:45 -04003# See LICENSE for details.
4
5"""
6Helpers for the OpenSSL test suite, largely copied from
7U{Twisted<http://twistedmatrix.com/>}.
8"""
9
10import shutil
11import os, os.path
12from tempfile import mktemp
13from unittest import TestCase
Rick Dean47262da2009-07-08 16:17:17 -050014import sys
Jean-Paul Calderone0ef63ed2009-07-05 13:05:45 -040015
Jean-Paul Calderone88f38b22009-07-16 16:25:19 -040016from OpenSSL.crypto import Error, _exception_from_error_queue
17
Jean-Paul Calderoneea9c8a32011-04-01 18:26:37 -040018if sys.version_info < (3, 0):
Jean-Paul Calderone9e4eeae2010-08-22 21:32:52 -040019 def b(s):
20 return s
21 bytes = str
22else:
23 def b(s):
Jean-Paul Calderone77769602011-04-06 18:20:10 -040024 return s.encode("charmap")
Jean-Paul Calderoneea9c8a32011-04-01 18:26:37 -040025 bytes = bytes
Jean-Paul Calderone9e4eeae2010-08-22 21:32:52 -040026
27
Jean-Paul Calderone0ef63ed2009-07-05 13:05:45 -040028class TestCase(TestCase):
29 """
30 L{TestCase} adds useful testing functionality beyond what is available
31 from the standard library L{unittest.TestCase}.
32 """
33 def tearDown(self):
34 """
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.
38 """
Jean-Paul Calderonebf37f0f2010-07-31 14:56:20 -040039 if False and self._temporaryFiles is not None:
Jean-Paul Calderone0ef63ed2009-07-05 13:05:45 -040040 for temp in self._temporaryFiles:
41 if os.path.isdir(temp):
42 shutil.rmtree(temp)
43 elif os.path.exists(temp):
44 os.unlink(temp)
Jean-Paul Calderone1206daf2009-07-16 16:07:42 -040045 try:
46 _exception_from_error_queue()
Jean-Paul Calderone24b64592010-08-12 10:43:09 -040047 except Error:
48 e = sys.exc_info()[1]
Jean-Paul Calderone1206daf2009-07-16 16:07:42 -040049 if e.args != ([],):
50 self.fail("Left over errors in OpenSSL error queue: " + repr(e))
51
Jean-Paul Calderone0ef63ed2009-07-05 13:05:45 -040052
53 def failUnlessIdentical(self, first, second, msg=None):
54 """
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.
58
59 @param msg: if msg is None, then the failure message will be
60 '%r is not %r' % (first, second)
61 """
62 if first is not second:
63 raise self.failureException(msg or '%r is not %r' % (first, second))
64 return first
65 assertIdentical = failUnlessIdentical
66
67
68 def failIfIdentical(self, first, second, msg=None):
69 """
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.
73
74 @param msg: if msg is None, then the failure message will be
75 '%r is %r' % (first, second)
76 """
77 if first is second:
78 raise self.failureException(msg or '%r is %r' % (first, second))
79 return first
80 assertNotIdentical = failIfIdentical
81
82
83 def failUnlessRaises(self, exception, f, *args, **kwargs):
84 """
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.
88
89 @param exception: exception type that is to be expected
90 @param f: the function to call
91
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
95 different type.
96 """
97 try:
98 result = f(*args, **kwargs)
Jean-Paul Calderone24b64592010-08-12 10:43:09 -040099 except exception:
100 inst = sys.exc_info()[1]
Jean-Paul Calderone0ef63ed2009-07-05 13:05:45 -0400101 return inst
102 except:
Rick Dean47262da2009-07-08 16:17:17 -0500103 raise self.failureException('%s raised instead of %s'
Jean-Paul Calderone0ef63ed2009-07-05 13:05:45 -0400104 % (sys.exc_info()[0],
105 exception.__name__,
Rick Dean47262da2009-07-08 16:17:17 -0500106 ))
Jean-Paul Calderone0ef63ed2009-07-05 13:05:45 -0400107 else:
108 raise self.failureException('%s not raised (%r returned)'
109 % (exception.__name__, result))
110 assertRaises = failUnlessRaises
111
112
113 _temporaryFiles = None
114 def mktemp(self):
115 """
116 Pathetic substitute for twisted.trial.unittest.TestCase.mktemp.
117 """
118 if self._temporaryFiles is None:
119 self._temporaryFiles = []
120 temp = mktemp(dir=".")
121 self._temporaryFiles.append(temp)
122 return temp
123
124
125 # Python 2.3 compatibility.
126 def assertTrue(self, *a, **kw):
127 return self.failUnless(*a, **kw)
128
129
130 def assertFalse(self, *a, **kw):
131 return self.failIf(*a, **kw)
Jean-Paul Calderone68649052009-07-17 21:14:27 -0400132
133
134 # Other stuff
135 def assertConsistentType(self, theType, name, *constructionArgs):
136 """
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.
141
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.
146 """
147 self.assertEqual(theType.__name__, name)
148 self.assertTrue(isinstance(theType, type))
149 instance = theType(*constructionArgs)
150 self.assertIdentical(type(instance), theType)