Commit f5af466d authored by Thomas Heller's avatar Thomas Heller

Fix one more ctypes test, and disable the tests that were segfaulting.

Thanks to Christian Heimes for finding these tests.
parent c92159aa
...@@ -160,15 +160,17 @@ class FunctionTestCase(unittest.TestCase): ...@@ -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")
result = f(None) self.failUnlessEqual(result, "123")
self.failUnlessEqual(result, None)
result = f(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): ...@@ -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): ...@@ -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): ...@@ -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):
dll = CDLL(_ctypes_test.__file__) s = "abcdefghijklmnopqrstuvwxyz"
dll.my_strdup.restype = POINTER(c_char)
dll.my_free.restype = None dll = CDLL(_ctypes_test.__file__)
res = dll.my_strdup(s) dll.my_strdup.restype = POINTER(c_char)
self.failUnlessEqual(res[:len(s)], s) dll.my_free.restype = None
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):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment