• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1import sys
2from test import support
3import unittest
4from ctypes import *
5from ctypes.test import need_symbol
6
7class MemFunctionsTest(unittest.TestCase):
8    @unittest.skip('test disabled')
9    def test_overflow(self):
10        # string_at and wstring_at must use the Python calling
11        # convention (which acquires the GIL and checks the Python
12        # error flag).  Provoke an error and catch it; see also issue
13        # #3554: <http://bugs.python.org/issue3554>
14        self.assertRaises((OverflowError, MemoryError, SystemError),
15                          lambda: wstring_at(u"foo", sys.maxint - 1))
16        self.assertRaises((OverflowError, MemoryError, SystemError),
17                          lambda: string_at("foo", sys.maxint - 1))
18
19    def test_memmove(self):
20        # large buffers apparently increase the chance that the memory
21        # is allocated in high address space.
22        a = create_string_buffer(1000000)
23        p = b"Hello, World"
24        result = memmove(a, p, len(p))
25        self.assertEqual(a.value, b"Hello, World")
26
27        self.assertEqual(string_at(result), b"Hello, World")
28        self.assertEqual(string_at(result, 5), b"Hello")
29        self.assertEqual(string_at(result, 16), b"Hello, World\0\0\0\0")
30        self.assertEqual(string_at(result, 0), b"")
31
32    def test_memset(self):
33        a = create_string_buffer(1000000)
34        result = memset(a, ord('x'), 16)
35        self.assertEqual(a.value, b"xxxxxxxxxxxxxxxx")
36
37        self.assertEqual(string_at(result), b"xxxxxxxxxxxxxxxx")
38        self.assertEqual(string_at(a), b"xxxxxxxxxxxxxxxx")
39        self.assertEqual(string_at(a, 20), b"xxxxxxxxxxxxxxxx\0\0\0\0")
40
41    def test_cast(self):
42        a = (c_ubyte * 32)(*map(ord, "abcdef"))
43        self.assertEqual(cast(a, c_char_p).value, b"abcdef")
44        self.assertEqual(cast(a, POINTER(c_byte))[:7],
45                             [97, 98, 99, 100, 101, 102, 0])
46        self.assertEqual(cast(a, POINTER(c_byte))[:7:],
47                             [97, 98, 99, 100, 101, 102, 0])
48        self.assertEqual(cast(a, POINTER(c_byte))[6:-1:-1],
49                             [0, 102, 101, 100, 99, 98, 97])
50        self.assertEqual(cast(a, POINTER(c_byte))[:7:2],
51                             [97, 99, 101, 0])
52        self.assertEqual(cast(a, POINTER(c_byte))[:7:7],
53                             [97])
54
55    @support.refcount_test
56    def test_string_at(self):
57        s = string_at(b"foo bar")
58        # XXX The following may be wrong, depending on how Python
59        # manages string instances
60        self.assertEqual(2, sys.getrefcount(s))
61        self.assertTrue(s, "foo bar")
62
63        self.assertEqual(string_at(b"foo bar", 7), b"foo bar")
64        self.assertEqual(string_at(b"foo bar", 3), b"foo")
65
66    @need_symbol('create_unicode_buffer')
67    def test_wstring_at(self):
68        p = create_unicode_buffer("Hello, World")
69        a = create_unicode_buffer(1000000)
70        result = memmove(a, p, len(p) * sizeof(c_wchar))
71        self.assertEqual(a.value, "Hello, World")
72
73        self.assertEqual(wstring_at(a), "Hello, World")
74        self.assertEqual(wstring_at(a, 5), "Hello")
75        self.assertEqual(wstring_at(a, 16), "Hello, World\0\0\0\0")
76        self.assertEqual(wstring_at(a, 0), "")
77
78if __name__ == "__main__":
79    unittest.main()
80