tahoe-lafs/src/allmydata/test/test_python2_regressions.py
2020-02-13 10:43:50 -05:00

68 lines
1.7 KiB
Python

"""
Tests to check for Python2 regressions
"""
from inspect import isclass
from twisted.python.modules import getModule
from testtools import (
TestCase,
)
from testtools.matchers import (
Equals,
)
BLACKLIST = {
"allmydata.test.check_load",
"allmydata.windows.registry",
}
def is_new_style(cls):
"""
:return bool: ``True`` if and only if the given class is "new style".
"""
# All new-style classes are instances of type. By definition.
return isinstance(cls, type)
def defined_here(cls, where):
"""
:return bool: ``True`` if and only if the given class was defined in a
module with the given name.
:note: Classes can lie about where they are defined. Try not to do that.
"""
return cls.__module__ == where
class PythonTwoRegressions(TestCase):
"""
Regression tests for Python 2 behaviors related to Python 3 porting.
"""
def test_new_style_classes(self):
"""
All classes in Tahoe-LAFS are new-style.
"""
newstyle = set()
classic = set()
for mod in getModule("allmydata").walkModules():
if mod.name in BLACKLIST:
continue
# iterAttributes will only work on loaded modules. So, load it.
mod.load()
for attr in mod.iterAttributes():
value = attr.load()
if isclass(value) and defined_here(value, mod.name):
if is_new_style(value):
newstyle.add(value)
else:
classic.add(value)
self.assertThat(
classic,
Equals(set()),
"Expected to find no classic classes.",
)