mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
Fix one more ctypes test, and disable the tests that were segfaulting.
Thanks to Christian Heimes for finding these tests.
This commit is contained in:
parent
c92159aaea
commit
f5af466d3a
3 changed files with 67 additions and 61 deletions
|
@ -160,15 +160,17 @@ class FunctionTestCase(unittest.TestCase):
|
||||||
result = f(1, 2, 3, 4, 5.0, 6.0, 21)
|
result = f(1, 2, 3, 4, 5.0, 6.0, 21)
|
||||||
self.failUnlessEqual(result, 42)
|
self.failUnlessEqual(result, 42)
|
||||||
|
|
||||||
def test_stringresult(self):
|
from ctypes.test import is_resource_enabled
|
||||||
f = dll._testfunc_p_p
|
if is_resource_enabled("struni-crash"):
|
||||||
f.argtypes = None
|
def test_stringresult(self):
|
||||||
f.restype = c_char_p
|
f = dll._testfunc_p_p
|
||||||
result = f("123")
|
f.argtypes = None
|
||||||
self.failUnlessEqual(result, "123")
|
f.restype = c_char_p
|
||||||
|
result = f("123")
|
||||||
|
self.failUnlessEqual(result, "123")
|
||||||
|
|
||||||
result = f(None)
|
result = f(None)
|
||||||
self.failUnlessEqual(result, None)
|
self.failUnlessEqual(result, None)
|
||||||
|
|
||||||
def test_pointers(self):
|
def test_pointers(self):
|
||||||
f = dll._testfunc_p_p
|
f = dll._testfunc_p_p
|
||||||
|
|
|
@ -41,17 +41,17 @@ class PythonAPITestCase(unittest.TestCase):
|
||||||
# This test is unreliable, because it is possible that code in
|
# This test is unreliable, because it is possible that code in
|
||||||
# unittest changes the refcount of the '42' integer. So, it
|
# unittest changes the refcount of the '42' integer. So, it
|
||||||
# is disabled by default.
|
# is disabled by default.
|
||||||
def test_PyInt_Long(self):
|
def test_PyLong_Long(self):
|
||||||
ref42 = grc(42)
|
ref42 = grc(42)
|
||||||
pythonapi.PyInt_FromLong.restype = py_object
|
pythonapi.PyLong_FromLong.restype = py_object
|
||||||
self.failUnlessEqual(pythonapi.PyInt_FromLong(42), 42)
|
self.failUnlessEqual(pythonapi.PyLong_FromLong(42), 42)
|
||||||
|
|
||||||
self.failUnlessEqual(grc(42), ref42)
|
self.failUnlessEqual(grc(42), ref42)
|
||||||
|
|
||||||
pythonapi.PyInt_AsLong.argtypes = (py_object,)
|
pythonapi.PyLong_AsLong.argtypes = (py_object,)
|
||||||
pythonapi.PyInt_AsLong.restype = c_long
|
pythonapi.PyLong_AsLong.restype = c_long
|
||||||
|
|
||||||
res = pythonapi.PyInt_AsLong(42)
|
res = pythonapi.PyLong_AsLong(42)
|
||||||
self.failUnlessEqual(grc(res), ref42 + 1)
|
self.failUnlessEqual(grc(res), ref42 + 1)
|
||||||
del res
|
del res
|
||||||
self.failUnlessEqual(grc(42), ref42)
|
self.failUnlessEqual(grc(42), ref42)
|
||||||
|
@ -67,19 +67,21 @@ class PythonAPITestCase(unittest.TestCase):
|
||||||
del pyobj
|
del pyobj
|
||||||
self.failUnlessEqual(grc(s), ref)
|
self.failUnlessEqual(grc(s), ref)
|
||||||
|
|
||||||
def test_PyOS_snprintf(self):
|
from ctypes.test import is_resource_enabled
|
||||||
PyOS_snprintf = pythonapi.PyOS_snprintf
|
if is_resource_enabled("struni-crash"):
|
||||||
PyOS_snprintf.argtypes = POINTER(c_char), c_size_t, c_char_p
|
def test_PyOS_snprintf(self):
|
||||||
|
PyOS_snprintf = pythonapi.PyOS_snprintf
|
||||||
|
PyOS_snprintf.argtypes = POINTER(c_char), c_size_t, c_char_p
|
||||||
|
|
||||||
buf = c_buffer(256)
|
buf = c_buffer(256)
|
||||||
PyOS_snprintf(buf, sizeof(buf), "Hello from %s", "ctypes")
|
PyOS_snprintf(buf, sizeof(buf), "Hello from %s", "ctypes")
|
||||||
self.failUnlessEqual(buf.value, "Hello from ctypes")
|
self.failUnlessEqual(buf.value, "Hello from ctypes")
|
||||||
|
|
||||||
PyOS_snprintf(buf, sizeof(buf), "Hello from %s", "ctypes", 1, 2, 3)
|
PyOS_snprintf(buf, sizeof(buf), "Hello from %s (%d, %d, %d)", "ctypes", 1, 2, 3)
|
||||||
self.failUnlessEqual(buf.value, "Hello from ctypes")
|
self.failUnlessEqual(buf.value, "Hello from ctypes")
|
||||||
|
|
||||||
# not enough arguments
|
# not enough arguments
|
||||||
self.failUnlessRaises(TypeError, PyOS_snprintf, buf)
|
self.failUnlessRaises(TypeError, PyOS_snprintf, buf)
|
||||||
|
|
||||||
def test_pyobject_repr(self):
|
def test_pyobject_repr(self):
|
||||||
self.failUnlessEqual(repr(py_object()), "py_object(<NULL>)")
|
self.failUnlessEqual(repr(py_object()), "py_object(<NULL>)")
|
||||||
|
|
|
@ -34,45 +34,47 @@ class SlicesTestCase(unittest.TestCase):
|
||||||
# ValueError: Can only assign sequence of same size
|
# ValueError: Can only assign sequence of same size
|
||||||
self.assertRaises(ValueError, setslice, a, 0, 5, range(32))
|
self.assertRaises(ValueError, setslice, a, 0, 5, range(32))
|
||||||
|
|
||||||
def test_char_ptr(self):
|
from ctypes.test import is_resource_enabled
|
||||||
s = "abcdefghijklmnopqrstuvwxyz"
|
if is_resource_enabled("struni-crash"):
|
||||||
|
def test_char_ptr(self):
|
||||||
|
s = "abcdefghijklmnopqrstuvwxyz"
|
||||||
|
|
||||||
dll = CDLL(_ctypes_test.__file__)
|
dll = CDLL(_ctypes_test.__file__)
|
||||||
dll.my_strdup.restype = POINTER(c_char)
|
dll.my_strdup.restype = POINTER(c_char)
|
||||||
dll.my_free.restype = None
|
dll.my_free.restype = None
|
||||||
res = dll.my_strdup(s)
|
|
||||||
self.failUnlessEqual(res[:len(s)], s)
|
|
||||||
|
|
||||||
import operator
|
|
||||||
self.assertRaises(TypeError, operator.setslice,
|
|
||||||
res, 0, 5, "abcde")
|
|
||||||
dll.my_free(res)
|
|
||||||
|
|
||||||
dll.my_strdup.restype = POINTER(c_byte)
|
|
||||||
res = dll.my_strdup(s)
|
|
||||||
self.failUnlessEqual(res[:len(s)], list(range(ord("a"), ord("z")+1)))
|
|
||||||
dll.my_free(res)
|
|
||||||
|
|
||||||
def test_char_ptr_with_free(self):
|
|
||||||
dll = CDLL(_ctypes_test.__file__)
|
|
||||||
s = "abcdefghijklmnopqrstuvwxyz"
|
|
||||||
|
|
||||||
class allocated_c_char_p(c_char_p):
|
|
||||||
pass
|
|
||||||
|
|
||||||
dll.my_free.restype = None
|
|
||||||
def errcheck(result, func, args):
|
|
||||||
retval = result.value
|
|
||||||
dll.my_free(result)
|
|
||||||
return retval
|
|
||||||
|
|
||||||
dll.my_strdup.restype = allocated_c_char_p
|
|
||||||
dll.my_strdup.errcheck = errcheck
|
|
||||||
try:
|
|
||||||
res = dll.my_strdup(s)
|
res = dll.my_strdup(s)
|
||||||
self.failUnlessEqual(res, s)
|
self.failUnlessEqual(res[:len(s)], s)
|
||||||
finally:
|
|
||||||
del dll.my_strdup.errcheck
|
import operator
|
||||||
|
self.assertRaises(TypeError, operator.setslice,
|
||||||
|
res, 0, 5, "abcde")
|
||||||
|
dll.my_free(res)
|
||||||
|
|
||||||
|
dll.my_strdup.restype = POINTER(c_byte)
|
||||||
|
res = dll.my_strdup(s)
|
||||||
|
self.failUnlessEqual(res[:len(s)], list(range(ord("a"), ord("z")+1)))
|
||||||
|
dll.my_free(res)
|
||||||
|
|
||||||
|
def test_char_ptr_with_free(self):
|
||||||
|
dll = CDLL(_ctypes_test.__file__)
|
||||||
|
s = "abcdefghijklmnopqrstuvwxyz"
|
||||||
|
|
||||||
|
class allocated_c_char_p(c_char_p):
|
||||||
|
pass
|
||||||
|
|
||||||
|
dll.my_free.restype = None
|
||||||
|
def errcheck(result, func, args):
|
||||||
|
retval = result.value
|
||||||
|
dll.my_free(result)
|
||||||
|
return retval
|
||||||
|
|
||||||
|
dll.my_strdup.restype = allocated_c_char_p
|
||||||
|
dll.my_strdup.errcheck = errcheck
|
||||||
|
try:
|
||||||
|
res = dll.my_strdup(s)
|
||||||
|
self.failUnlessEqual(res, s)
|
||||||
|
finally:
|
||||||
|
del dll.my_strdup.errcheck
|
||||||
|
|
||||||
|
|
||||||
def test_char_array(self):
|
def test_char_array(self):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue