Home | History | Annotate | Download | only in test
      1 import sys
      2 from test import support
      3 import unittest
      4 from ctypes import *
      5 from ctypes.test import need_symbol
      6 
      7 class 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 
     78 if __name__ == "__main__":
     79     unittest.main()
     80