Author: Ronan Lamy <[email protected]>
Branch: cleanup-test_lib_pypy
Changeset: r95439:9bf67667765c
Date: 2018-12-08 06:38 +0000
http://bitbucket.org/pypy/pypy/changeset/9bf67667765c/
Log: Use a fixture to inject the test dll; random cleanups
diff --git a/pypy/module/test_lib_pypy/ctypes_tests/conftest.py
b/pypy/module/test_lib_pypy/ctypes_tests/conftest.py
--- a/pypy/module/test_lib_pypy/ctypes_tests/conftest.py
+++ b/pypy/module/test_lib_pypy/ctypes_tests/conftest.py
@@ -96,8 +96,11 @@
return c_compile([cfile], str(udir / '_ctypes_test'), libraries=libraries)
-# we need to run after the "tmpdir" plugin which installs pytest.ensuretemp
[email protected]
-def pytest_configure(config):
- global sofile
- sofile = compile_so_file()
[email protected](scope='session')
+def sofile():
+ return str(compile_so_file())
+
[email protected]
+def dll(sofile):
+ from ctypes import CDLL
+ return CDLL(str(sofile))
diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_callbacks.py
b/pypy/module/test_lib_pypy/ctypes_tests/test_callbacks.py
--- a/pypy/module/test_lib_pypy/ctypes_tests/test_callbacks.py
+++ b/pypy/module/test_lib_pypy/ctypes_tests/test_callbacks.py
@@ -145,11 +145,7 @@
assert res == 1111
assert rect.left == -1000 # must not have been changed!
- def test_callback_from_c_with_struct_argument(self):
- import conftest
- _ctypes_test = str(conftest.sofile)
- dll = CDLL(_ctypes_test)
-
+ def test_callback_from_c_with_struct_argument(self, dll):
class RECT(Structure):
_fields_ = [("left", c_long), ("top", c_long),
("right", c_long), ("bottom", c_long)]
@@ -177,11 +173,7 @@
proto(lambda r: 0)
- def test_qsort(self):
- import conftest
- _ctypes_test = str(conftest.sofile)
- dll = CDLL(_ctypes_test)
-
+ def test_qsort(self, dll):
PI = POINTER(c_int)
A = c_int*5
a = A()
@@ -205,11 +197,7 @@
assert res == [1,2,3,4,5]
- def test_pyobject_as_opaque(self):
- import conftest
- _ctypes_test = str(conftest.sofile)
- dll = CDLL(_ctypes_test)
-
+ def test_pyobject_as_opaque(self, dll):
def callback(arg):
return arg()
@@ -220,11 +208,7 @@
res = cfunc(CTP(callback), lambda : 3)
assert res == 3
- def test_callback_void(self, capsys):
- import conftest
- _ctypes_test = str(conftest.sofile)
- dll = CDLL(_ctypes_test)
-
+ def test_callback_void(self, capsys, dll):
def callback():
pass
diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_cast.py
b/pypy/module/test_lib_pypy/ctypes_tests/test_cast.py
--- a/pypy/module/test_lib_pypy/ctypes_tests/test_cast.py
+++ b/pypy/module/test_lib_pypy/ctypes_tests/test_cast.py
@@ -2,15 +2,11 @@
import sys, py
from .support import BaseCTypesTestChecker
-def setup_module(mod):
- import conftest
- mod.lib = CDLL(str(conftest.sofile))
-
class TestCast(BaseCTypesTestChecker):
- def test_cast_functype(self):
+ def test_cast_functype(self, dll):
# make sure we can cast function type
- my_sqrt = lib.my_sqrt
+ my_sqrt = dll.my_sqrt
saved_objects = my_sqrt._objects.copy()
sqrt = cast(cast(my_sqrt, c_void_p), CFUNCTYPE(c_double, c_double))
assert sqrt(4.0) == 2.0
diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_checkretval.py
b/pypy/module/test_lib_pypy/ctypes_tests/test_checkretval.py
deleted file mode 100644
--- a/pypy/module/test_lib_pypy/ctypes_tests/test_checkretval.py
+++ /dev/null
@@ -1,37 +0,0 @@
-import pytest
-import sys
-
-from ctypes import *
-
-def setup_module(mod):
- import conftest
- mod.dll = CDLL(str(conftest.sofile))
-
-class CHECKED(c_int):
- def _check_retval_(value):
- # Receives a CHECKED instance.
- return str(value.value)
- _check_retval_ = staticmethod(_check_retval_)
-
-class TestRetval:
-
- def test_checkretval(self):
- assert 42 == dll._testfunc_p_p(42)
-
- dll._testfunc_p_p.restype = CHECKED
- assert "42" == dll._testfunc_p_p(42)
-
- dll._testfunc_p_p.restype = None
- assert None == dll._testfunc_p_p(42)
-
- del dll._testfunc_p_p.restype
- assert 42 == dll._testfunc_p_p(42)
-
- try:
- oledll
- except NameError:
- pass
- else:
- def test_oledll(self):
- with pytest.raises(WindowsError):
- oledll.oleaut32.CreateTypeLib2(0, 0, 0)
diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_errno.py
b/pypy/module/test_lib_pypy/ctypes_tests/test_errno.py
--- a/pypy/module/test_lib_pypy/ctypes_tests/test_errno.py
+++ b/pypy/module/test_lib_pypy/ctypes_tests/test_errno.py
@@ -1,12 +1,7 @@
-import py
+import pytest
import ctypes
-from _ctypes import function
-
-try:
- import _rawffi
-except ImportError:
- py.test.skip("app-level test only for PyPy")
+_rawffi = pytest.importorskip('_rawffi') # PyPy-only
class TestErrno:
@@ -15,7 +10,7 @@
assert _rawffi.get_errno() == 42
assert ctypes.get_errno() == old
check.free_temp_buffers = lambda *args: None
- f = function.CFuncPtr()
+ f = ctypes._CFuncPtr()
old = _rawffi.get_errno()
f._flags_ = _rawffi.FUNCFLAG_USE_ERRNO
ctypes.set_errno(42)
diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_extra.py
b/pypy/module/test_lib_pypy/ctypes_tests/test_extra.py
--- a/pypy/module/test_lib_pypy/ctypes_tests/test_extra.py
+++ b/pypy/module/test_lib_pypy/ctypes_tests/test_extra.py
@@ -188,10 +188,7 @@
x = (c_int * 42)()
assert sizeof(x) == 42 * sizeof(c_int)
- def test_convert_pointers(self):
- import conftest
- _ctypes_test = str(conftest.sofile)
- dll = CDLL(_ctypes_test)
+ def test_convert_pointers(self, dll):
func = dll._testfunc_p_p
func.restype = c_char_p
diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_funcptr.py
b/pypy/module/test_lib_pypy/ctypes_tests/test_funcptr.py
--- a/pypy/module/test_lib_pypy/ctypes_tests/test_funcptr.py
+++ b/pypy/module/test_lib_pypy/ctypes_tests/test_funcptr.py
@@ -1,12 +1,6 @@
from ctypes import *
-def setup_module(mod):
- import conftest
- _ctypes_test = str(conftest.sofile)
- mod.lib = CDLL(_ctypes_test)
-
-
class TestCFuncPtr:
- def test_restype(self):
- foo = lib.my_unused_function
+ def test_restype(self, dll):
+ foo = dll.my_unused_function
assert foo.restype is c_int # by default
diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_functions.py
b/pypy/module/test_lib_pypy/ctypes_tests/test_functions.py
--- a/pypy/module/test_lib_pypy/ctypes_tests/test_functions.py
+++ b/pypy/module/test_lib_pypy/ctypes_tests/test_functions.py
@@ -1,32 +1,22 @@
from ctypes import *
import sys
import pytest
-from .support import BaseCTypesTestChecker
-try:
- WINFUNCTYPE
-except NameError:
- # fake to enable this test on Linux
- WINFUNCTYPE = CFUNCTYPE
[email protected]
+def dll(sofile):
+ return CDLL(str(sofile), use_errno=True)
-def setup_module(mod):
- import conftest
- _ctypes_test = str(conftest.sofile)
- mod.dll = CDLL(_ctypes_test, use_errno=True)
- if sys.platform == "win32":
- mod.windll = WinDLL(_ctypes_test)
+class TestFunctions(object):
-class TestFunctions(BaseCTypesTestChecker):
-
- def test_char_result(self):
+ def test_char_result(self, dll):
f = dll._testfunc_i_bhilfd
f.argtypes = [c_byte, c_short, c_int, c_long, c_float, c_double]
f.restype = c_char
result = f(0, 0, 0, 0, 0, 0)
assert result == '\x00'
- def test_boolresult(self):
+ def test_boolresult(self, dll):
f = dll._testfunc_i_bhilfd
f.argtypes = [c_byte, c_short, c_int, c_long, c_float, c_double]
f.restype = c_bool
@@ -35,14 +25,14 @@
true_result = f(1, 0, 0, 0, 0, 0)
assert true_result is True
- def test_unicode_function_name(self):
+ def test_unicode_function_name(self, dll):
f = dll[u'_testfunc_i_bhilfd']
f.argtypes = [c_byte, c_short, c_int, c_long, c_float, c_double]
f.restype = c_int
result = f(1, 2, 3, 4, 5.0, 6.0)
assert result == 21
- def test_truncate_python_longs(self):
+ def test_truncate_python_longs(self, dll):
f = dll._testfunc_i_bhilfd
f.argtypes = [c_byte, c_short, c_int, c_long, c_float, c_double]
f.restype = c_int
@@ -50,8 +40,7 @@
result = f(x, x, x, x, 0, 0)
assert result == -8
-
- def test_convert_pointers(self):
+ def test_convert_pointers(self, dll):
f = dll.deref_LP_c_char_p
f.restype = c_char
f.argtypes = [POINTER(c_char_p)]
@@ -63,15 +52,14 @@
################################################################
-
- def test_call_some_args(self):
+ def test_call_some_args(self, dll):
f = dll.my_strchr
f.argtypes = [c_char_p]
f.restype = c_char_p
result = f("abcd", ord("b"))
assert result == "bcd"
- def test_keepalive_buffers(self, monkeypatch):
+ def test_keepalive_buffers(self, monkeypatch, dll):
import gc
f = dll.my_strchr
f.argtypes = [c_char_p]
@@ -88,7 +76,7 @@
result = f("abcd", ord("b"))
assert result == "bcd"
- def test_caching_bug_1(self):
+ def test_caching_bug_1(self, dll):
# the same test as test_call_some_args, with two extra lines
# in the middle that trigger caching in f._ptr, which then
# makes the last two lines fail
@@ -100,7 +88,7 @@
result = f("abcd", ord("b"), 42)
assert result == "bcd"
- def test_argument_conversion_and_checks(self):
+ def test_argument_conversion_and_checks(self, dll):
#This test is designed to check for segfaults if the wrong type of
argument is passed as parameter
strlen = dll.my_strchr
strlen.argtypes = [c_char_p, c_int]
@@ -113,7 +101,7 @@
with pytest.raises(ArgumentError):
strlen(False, 0)
- def test_union_as_passed_value(self):
+ def test_union_as_passed_value(self, dll):
class UN(Union):
_fields_ = [("x", c_short),
("y", c_long)]
@@ -123,9 +111,9 @@
a = A()
a[1].x = 33
u = dll.ret_un_func(a[1])
- assert u.y == 33*10000
+ assert u.y == 33 * 10000
- def test_cache_funcptr(self):
+ def test_cache_funcptr(self, dll):
tf_b = dll.tf_b
tf_b.restype = c_byte
tf_b.argtypes = (c_byte,)
@@ -135,7 +123,7 @@
assert tf_b(-126) == -42
assert tf_b._ptr is ptr
- def test_custom_from_param(self):
+ def test_custom_from_param(self, dll):
class A(c_byte):
@classmethod
def from_param(cls, obj):
@@ -150,7 +138,7 @@
assert seen == ["yadda"]
@pytest.mark.xfail(reason="warnings are disabled")
- def test_warnings(self):
+ def test_warnings(self, dll):
import warnings
warnings.simplefilter("always")
with warnings.catch_warnings(record=True) as w:
@@ -160,7 +148,8 @@
assert "C function without declared arguments called" in
str(w[0].message)
@pytest.mark.xfail
- def test_errcheck(self):
+ def test_errcheck(self, dll):
+ import warnings
def errcheck(result, func, args):
assert result == -42
assert type(result) is int
@@ -189,8 +178,7 @@
warnings.resetwarnings()
-
- def test_errno(self):
+ def test_errno(self, dll):
test_errno = dll.test_errno
test_errno.restype = c_int
set_errno(42)
@@ -200,7 +188,7 @@
set_errno(0)
assert get_errno() == 0
- def test_issue1655(self):
+ def test_issue1655(self, dll):
def ret_list_p(icount):
def sz_array_p(obj, func, args):
assert ('.LP_c_int object' in repr(obj) or
@@ -208,7 +196,7 @@
assert repr(args) in ("('testing!', c_int(4))",
"('testing!', c_long(4))")
assert args[icount].value == 4
- return [ obj[i] for i in range(args[icount].value) ]
+ return [obj[i] for i in range(args[icount].value)]
return sz_array_p
get_data_prototype = CFUNCTYPE(POINTER(c_int),
@@ -216,7 +204,7 @@
get_data_paramflag = ((1,), (2,))
get_data_signature = ('test_issue1655', dll)
- get_data = get_data_prototype( get_data_signature, get_data_paramflag )
+ get_data = get_data_prototype(get_data_signature, get_data_paramflag)
assert get_data('testing!') == 4
get_data.errcheck = ret_list_p(1)
diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_guess_argtypes.py
b/pypy/module/test_lib_pypy/ctypes_tests/test_guess_argtypes.py
--- a/pypy/module/test_lib_pypy/ctypes_tests/test_guess_argtypes.py
+++ b/pypy/module/test_lib_pypy/ctypes_tests/test_guess_argtypes.py
@@ -28,14 +28,12 @@
pass
s = Stuff()
s._as_parameter_ = None
-
+
assert guess(s) == c_void_p
-def test_guess_unicode():
+def test_guess_unicode(dll):
if not hasattr(sys, 'pypy_translation_info') and sys.platform != 'win32':
py.test.skip("CPython segfaults: see http://bugs.python.org/issue5203")
- import conftest
- dll = CDLL(str(conftest.sofile))
wcslen = dll.my_wcslen
text = u"Some long unicode string"
assert wcslen(text) == len(text)
diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_loading.py
b/pypy/module/test_lib_pypy/ctypes_tests/test_loading.py
--- a/pypy/module/test_lib_pypy/ctypes_tests/test_loading.py
+++ b/pypy/module/test_lib_pypy/ctypes_tests/test_loading.py
@@ -1,9 +1,5 @@
-import pytest
-from ctypes import *
-import sys
-import os, StringIO
+from ctypes import CDLL
from ctypes.util import find_library
-from ctypes.test import is_resource_enabled
class TestLoader:
diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_numbers.py
b/pypy/module/test_lib_pypy/ctypes_tests/test_numbers.py
--- a/pypy/module/test_lib_pypy/ctypes_tests/test_numbers.py
+++ b/pypy/module/test_lib_pypy/ctypes_tests/test_numbers.py
@@ -1,26 +1,6 @@
import pytest
from ctypes import *
from .support import BaseCTypesTestChecker
-import sys, struct
-
-def valid_ranges(*types):
- # given a sequence of numeric types, collect their _type_
- # attribute, which is a single format character compatible with
- # the struct module, use the struct module to calculate the
- # minimum and maximum value allowed for this format.
- # Returns a list of (min, max) values.
- result = []
- for t in types:
- fmt = t._type_
- size = struct.calcsize(fmt)
- a = struct.unpack(fmt, ("\x00"*32)[:size])[0]
- b = struct.unpack(fmt, ("\xFF"*32)[:size])[0]
- c = struct.unpack(fmt, ("\x7F"+"\x00"*32)[:size])[0]
- d = struct.unpack(fmt, ("\x80"+"\xFF"*32)[:size])[0]
- result.append((min(a, b, c, d), max(a, b, c, d)))
- return result
-
-ArgType = type(byref(c_int(0)))
unsigned_types = [c_ubyte, c_ushort, c_uint, c_ulong]
signed_types = [c_byte, c_short, c_int, c_long, c_longlong]
@@ -36,9 +16,6 @@
unsigned_types.append(c_ulonglong)
signed_types.append(c_longlong)
-unsigned_ranges = valid_ranges(*unsigned_types)
-signed_ranges = valid_ranges(*signed_types)
-
################################################################
class TestNumber(BaseCTypesTestChecker):
diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_parameters.py
b/pypy/module/test_lib_pypy/ctypes_tests/test_parameters.py
--- a/pypy/module/test_lib_pypy/ctypes_tests/test_parameters.py
+++ b/pypy/module/test_lib_pypy/ctypes_tests/test_parameters.py
@@ -1,6 +1,3 @@
-import pytest
-import sys
-
class TestSimpleTypes:
def test_pointer_subclasses(self):
@@ -15,13 +12,10 @@
assert Void_pp.from_param(o) is o
- def test_multiple_signature(self):
+ def test_multiple_signature(self, dll):
# when .argtypes is not set, calling a function with a certain
# set of parameters should not prevent another call with
# another set.
- from ctypes import CDLL, byref
- import conftest
- dll = CDLL(str(conftest.sofile))
func = dll._testfunc_p_p
# This is call has too many arguments
@@ -29,4 +23,3 @@
# This one is normal
assert func(None) == 0
-
diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_pointers.py
b/pypy/module/test_lib_pypy/ctypes_tests/test_pointers.py
--- a/pypy/module/test_lib_pypy/ctypes_tests/test_pointers.py
+++ b/pypy/module/test_lib_pypy/ctypes_tests/test_pointers.py
@@ -7,10 +7,6 @@
python_types = [int, int, int, int, int, long,
int, long, long, long, float, float]
-def setup_module(mod):
- import conftest
- mod._ctypes_test = str(conftest.sofile)
-
class TestPointers(BaseCTypesTestChecker):
def test_get_ffi_argtype(self):
@@ -36,8 +32,7 @@
assert p2.contents.contents.value == 42
assert p1.contents.value == 42
- def test_c_char_p_byref(self):
- dll = CDLL(_ctypes_test)
+ def test_c_char_p_byref(self, dll):
TwoOutArgs = dll.TwoOutArgs
TwoOutArgs.restype = None
TwoOutArgs.argtypes = [c_int, c_void_p, c_int, c_void_p]
diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_prototypes.py
b/pypy/module/test_lib_pypy/ctypes_tests/test_prototypes.py
--- a/pypy/module/test_lib_pypy/ctypes_tests/test_prototypes.py
+++ b/pypy/module/test_lib_pypy/ctypes_tests/test_prototypes.py
@@ -2,20 +2,15 @@
from ctypes import *
from .support import BaseCTypesTestChecker
-def setup_module(mod):
- import conftest
- _ctypes_test = str(conftest.sofile)
- mod.testdll = CDLL(_ctypes_test)
-
class TestFuncPrototypes(BaseCTypesTestChecker):
- def test_restype_setattr(self):
- func = testdll._testfunc_p_p
+ def test_restype_setattr(self, dll):
+ func = dll._testfunc_p_p
with pytest.raises(TypeError):
setattr(func, 'restype', 20)
- def test_argtypes_setattr(self):
- func = testdll._testfunc_p_p
+ def test_argtypes_setattr(self, dll):
+ func = dll._testfunc_p_p
with pytest.raises(TypeError):
setattr(func, 'argtypes', 20)
with pytest.raises(TypeError):
@@ -34,10 +29,10 @@
setattr(func, 'paramflags', ((1,), ('a',)))
func.paramflags = (1,), (1|4,)
- def test_kwargs(self):
+ def test_kwargs(self, dll):
proto = CFUNCTYPE(c_char_p, c_char_p, c_int)
paramflags = (1, 'text', "tavino"), (1, 'letter', ord('v'))
- func = proto(('my_strchr', testdll), paramflags)
+ func = proto(('my_strchr', dll), paramflags)
assert func.argtypes == (c_char_p, c_int)
assert func.restype == c_char_p
@@ -63,9 +58,9 @@
assert result == "possible"
class TestArray(BaseCTypesTestChecker):
- def test_array_to_ptr_wrongtype(self):
+ def test_array_to_ptr_wrongtype(self, dll):
ARRAY = c_byte * 8
- func = testdll._testfunc_ai8
+ func = dll._testfunc_ai8
func.restype = POINTER(c_int)
func.argtypes = [c_int * 8]
array = ARRAY(1, 2, 3, 4, 5, 6, 7, 8)
diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_unions.py
b/pypy/module/test_lib_pypy/ctypes_tests/test_unions.py
--- a/pypy/module/test_lib_pypy/ctypes_tests/test_unions.py
+++ b/pypy/module/test_lib_pypy/ctypes_tests/test_unions.py
@@ -28,4 +28,3 @@
u = UnionofStuff()
u.one.x = 3
assert u.two.x == 3
-
diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_values.py
b/pypy/module/test_lib_pypy/ctypes_tests/test_values.py
--- a/pypy/module/test_lib_pypy/ctypes_tests/test_values.py
+++ b/pypy/module/test_lib_pypy/ctypes_tests/test_values.py
@@ -5,15 +5,10 @@
from ctypes import *
from .support import BaseCTypesTestChecker
-def setup_module(mod):
- import conftest
- _ctypes_test = str(conftest.sofile)
- mod.ctdll = CDLL(_ctypes_test)
-
class TestValues(BaseCTypesTestChecker):
- def test_a_string(self):
- a_string = (c_char * 16).in_dll(ctdll, "a_string")
+ def test_a_string(self, dll):
+ a_string = (c_char * 16).in_dll(dll, "a_string")
assert a_string.raw == "0123456789abcdef"
a_string[15] = '$'
- assert ctdll.get_a_string_char(15) == ord('$')
+ assert dll.get_a_string_char(15) == ord('$')
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit