Author: Ronan Lamy <ronan.l...@gmail.com> Branch: py3k Changeset: r85134:8028f6e5a9c9 Date: 2016-06-13 16:35 +0100 http://bitbucket.org/pypy/pypy/changeset/8028f6e5a9c9/
Log: Merge branch 'testing-cleanup-py3k' diff --git a/pypy/conftest.py b/pypy/conftest.py --- a/pypy/conftest.py +++ b/pypy/conftest.py @@ -94,6 +94,20 @@ def pytest_pycollect_makemodule(path, parent): return PyPyModule(path, parent) +def is_applevel(item): + from pypy.tool.pytest.apptest import AppTestFunction + return isinstance(item, AppTestFunction) + +def pytest_collection_modifyitems(config, items): + if config.option.runappdirect: + return + for item in items: + if isinstance(item, py.test.Function): + if is_applevel(item): + item.add_marker('applevel') + else: + item.add_marker('interplevel') + class PyPyModule(py.test.collect.Module): """ we take care of collecting classes both at app level and at interp-level (because we need to stick a space @@ -128,9 +142,6 @@ if name.startswith('AppTest'): from pypy.tool.pytest.apptest import AppClassCollector return AppClassCollector(name, parent=self) - else: - from pypy.tool.pytest.inttest import IntClassCollector - return IntClassCollector(name, parent=self) elif hasattr(obj, 'func_code') and self.funcnamefilter(name): if name.startswith('app_test_'): @@ -138,11 +149,7 @@ "generator app level functions? you must be joking" from pypy.tool.pytest.apptest import AppTestFunction return AppTestFunction(name, parent=self) - elif obj.func_code.co_flags & 32: # generator function - return pytest.Generator(name, parent=self) - else: - from pypy.tool.pytest.inttest import IntTestFunction - return IntTestFunction(name, parent=self) + return super(PyPyModule, self).makeitem(name, obj) def skip_on_missing_buildoption(**ropts): __tracebackhide__ = True @@ -171,28 +178,19 @@ def pytest_runtest_setup(__multicall__, item): if isinstance(item, py.test.collect.Function): - appclass = item.getparent(PyPyClassCollector) + appclass = item.getparent(py.test.Class) if appclass is not None: # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', None) if spaceconfig is not None: from pypy.tool.pytest.objspace import gettestobjspace appclass.obj.space = gettestobjspace(**spaceconfig) + else: + appclass.obj.space = LazyObjSpaceGetter() appclass.obj.runappdirect = option.runappdirect __multicall__.execute() -class PyPyClassCollector(py.test.collect.Class): - # All pypy Test classes have a "space" member. - def setup(self): - cls = self.obj - if not hasattr(cls, 'spaceconfig'): - cls.space = LazyObjSpaceGetter() - else: - assert hasattr(cls, 'space') # set by pytest_runtest_setup - super(PyPyClassCollector, self).setup() - - def pytest_ignore_collect(path): return path.check(link=1) diff --git a/pypy/interpreter/astcompiler/test/test_compiler.py b/pypy/interpreter/astcompiler/test/test_compiler.py --- a/pypy/interpreter/astcompiler/test/test_compiler.py +++ b/pypy/interpreter/astcompiler/test/test_compiler.py @@ -965,7 +965,20 @@ """ self.simple_test(source, 'ok', 1) - def test_remove_docstring(self): + @py.test.mark.parametrize('expr, result', [ + ("f1.__doc__", None), + ("f2.__doc__", 'docstring'), + ("f2()", 'docstring'), + ("f3.__doc__", None), + ("f3()", 'bar'), + ("C1.__doc__", None), + ("C2.__doc__", 'docstring'), + ("C3.field", 'not docstring'), + ("C4.field", 'docstring'), + ("C4.__doc__", 'docstring'), + ("C4.__doc__", 'docstring'), + ("__doc__", None),]) + def test_remove_docstring(self, expr, result): source = '"module_docstring"\n' + """if 1: def f1(): 'docstring' @@ -989,19 +1002,7 @@ code_w.remove_docstrings(self.space) dict_w = self.space.newdict(); code_w.exec_code(self.space, dict_w, dict_w) - - yield self.check, dict_w, "f1.__doc__", None - yield self.check, dict_w, "f2.__doc__", 'docstring' - yield self.check, dict_w, "f2()", 'docstring' - yield self.check, dict_w, "f3.__doc__", None - yield self.check, dict_w, "f3()", 'bar' - yield self.check, dict_w, "C1.__doc__", None - yield self.check, dict_w, "C2.__doc__", 'docstring' - yield self.check, dict_w, "C3.field", 'not docstring' - yield self.check, dict_w, "C4.field", 'docstring' - yield self.check, dict_w, "C4.__doc__", 'docstring' - yield self.check, dict_w, "C4.__doc__", 'docstring' - yield self.check, dict_w, "__doc__", None + self.check(dict_w, expr, result) def test_assert_skipping(self): space = self.space diff --git a/pypy/module/_socket/test/test_sock_app.py b/pypy/module/_socket/test/test_sock_app.py --- a/pypy/module/_socket/test/test_sock_app.py +++ b/pypy/module/_socket/test/test_sock_app.py @@ -694,13 +694,11 @@ class AppTestSocketTCP: HOST = 'localhost' - - def setup_class(cls): - cls.space = space + spaceconfig = {'usemodules': ['_socket', 'array']} def setup_method(self, method): - w_HOST = space.wrap(self.HOST) - self.w_serv = space.appexec([w_HOST], + w_HOST = self.space.wrap(self.HOST) + self.w_serv = self.space.appexec([w_HOST], '''(HOST): import _socket serv = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM) @@ -711,7 +709,7 @@ def teardown_method(self, method): if hasattr(self, 'w_serv'): - space.appexec([self.w_serv], '(serv): serv.close()') + self.space.appexec([self.w_serv], '(serv): serv.close()') self.w_serv = None def test_timeout(self): @@ -830,8 +828,7 @@ class AppTestErrno: - def setup_class(cls): - cls.space = space + spaceconfig = {'usemodules': ['_socket']} def test_errno(self): from socket import socket, AF_INET, SOCK_STREAM, error diff --git a/pypy/module/_vmprof/test/test__vmprof.py b/pypy/module/_vmprof/test/test__vmprof.py --- a/pypy/module/_vmprof/test/test__vmprof.py +++ b/pypy/module/_vmprof/test/test__vmprof.py @@ -3,8 +3,9 @@ from pypy.tool.pytest.objspace import gettestobjspace class AppTestVMProf(object): + spaceconfig = {'usemodules': ['_vmprof', 'struct']} + def setup_class(cls): - cls.space = gettestobjspace(usemodules=['_vmprof', 'struct']) cls.w_tmpfilename = cls.space.wrap(str(udir.join('test__vmprof.1'))) cls.w_tmpfilename2 = cls.space.wrap(str(udir.join('test__vmprof.2'))) @@ -17,7 +18,7 @@ import struct, sys, gc WORD = struct.calcsize('l') - + def count(s): i = 0 count = 0 @@ -44,7 +45,7 @@ else: raise AssertionError(s[i]) return count - + import _vmprof gc.collect() # try to make the weakref list deterministic gc.collect() # by freeing all dead code objects diff --git a/pypy/module/posix/test/test_posix2.py b/pypy/module/posix/test/test_posix2.py --- a/pypy/module/posix/test/test_posix2.py +++ b/pypy/module/posix/test/test_posix2.py @@ -10,15 +10,15 @@ from rpython.translator.c.test.test_extfunc import need_sparse_files from rpython.rlib import rposix +USEMODULES = ['binascii', 'posix', 'signal', 'struct', 'time'] +# py3k os.open uses subprocess, requiring the following per platform +if os.name != 'nt': + USEMODULES += ['fcntl', 'select', '_posixsubprocess'] +else: + USEMODULES += ['_rawffi', 'thread'] def setup_module(mod): - usemodules = ['binascii', 'posix', 'signal', 'struct', 'time'] - # py3k os.open uses subprocess, requiring the following per platform - if os.name != 'nt': - usemodules += ['fcntl', 'select', '_posixsubprocess'] - else: - usemodules += ['_rawffi', 'thread'] - mod.space = gettestobjspace(usemodules=usemodules) + mod.space = gettestobjspace(usemodules=USEMODULES) mod.path = udir.join('posixtestfile.txt') mod.path.write("this is a test") mod.path2 = udir.join('test_posix2-') @@ -48,9 +48,10 @@ class AppTestPosix: + spaceconfig = {'usemodules': USEMODULES} def setup_class(cls): - cls.space = space + space = cls.space cls.w_runappdirect = space.wrap(cls.runappdirect) cls.w_posix = space.appexec([], GET_POSIX) cls.w_os = space.appexec([], "(): import os as m ; return m") @@ -1128,14 +1129,11 @@ class AppTestEnvironment(object): def setup_class(cls): - cls.space = space - cls.w_posix = space.appexec([], "(): import %s as m ; return m" % os.name) - cls.w_os = space.appexec([], "(): import os; return os") cls.w_path = space.wrap(str(path)) def test_environ(self): - import sys - environ = self.posix.environ + import sys, posix + environ = posix.environ item_type = str if sys.platform.startswith('win') else bytes for k, v in environ.items(): assert type(k) is item_type @@ -1147,7 +1145,7 @@ @py.test.mark.dont_track_allocations('putenv intentionally keeps strings alive') def test_environ_nonascii(self): - import sys + import sys, os name, value = 'PYPY_TEST_日本', 'foobar日本' if not sys.platform == 'win32': fsencoding = sys.getfilesystemencoding() @@ -1158,7 +1156,6 @@ skip("Requires %s.encode(sys.getfilesystemencoding(), " "'surogateescape') to succeed (or win32)" % ascii(s)) - os = self.os os.environ[name] = value assert os.environ[name] == value assert os.getenv(name) == value @@ -1168,7 +1165,7 @@ if hasattr(__import__(os.name), "unsetenv"): def test_unsetenv_nonexisting(self): - os = self.os + import os os.unsetenv("XYZABC") #does not raise try: os.environ["ABCABC"] @@ -1183,45 +1180,40 @@ res = os.system(cmd) assert res == 0 +@py.test.fixture +def check_fsencoding(space, pytestconfig): + if pytestconfig.getvalue('runappdirect'): + fsencoding = sys.getfilesystemencoding() + else: + fsencoding = space.sys.filesystemencoding + try: + u"ą".encode(fsencoding) + except UnicodeEncodeError: + py.test.skip("encoding not good enough") +@py.test.mark.usefixtures('check_fsencoding') class AppTestPosixUnicode: - def setup_class(cls): - cls.space = space - cls.w_posix = space.appexec([], GET_POSIX) - if cls.runappdirect: - # Can't change encoding - try: - u"ą".encode(sys.getfilesystemencoding()) - except UnicodeEncodeError: - py.test.skip("encoding not good enough") - else: - cls.save_fs_encoding = space.sys.filesystemencoding - space.sys.filesystemencoding = "utf-8" - - def teardown_class(cls): - try: - cls.space.sys.filesystemencoding = cls.save_fs_encoding - except AttributeError: - pass - def test_stat_unicode(self): # test that passing unicode would not raise UnicodeDecodeError + import posix try: - self.posix.stat("ą") + posix.stat(u"ą") except OSError: pass def test_open_unicode(self): # Ensure passing unicode doesn't raise UnicodeEncodeError + import posix try: - self.posix.open("ą", self.posix.O_WRONLY) + posix.open(u"ą", posix.O_WRONLY) except OSError: pass def test_remove_unicode(self): # See 2 above ;) + import posix try: - self.posix.remove("ą") + posix.remove(u"ą") except OSError: pass diff --git a/pypy/tool/pytest/apptest.py b/pypy/tool/pytest/apptest.py --- a/pypy/tool/pytest/apptest.py +++ b/pypy/tool/pytest/apptest.py @@ -17,7 +17,6 @@ from pypy.tool.pytest.objspace import gettestobjspace from rpython.tool.udir import udir from pypy import pypydir -from pypy.conftest import PyPyClassCollector from inspect import getmro pypyroot = os.path.dirname(pypydir) @@ -33,7 +32,6 @@ def __init__(self, excinfo): self.excinfo = excinfo -marker = py.test.mark.applevel def py3k_repr(value): "return the repr() that py3k would give for an object.""" @@ -199,10 +197,6 @@ class AppTestFunction(py.test.collect.Function): - def __init__(self, *args, **kwargs): - super(AppTestFunction, self).__init__(*args, **kwargs) - self._request.applymarker(marker) - def _prunetraceback(self, traceback): return traceback @@ -303,7 +297,7 @@ self.w_instance = space.call_function(w_class) -class AppClassCollector(PyPyClassCollector): +class AppClassCollector(py.test.Class): Instance = AppClassInstance def setup(self): diff --git a/pypy/tool/pytest/inttest.py b/pypy/tool/pytest/inttest.py deleted file mode 100644 --- a/pypy/tool/pytest/inttest.py +++ /dev/null @@ -1,52 +0,0 @@ -# Collects and executes interpreter-level tests. -# -# Most pypy tests are of this kind. - -import py -import sys -from pypy.interpreter.error import OperationError -from pypy.conftest import PyPyClassCollector - - -def check_keyboard_interrupt(e): - # we cannot easily convert w_KeyboardInterrupt to KeyboardInterrupt - # in general without a space -- here is an approximation - try: - if e.w_type.name == 'KeyboardInterrupt': - tb = sys.exc_info()[2] - raise KeyboardInterrupt, KeyboardInterrupt(), tb - except AttributeError: - pass - - -marker = py.test.mark.interplevel - - -class IntTestFunction(py.test.collect.Function): - def __init__(self, *args, **kwargs): - super(IntTestFunction, self).__init__(*args, **kwargs) - self._request.applymarker(marker) - - def runtest(self): - try: - super(IntTestFunction, self).runtest() - except OperationError as e: - check_keyboard_interrupt(e) - raise - except Exception as e: - cls = e.__class__ - while cls is not Exception: - if cls.__name__ == 'DistutilsPlatformError': - from distutils.errors import DistutilsPlatformError - if isinstance(e, DistutilsPlatformError): - py.test.skip('%s: %s' % (e.__class__.__name__, e)) - cls = cls.__bases__[0] - raise - - -class IntInstanceCollector(py.test.collect.Instance): - Function = IntTestFunction - - -class IntClassCollector(PyPyClassCollector): - Instance = IntInstanceCollector diff --git a/pypy/tool/pytest/test/test_appsupport.py b/pypy/tool/pytest/test/test_appsupport.py --- a/pypy/tool/pytest/test/test_appsupport.py +++ b/pypy/tool/pytest/test/test_appsupport.py @@ -27,11 +27,11 @@ result = testdir.runpytest("--collectonly") assert result.ret == 0 result.stdout.fnmatch_lines([ - "*IntTestFunction*test_func*", - "*IntClassCollector*TestClassInt*", - "*IntTestFunction*test_method*", + "*Function*test_func*", + "*Class*TestClassInt*", + "*Function*test_method*", "*AppClassCollector*AppTestClass*", - "*AppTestMethod*", + "*AppTestMethod*", ]) class TestSpaceConfig: @@ -133,5 +133,5 @@ x = 43 info = raises(ZeroDivisionError, "x/0") - assert info.type is ZeroDivisionError - assert isinstance(info.value, ZeroDivisionError) + assert info.type is ZeroDivisionError + assert isinstance(info.value, ZeroDivisionError) diff --git a/pypy/tool/pytest/test/test_conftest1.py b/pypy/tool/pytest/test/test_conftest1.py --- a/pypy/tool/pytest/test/test_conftest1.py +++ b/pypy/tool/pytest/test/test_conftest1.py @@ -22,15 +22,6 @@ assert len(failed) == 2 assert "app_test_something" in passed[0].nodeid assert "test_method_app" in passed[1].nodeid - - def test_runappdirect(self, testdir): - sorter = testdir.inline_run(innertest, '-m', 'applevel -docstring', - '--runappdirect') - passed, skipped, failed = sorter.listoutcomes() - assert len(passed) == 4 - print passed - assert "app_test_something" in passed[0].nodeid - assert "test_method_app" in passed[1].nodeid def test_docstring_in_methods(self, testdir): sorter = testdir.inline_run("-k", "AppTestSomething and test_code_in_docstring", _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit