12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- """
- Self testing module
- ===================
- The selftest() function runs a small test suite of relatively fast tests that are meant to discover issues
- with the way Borg was compiled or packaged and also bugs in Borg itself.
- Theses tests are a subset of the borg/testsuite and are run with Pythons built-in unittest, hence none of
- the tests used for this can or should be ported to py.test currently.
- To assert that self test discovery works correctly the number of tests is kept in the SELFTEST_COUNT
- variable. SELFTEST_COUNT must be updated if new tests are added or removed to or from any of the tests
- used here.
- """
- import sys
- import time
- from unittest import TestResult, TestSuite, defaultTestLoader
- from .testsuite.hashindex import HashIndexDataTestCase, HashIndexRefcountingTestCase, HashIndexTestCase
- from .testsuite.crypto import CryptoTestCase
- from .testsuite.chunker import ChunkerTestCase
- SELFTEST_CASES = [
- HashIndexDataTestCase,
- HashIndexRefcountingTestCase,
- HashIndexTestCase,
- CryptoTestCase,
- ChunkerTestCase,
- ]
- SELFTEST_COUNT = 27
- class SelfTestResult(TestResult):
- def __init__(self):
- super().__init__()
- self.successes = []
- def addSuccess(self, test):
- super().addSuccess(test)
- self.successes.append(test)
- def test_name(self, test):
- return test.shortDescription() or str(test)
- def log_results(self, logger):
- for test, failure in self.errors + self.failures + self.unexpectedSuccesses:
- logger.error('self test %s FAILED:\n%s', self.test_name(test), failure)
- for test, reason in self.skipped:
- logger.warning('self test %s skipped: %s', self.test_name(test), reason)
- def successful_test_count(self):
- return len(self.successes)
- def selftest(logger):
- selftest_started = time.perf_counter()
- result = SelfTestResult()
- test_suite = TestSuite()
- for test_case in SELFTEST_CASES:
- test_suite.addTest(defaultTestLoader.loadTestsFromTestCase(test_case))
- test_suite.run(result)
- result.log_results(logger)
- successful_tests = result.successful_test_count()
- count_mismatch = successful_tests != SELFTEST_COUNT
- if result.wasSuccessful() and count_mismatch:
- # only print this if all tests succeeded
- logger.error("self test count (%d != %d) mismatch, either test discovery is broken or a test was added "
- "without updating borg.selftest",
- successful_tests, SELFTEST_COUNT)
- if not result.wasSuccessful() or count_mismatch:
- logger.error("self test failed\n"
- "This is a bug either in Borg or in the package / distribution you use.")
- sys.exit(2)
- assert False, "sanity assertion failed: ran beyond sys.exit()"
- selftest_elapsed = time.perf_counter() - selftest_started
- logger.debug("%d self tests completed in %.2f seconds", successful_tests, selftest_elapsed)
|