diff options
author | Bruce Merry <1963944+bmerry@users.noreply.github.com> | 2024-04-11 14:41:55 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-11 14:41:55 (GMT) |
commit | 01a51f949475f1590eb5899f3002304060501ab2 (patch) | |
tree | 88528120d948fd0b392f0628a02ad57230f29f4f /Lib/test/test_asyncio/test_streams.py | |
parent | 898f6de63fd5285006ee0f4993aeb8ed3e8f97f9 (diff) | |
download | cpython-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.py | 21 |
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) |