summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_asyncio/test_streams.py
diff options
context:
space:
mode:
authorBruce Merry <1963944+bmerry@users.noreply.github.com>2024-04-11 14:41:55 (GMT)
committerGitHub <noreply@github.com>2024-04-11 14:41:55 (GMT)
commit01a51f949475f1590eb5899f3002304060501ab2 (patch)
tree88528120d948fd0b392f0628a02ad57230f29f4f /Lib/test/test_asyncio/test_streams.py
parent898f6de63fd5285006ee0f4993aeb8ed3e8f97f9 (diff)
downloadcpython-01a51f949475f1590eb5899f3002304060501ab2.zip
cpython-01a51f949475f1590eb5899f3002304060501ab2.tar.gz
cpython-01a51f949475f1590eb5899f3002304060501ab2.tar.bz2
gh-117722: Fix Stream.readuntil with non-bytes buffer objects (#117723)
gh-16429 introduced support for an iterable of separators in Stream.readuntil. Since bytes-like types are themselves iterable, this can introduce ambiguities in deciding whether the argument is an iterator of separators or a singleton separator. In gh-16429, only 'bytes' was considered a singleton, but this will break code that passes other buffer object types. Fix it by only supporting tuples rather than arbitrary iterables. Closes gh-117722.
Diffstat (limited to 'Lib/test/test_asyncio/test_streams.py')
-rw-r--r--Lib/test/test_asyncio/test_streams.py21
1 files changed, 14 insertions, 7 deletions
diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py
index 792e887..ae943f3 100644
--- a/Lib/test/test_asyncio/test_streams.py
+++ b/Lib/test/test_asyncio/test_streams.py
@@ -384,9 +384,9 @@ class StreamTests(test_utils.TestCase):
with self.assertRaisesRegex(ValueError, 'Separator should be'):
self.loop.run_until_complete(stream.readuntil(separator=b''))
with self.assertRaisesRegex(ValueError, 'Separator should be'):
- self.loop.run_until_complete(stream.readuntil(separator=[b'']))
+ self.loop.run_until_complete(stream.readuntil(separator=(b'',)))
with self.assertRaisesRegex(ValueError, 'Separator should contain'):
- self.loop.run_until_complete(stream.readuntil(separator=[]))
+ self.loop.run_until_complete(stream.readuntil(separator=()))
def test_readuntil_multi_chunks(self):
stream = asyncio.StreamReader(loop=self.loop)
@@ -475,15 +475,15 @@ class StreamTests(test_utils.TestCase):
# Simple case
stream.feed_data(b'line 1\nline 2\r')
- data = self.loop.run_until_complete(stream.readuntil([b'\r', b'\n']))
+ data = self.loop.run_until_complete(stream.readuntil((b'\r', b'\n')))
self.assertEqual(b'line 1\n', data)
- data = self.loop.run_until_complete(stream.readuntil([b'\r', b'\n']))
+ data = self.loop.run_until_complete(stream.readuntil((b'\r', b'\n')))
self.assertEqual(b'line 2\r', data)
self.assertEqual(b'', stream._buffer)
# First end position matches, even if that's a longer match
stream.feed_data(b'ABCDEFG')
- data = self.loop.run_until_complete(stream.readuntil([b'DEF', b'BCDE']))
+ data = self.loop.run_until_complete(stream.readuntil((b'DEF', b'BCDE')))
self.assertEqual(b'ABCDE', data)
self.assertEqual(b'FG', stream._buffer)
@@ -493,7 +493,7 @@ class StreamTests(test_utils.TestCase):
with self.assertRaisesRegex(asyncio.LimitOverrunError,
'is found') as cm:
- self.loop.run_until_complete(stream.readuntil([b'A', b'ome dataA']))
+ self.loop.run_until_complete(stream.readuntil((b'A', b'ome dataA')))
self.assertEqual(b'some dataA', stream._buffer)
@@ -504,7 +504,7 @@ class StreamTests(test_utils.TestCase):
stream = asyncio.StreamReader(loop=self.loop)
stream.feed_data(b'data')
- readuntil_task = self.loop.create_task(stream.readuntil([b'A', b'long sep']))
+ readuntil_task = self.loop.create_task(stream.readuntil((b'A', b'long sep')))
self.loop.call_soon(stream.feed_data, b'Z')
self.loop.call_soon(stream.feed_data, b'Aaaa')
@@ -512,6 +512,13 @@ class StreamTests(test_utils.TestCase):
self.assertEqual(b'dataZA', data)
self.assertEqual(b'aaa', stream._buffer)
+ def test_readuntil_bytearray(self):
+ stream = asyncio.StreamReader(loop=self.loop)
+ stream.feed_data(b'some data\r\n')
+ data = self.loop.run_until_complete(stream.readuntil(bytearray(b'\r\n')))
+ self.assertEqual(b'some data\r\n', data)
+ self.assertEqual(b'', stream._buffer)
+
def test_readexactly_zero_or_less(self):
# Read exact number of bytes (zero or less).
stream = asyncio.StreamReader(loop=self.loop)