|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""Self tests |
|
|
|
|
|
These tests should perform quickly and can ideally be used every time an |
|
|
application runs. |
|
|
""" |
|
|
|
|
|
__revision__ = "$Id$" |
|
|
|
|
|
import sys |
|
|
import unittest |
|
|
from Crypto.Util.py3compat import StringIO |
|
|
|
|
|
class SelfTestError(Exception): |
|
|
def __init__(self, message, result): |
|
|
Exception.__init__(self, message, result) |
|
|
self.message = message |
|
|
self.result = result |
|
|
|
|
|
def run(module=None, verbosity=0, stream=None, tests=None, config=None, **kwargs): |
|
|
"""Execute self-tests. |
|
|
|
|
|
This raises SelfTestError if any test is unsuccessful. |
|
|
|
|
|
You may optionally pass in a sub-module of SelfTest if you only want to |
|
|
perform some of the tests. For example, the following would test only the |
|
|
hash modules: |
|
|
|
|
|
Crypto.SelfTest.run(Crypto.SelfTest.Hash) |
|
|
|
|
|
""" |
|
|
|
|
|
if config is None: |
|
|
config = {} |
|
|
suite = unittest.TestSuite() |
|
|
if module is None: |
|
|
if tests is None: |
|
|
tests = get_tests(config=config) |
|
|
suite.addTests(tests) |
|
|
else: |
|
|
if tests is None: |
|
|
suite.addTests(module.get_tests(config=config)) |
|
|
else: |
|
|
raise ValueError("'module' and 'tests' arguments are mutually exclusive") |
|
|
if stream is None: |
|
|
kwargs['stream'] = StringIO() |
|
|
else: |
|
|
kwargs['stream'] = stream |
|
|
runner = unittest.TextTestRunner(verbosity=verbosity, **kwargs) |
|
|
result = runner.run(suite) |
|
|
if not result.wasSuccessful(): |
|
|
if stream is None: |
|
|
sys.stderr.write(kwargs['stream'].getvalue()) |
|
|
raise SelfTestError("Self-test failed", result) |
|
|
return result |
|
|
|
|
|
def get_tests(config={}): |
|
|
tests = [] |
|
|
from Crypto.SelfTest import Cipher; tests += Cipher.get_tests(config=config) |
|
|
from Crypto.SelfTest import Hash; tests += Hash.get_tests(config=config) |
|
|
from Crypto.SelfTest import Protocol; tests += Protocol.get_tests(config=config) |
|
|
from Crypto.SelfTest import PublicKey; tests += PublicKey.get_tests(config=config) |
|
|
from Crypto.SelfTest import Random; tests += Random.get_tests(config=config) |
|
|
from Crypto.SelfTest import Util; tests += Util.get_tests(config=config) |
|
|
from Crypto.SelfTest import Signature; tests += Signature.get_tests(config=config) |
|
|
from Crypto.SelfTest import IO; tests += IO.get_tests(config=config) |
|
|
from Crypto.SelfTest import Math; tests += Math.get_tests(config=config) |
|
|
return tests |
|
|
|
|
|
if __name__ == '__main__': |
|
|
suite = lambda: unittest.TestSuite(get_tests()) |
|
|
unittest.main(defaultTest='suite') |
|
|
|
|
|
|
|
|
|