Skip to content

Commit f446df7

Browse files
authored
[3.11] gh-67565: Add tests for C-contiguity checks (GH-110951) (GH-111199)
(cherry picked from commit 9376728)
1 parent 0a23960 commit f446df7

File tree

3 files changed

+29
-0
lines changed

3 files changed

+29
-0
lines changed

Lib/test/test_binascii.py

+6
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,12 @@ def test_b2a_base64_newline(self):
428428
self.assertEqual(binascii.b2a_base64(b, newline=False),
429429
b'aGVsbG8=')
430430

431+
def test_c_contiguity(self):
432+
m = memoryview(bytearray(b'noncontig'))
433+
noncontig_writable = m[::-2]
434+
with self.assertRaises(BufferError):
435+
binascii.b2a_hex(noncontig_writable)
436+
431437

432438
class ArrayBinASCIITest(BinASCIITest):
433439
def type2test(self, s):

Lib/test/test_capi/test_getargs.py

+19
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ class TupleSubclass(tuple):
152152
class DictSubclass(dict):
153153
pass
154154

155+
NONCONTIG_WRITABLE = memoryview(bytearray(b'noncontig'))[::-2]
156+
NONCONTIG_READONLY = memoryview(b'noncontig')[::-2]
155157

156158
class Unsigned_TestCase(unittest.TestCase):
157159
def test_b(self):
@@ -836,6 +838,8 @@ def test_y_star(self):
836838
self.assertEqual(getargs_y_star(bytearray(b'bytearray')), b'bytearray')
837839
self.assertEqual(getargs_y_star(memoryview(b'memoryview')), b'memoryview')
838840
self.assertRaises(TypeError, getargs_y_star, None)
841+
self.assertRaises(BufferError, getargs_y_star, NONCONTIG_WRITABLE)
842+
self.assertRaises(BufferError, getargs_y_star, NONCONTIG_READONLY)
839843

840844
def test_y_hash(self):
841845
from _testcapi import getargs_y_hash
@@ -845,6 +849,9 @@ def test_y_hash(self):
845849
self.assertRaises(TypeError, getargs_y_hash, bytearray(b'bytearray'))
846850
self.assertRaises(TypeError, getargs_y_hash, memoryview(b'memoryview'))
847851
self.assertRaises(TypeError, getargs_y_hash, None)
852+
# TypeError: must be read-only bytes-like object, not memoryview
853+
self.assertRaises(TypeError, getargs_y_hash, NONCONTIG_WRITABLE)
854+
self.assertRaises(TypeError, getargs_y_hash, NONCONTIG_READONLY)
848855

849856
def test_w_star(self):
850857
# getargs_w_star() modifies first and last byte
@@ -860,6 +867,8 @@ def test_w_star(self):
860867
self.assertEqual(getargs_w_star(memoryview(buf)), b'[emoryvie]')
861868
self.assertEqual(buf, bytearray(b'[emoryvie]'))
862869
self.assertRaises(TypeError, getargs_w_star, None)
870+
self.assertRaises(TypeError, getargs_w_star, NONCONTIG_WRITABLE)
871+
self.assertRaises(TypeError, getargs_w_star, NONCONTIG_READONLY)
863872

864873

865874
class String_TestCase(unittest.TestCase):
@@ -892,6 +901,8 @@ def test_s_star(self):
892901
self.assertEqual(getargs_s_star(bytearray(b'bytearray')), b'bytearray')
893902
self.assertEqual(getargs_s_star(memoryview(b'memoryview')), b'memoryview')
894903
self.assertRaises(TypeError, getargs_s_star, None)
904+
self.assertRaises(BufferError, getargs_s_star, NONCONTIG_WRITABLE)
905+
self.assertRaises(BufferError, getargs_s_star, NONCONTIG_READONLY)
895906

896907
def test_s_hash(self):
897908
from _testcapi import getargs_s_hash
@@ -901,6 +912,9 @@ def test_s_hash(self):
901912
self.assertRaises(TypeError, getargs_s_hash, bytearray(b'bytearray'))
902913
self.assertRaises(TypeError, getargs_s_hash, memoryview(b'memoryview'))
903914
self.assertRaises(TypeError, getargs_s_hash, None)
915+
# TypeError: must be read-only bytes-like object, not memoryview
916+
self.assertRaises(TypeError, getargs_s_hash, NONCONTIG_WRITABLE)
917+
self.assertRaises(TypeError, getargs_s_hash, NONCONTIG_READONLY)
904918

905919
def test_s_hash_int(self):
906920
# "s#" without PY_SSIZE_T_CLEAN defined.
@@ -936,6 +950,8 @@ def test_z_star(self):
936950
self.assertEqual(getargs_z_star(bytearray(b'bytearray')), b'bytearray')
937951
self.assertEqual(getargs_z_star(memoryview(b'memoryview')), b'memoryview')
938952
self.assertIsNone(getargs_z_star(None))
953+
self.assertRaises(BufferError, getargs_z_star, NONCONTIG_WRITABLE)
954+
self.assertRaises(BufferError, getargs_z_star, NONCONTIG_READONLY)
939955

940956
def test_z_hash(self):
941957
from _testcapi import getargs_z_hash
@@ -945,6 +961,9 @@ def test_z_hash(self):
945961
self.assertRaises(TypeError, getargs_z_hash, bytearray(b'bytearray'))
946962
self.assertRaises(TypeError, getargs_z_hash, memoryview(b'memoryview'))
947963
self.assertIsNone(getargs_z_hash(None))
964+
# TypeError: must be read-only bytes-like object, not memoryview
965+
self.assertRaises(TypeError, getargs_z_hash, NONCONTIG_WRITABLE)
966+
self.assertRaises(TypeError, getargs_z_hash, NONCONTIG_READONLY)
948967

949968
def test_es(self):
950969
from _testcapi import getargs_es

Lib/test/test_ssl.py

+4
Original file line numberDiff line numberDiff line change
@@ -1952,6 +1952,10 @@ def test_buffer_types(self):
19521952
self.assertEqual(bio.read(), b'bar')
19531953
bio.write(memoryview(b'baz'))
19541954
self.assertEqual(bio.read(), b'baz')
1955+
m = memoryview(bytearray(b'noncontig'))
1956+
noncontig_writable = m[::-2]
1957+
with self.assertRaises(BufferError):
1958+
bio.write(memoryview(noncontig_writable))
19551959

19561960
def test_error_types(self):
19571961
bio = ssl.MemoryBIO()

0 commit comments

Comments
 (0)