Skip to content

Commit d4d947d

Browse files
authored
[3.12] gh-67565: Add tests for C-contiguity checks (GH-110951) (GH-111198)
(cherry picked from commit 9376728)
1 parent 4d781bc commit d4d947d

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
@@ -153,6 +153,8 @@ class TupleSubclass(tuple):
153153
class DictSubclass(dict):
154154
pass
155155

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

157159
class Unsigned_TestCase(unittest.TestCase):
158160
def test_b(self):
@@ -837,6 +839,8 @@ def test_y_star(self):
837839
self.assertEqual(getargs_y_star(bytearray(b'bytearray')), b'bytearray')
838840
self.assertEqual(getargs_y_star(memoryview(b'memoryview')), b'memoryview')
839841
self.assertRaises(TypeError, getargs_y_star, None)
842+
self.assertRaises(BufferError, getargs_y_star, NONCONTIG_WRITABLE)
843+
self.assertRaises(BufferError, getargs_y_star, NONCONTIG_READONLY)
840844

841845
def test_y_hash(self):
842846
from _testcapi import getargs_y_hash
@@ -846,6 +850,9 @@ def test_y_hash(self):
846850
self.assertRaises(TypeError, getargs_y_hash, bytearray(b'bytearray'))
847851
self.assertRaises(TypeError, getargs_y_hash, memoryview(b'memoryview'))
848852
self.assertRaises(TypeError, getargs_y_hash, None)
853+
# TypeError: must be read-only bytes-like object, not memoryview
854+
self.assertRaises(TypeError, getargs_y_hash, NONCONTIG_WRITABLE)
855+
self.assertRaises(TypeError, getargs_y_hash, NONCONTIG_READONLY)
849856

850857
def test_w_star(self):
851858
# getargs_w_star() modifies first and last byte
@@ -861,6 +868,8 @@ def test_w_star(self):
861868
self.assertEqual(getargs_w_star(memoryview(buf)), b'[emoryvie]')
862869
self.assertEqual(buf, bytearray(b'[emoryvie]'))
863870
self.assertRaises(TypeError, getargs_w_star, None)
871+
self.assertRaises(TypeError, getargs_w_star, NONCONTIG_WRITABLE)
872+
self.assertRaises(TypeError, getargs_w_star, NONCONTIG_READONLY)
864873

865874

866875
class String_TestCase(unittest.TestCase):
@@ -893,6 +902,8 @@ def test_s_star(self):
893902
self.assertEqual(getargs_s_star(bytearray(b'bytearray')), b'bytearray')
894903
self.assertEqual(getargs_s_star(memoryview(b'memoryview')), b'memoryview')
895904
self.assertRaises(TypeError, getargs_s_star, None)
905+
self.assertRaises(BufferError, getargs_s_star, NONCONTIG_WRITABLE)
906+
self.assertRaises(BufferError, getargs_s_star, NONCONTIG_READONLY)
896907

897908
def test_s_hash(self):
898909
from _testcapi import getargs_s_hash
@@ -902,6 +913,9 @@ def test_s_hash(self):
902913
self.assertRaises(TypeError, getargs_s_hash, bytearray(b'bytearray'))
903914
self.assertRaises(TypeError, getargs_s_hash, memoryview(b'memoryview'))
904915
self.assertRaises(TypeError, getargs_s_hash, None)
916+
# TypeError: must be read-only bytes-like object, not memoryview
917+
self.assertRaises(TypeError, getargs_s_hash, NONCONTIG_WRITABLE)
918+
self.assertRaises(TypeError, getargs_s_hash, NONCONTIG_READONLY)
905919

906920
def test_s_hash_int(self):
907921
# "s#" without PY_SSIZE_T_CLEAN defined.
@@ -937,6 +951,8 @@ def test_z_star(self):
937951
self.assertEqual(getargs_z_star(bytearray(b'bytearray')), b'bytearray')
938952
self.assertEqual(getargs_z_star(memoryview(b'memoryview')), b'memoryview')
939953
self.assertIsNone(getargs_z_star(None))
954+
self.assertRaises(BufferError, getargs_z_star, NONCONTIG_WRITABLE)
955+
self.assertRaises(BufferError, getargs_z_star, NONCONTIG_READONLY)
940956

941957
def test_z_hash(self):
942958
from _testcapi import getargs_z_hash
@@ -946,6 +962,9 @@ def test_z_hash(self):
946962
self.assertRaises(TypeError, getargs_z_hash, bytearray(b'bytearray'))
947963
self.assertRaises(TypeError, getargs_z_hash, memoryview(b'memoryview'))
948964
self.assertIsNone(getargs_z_hash(None))
965+
# TypeError: must be read-only bytes-like object, not memoryview
966+
self.assertRaises(TypeError, getargs_z_hash, NONCONTIG_WRITABLE)
967+
self.assertRaises(TypeError, getargs_z_hash, NONCONTIG_READONLY)
949968

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

Lib/test/test_ssl.py

+4
Original file line numberDiff line numberDiff line change
@@ -1739,6 +1739,10 @@ def test_buffer_types(self):
17391739
self.assertEqual(bio.read(), b'bar')
17401740
bio.write(memoryview(b'baz'))
17411741
self.assertEqual(bio.read(), b'baz')
1742+
m = memoryview(bytearray(b'noncontig'))
1743+
noncontig_writable = m[::-2]
1744+
with self.assertRaises(BufferError):
1745+
bio.write(memoryview(noncontig_writable))
17421746

17431747
def test_error_types(self):
17441748
bio = ssl.MemoryBIO()

0 commit comments

Comments
 (0)