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:
Thomas Heller 2007-07-11 14:51:58 +00:00
parent c92159aaea
commit f5af466d3a
3 changed files with 67 additions and 61 deletions

View file

@ -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

View file

@ -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>)")

View file

@ -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):