123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- # Copyright (c) Twisted Matrix Laboratories.
- # See LICENSE for details.
- #
-
- """
- Classes and functions used by L{twisted.trial.test.test_util}
- and L{twisted.trial.test.test_loader}.
- """
-
-
- import os
- import sys
-
- # Python 3 has some funny import caching, which we don't want.
- # invalidate_caches clears it out for us.
- from importlib import invalidate_caches as invalidateImportCaches
-
- from twisted.trial import unittest
-
- testModule = """
- from twisted.trial import unittest
-
- class FooTest(unittest.SynchronousTestCase):
- def testFoo(self):
- pass
- """
-
- dosModule = testModule.replace("\n", "\r\n")
-
-
- testSample = """
- '''This module is used by test_loader to test the Trial test loading
- functionality. Do NOT change the number of tests in this module.
- Do NOT change the names the tests in this module.
- '''
-
- import unittest as pyunit
- from twisted.trial import unittest
-
- class FooTest(unittest.SynchronousTestCase):
- def test_foo(self):
- pass
-
- def test_bar(self):
- pass
-
-
- class PyunitTest(pyunit.TestCase):
- def test_foo(self):
- pass
-
- def test_bar(self):
- pass
-
-
- class NotATest:
- def test_foo(self):
- pass
-
-
- class AlphabetTest(unittest.SynchronousTestCase):
- def test_a(self):
- pass
-
- def test_b(self):
- pass
-
- def test_c(self):
- pass
- """
-
- testInheritanceSample = """
- '''This module is used by test_loader to test the Trial test loading
- functionality. Do NOT change the number of tests in this module.
- Do NOT change the names the tests in this module.
- '''
-
- from twisted.trial import unittest
-
- class X:
-
- def test_foo(self):
- pass
-
- class A(unittest.SynchronousTestCase, X):
- pass
-
- class B(unittest.SynchronousTestCase, X):
- pass
-
- """
-
-
- class PackageTest(unittest.SynchronousTestCase):
- files = [
- ("badpackage/__init__.py", "frotz\n"),
- ("badpackage/test_module.py", ""),
- ("unimportablepackage/__init__.py", ""),
- ("unimportablepackage/test_module.py", "import notarealmoduleok\n"),
- ("package2/__init__.py", ""),
- ("package2/test_module.py", "import frotz\n"),
- ("package/__init__.py", ""),
- ("package/frotz.py", "frotz\n"),
- ("package/test_bad_module.py", 'raise ZeroDivisionError("fake error")'),
- ("package/test_dos_module.py", dosModule),
- ("package/test_import_module.py", "import frotz"),
- ("package/test_module.py", testModule),
- ("goodpackage/__init__.py", ""),
- ("goodpackage/test_sample.py", testSample),
- ("goodpackage/sub/__init__.py", ""),
- ("goodpackage/sub/test_sample.py", testSample),
- ("inheritancepackage/__init__.py", ""),
- ("inheritancepackage/test_x.py", testInheritanceSample),
- ]
-
- def _toModuleName(self, filename):
- name = os.path.splitext(filename)[0]
- segs = name.split("/")
- if segs[-1] == "__init__":
- segs = segs[:-1]
- return ".".join(segs)
-
- def getModules(self):
- """
- Return matching module names for files listed in C{self.files}.
- """
- return [self._toModuleName(filename) for (filename, code) in self.files]
-
- def cleanUpModules(self):
- modules = self.getModules()
- modules.sort()
- modules.reverse()
- for module in modules:
- try:
- del sys.modules[module]
- except KeyError:
- pass
-
- def createFiles(self, files, parentDir="."):
- for filename, contents in self.files:
- filename = os.path.join(parentDir, filename)
- self._createDirectory(filename)
- with open(filename, "w") as fd:
- fd.write(contents)
-
- def _createDirectory(self, filename):
- directory = os.path.dirname(filename)
- if not os.path.exists(directory):
- os.makedirs(directory)
-
- def setUp(self, parentDir=None):
- invalidateImportCaches()
- if parentDir is None:
- parentDir = self.mktemp()
- self.parent = parentDir
- self.createFiles(self.files, parentDir)
-
- def tearDown(self):
- self.cleanUpModules()
-
-
- class SysPathManglingTest(PackageTest):
- def setUp(self, parent=None):
- invalidateImportCaches()
- self.oldPath = sys.path[:]
- self.newPath = sys.path[:]
- if parent is None:
- parent = self.mktemp()
- PackageTest.setUp(self, parent)
- self.newPath.append(self.parent)
- self.mangleSysPath(self.newPath)
-
- def tearDown(self):
- PackageTest.tearDown(self)
- self.mangleSysPath(self.oldPath)
-
- def mangleSysPath(self, pathVar):
- sys.path[:] = pathVar
|