Skip to content

Commit 9376728

Browse files
authored
gh-67565: Add tests for C-contiguity checks (GH-110951)
1 parent 677d4bc commit 9376728

File tree

3 files changed

+29
-0
lines changed

3 files changed

+29
-0
lines changed

Lib/test/test_binascii.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,12 @@ def test_base64_roundtrip(self, binary, newline):
474474
restored = binascii.a2b_base64(self.type2test(converted))
475475
self.assertConversion(binary, converted, restored, newline=newline)
476476

477+
def test_c_contiguity(self):
478+
m = memoryview(bytearray(b'noncontig'))
479+
noncontig_writable = m[::-2]
480+
with self.assertRaises(BufferError):
481+
binascii.b2a_hex(noncontig_writable)
482+
477483

478484
class ArrayBinASCIITest(BinASCIITest):
479485
def type2test(self, s):

Lib/test/test_capi/test_getargs.py

Lines changed: 19 additions & 0 deletions
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_z(self):
907921
from _testcapi import getargs_z
@@ -920,6 +934,8 @@ def test_z_star(self):
920934
self.assertEqual(getargs_z_star(bytearray(b'bytearray')), b'bytearray')
921935
self.assertEqual(getargs_z_star(memoryview(b'memoryview')), b'memoryview')
922936
self.assertIsNone(getargs_z_star(None))
937+
self.assertRaises(BufferError, getargs_z_star, NONCONTIG_WRITABLE)
938+
self.assertRaises(BufferError, getargs_z_star, NONCONTIG_READONLY)
923939

924940
def test_z_hash(self):
925941
from _testcapi import getargs_z_hash
@@ -929,6 +945,9 @@ def test_z_hash(self):
929945
self.assertRaises(TypeError, getargs_z_hash, bytearray(b'bytearray'))
930946
self.assertRaises(TypeError, getargs_z_hash, memoryview(b'memoryview'))
931947
self.assertIsNone(getargs_z_hash(None))
948+
# TypeError: must be read-only bytes-like object, not memoryview
949+
self.assertRaises(TypeError, getargs_z_hash, NONCONTIG_WRITABLE)
950+
self.assertRaises(TypeError, getargs_z_hash, NONCONTIG_READONLY)
932951

933952
def test_es(self):
934953
from _testcapi import getargs_es

Lib/test/test_ssl.py

Lines changed: 4 additions & 0 deletions
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)