mirror of
https://github.com/python/cpython.git
synced 2025-11-01 18:51:43 +00:00
bpo-30103: Allow Uuencode in Python using backtick as zero instead of space (#1326)
This commit is contained in:
parent
0360a9d015
commit
13f1f423fa
10 changed files with 137 additions and 67 deletions
|
|
@ -10,11 +10,11 @@ import sys, os
|
|||
import uu
|
||||
import io
|
||||
|
||||
plaintext = b"The smooth-scaled python crept over the sleeping dog\n"
|
||||
plaintext = b"The symbols on top of your keyboard are !@#$%^&*()_+|~\n"
|
||||
|
||||
encodedtext = b"""\
|
||||
M5&AE('-M;V]T:\"US8V%L960@<'ET:&]N(&-R97!T(&]V97(@=&AE('-L965P
|
||||
(:6YG(&1O9PH """
|
||||
M5&AE('-Y;6)O;',@;VX@=&]P(&]F('EO=7(@:V5Y8F]A<F0@87)E("% (R0E
|
||||
*7B8J*"E?*WQ^"@ """
|
||||
|
||||
# Stolen from io.py
|
||||
class FakeIO(io.TextIOWrapper):
|
||||
|
|
@ -44,9 +44,14 @@ class FakeIO(io.TextIOWrapper):
|
|||
return self.buffer.getvalue().decode(self._encoding, self._errors)
|
||||
|
||||
|
||||
def encodedtextwrapped(mode, filename):
|
||||
return (bytes("begin %03o %s\n" % (mode, filename), "ascii") +
|
||||
encodedtext + b"\n \nend\n")
|
||||
def encodedtextwrapped(mode, filename, backtick=False):
|
||||
if backtick:
|
||||
res = (bytes("begin %03o %s\n" % (mode, filename), "ascii") +
|
||||
encodedtext.replace(b' ', b'`') + b"\n`\nend\n")
|
||||
else:
|
||||
res = (bytes("begin %03o %s\n" % (mode, filename), "ascii") +
|
||||
encodedtext + b"\n \nend\n")
|
||||
return res
|
||||
|
||||
class UUTest(unittest.TestCase):
|
||||
|
||||
|
|
@ -59,20 +64,27 @@ class UUTest(unittest.TestCase):
|
|||
out = io.BytesIO()
|
||||
uu.encode(inp, out, "t1", 0o644)
|
||||
self.assertEqual(out.getvalue(), encodedtextwrapped(0o644, "t1"))
|
||||
inp = io.BytesIO(plaintext)
|
||||
out = io.BytesIO()
|
||||
uu.encode(inp, out, "t1", backtick=True)
|
||||
self.assertEqual(out.getvalue(), encodedtextwrapped(0o666, "t1", True))
|
||||
with self.assertRaises(TypeError):
|
||||
uu.encode(inp, out, "t1", 0o644, True)
|
||||
|
||||
def test_decode(self):
|
||||
inp = io.BytesIO(encodedtextwrapped(0o666, "t1"))
|
||||
out = io.BytesIO()
|
||||
uu.decode(inp, out)
|
||||
self.assertEqual(out.getvalue(), plaintext)
|
||||
inp = io.BytesIO(
|
||||
b"UUencoded files may contain many lines,\n" +
|
||||
b"even some that have 'begin' in them.\n" +
|
||||
encodedtextwrapped(0o666, "t1")
|
||||
)
|
||||
out = io.BytesIO()
|
||||
uu.decode(inp, out)
|
||||
self.assertEqual(out.getvalue(), plaintext)
|
||||
for backtick in True, False:
|
||||
inp = io.BytesIO(encodedtextwrapped(0o666, "t1", backtick=backtick))
|
||||
out = io.BytesIO()
|
||||
uu.decode(inp, out)
|
||||
self.assertEqual(out.getvalue(), plaintext)
|
||||
inp = io.BytesIO(
|
||||
b"UUencoded files may contain many lines,\n" +
|
||||
b"even some that have 'begin' in them.\n" +
|
||||
encodedtextwrapped(0o666, "t1", backtick=backtick)
|
||||
)
|
||||
out = io.BytesIO()
|
||||
uu.decode(inp, out)
|
||||
self.assertEqual(out.getvalue(), plaintext)
|
||||
|
||||
def test_truncatedinput(self):
|
||||
inp = io.BytesIO(b"begin 644 t1\n" + encodedtext)
|
||||
|
|
@ -94,25 +106,33 @@ class UUTest(unittest.TestCase):
|
|||
|
||||
def test_garbage_padding(self):
|
||||
# Issue #22406
|
||||
encodedtext = (
|
||||
encodedtext1 = (
|
||||
b"begin 644 file\n"
|
||||
# length 1; bits 001100 111111 111111 111111
|
||||
b"\x21\x2C\x5F\x5F\x5F\n"
|
||||
b"\x20\n"
|
||||
b"end\n"
|
||||
)
|
||||
encodedtext2 = (
|
||||
b"begin 644 file\n"
|
||||
# length 1; bits 001100 111111 111111 111111
|
||||
b"\x21\x2C\x5F\x5F\x5F\n"
|
||||
b"\x60\n"
|
||||
b"end\n"
|
||||
)
|
||||
plaintext = b"\x33" # 00110011
|
||||
|
||||
with self.subTest("uu.decode()"):
|
||||
inp = io.BytesIO(encodedtext)
|
||||
out = io.BytesIO()
|
||||
uu.decode(inp, out, quiet=True)
|
||||
self.assertEqual(out.getvalue(), plaintext)
|
||||
for encodedtext in encodedtext1, encodedtext2:
|
||||
with self.subTest("uu.decode()"):
|
||||
inp = io.BytesIO(encodedtext)
|
||||
out = io.BytesIO()
|
||||
uu.decode(inp, out, quiet=True)
|
||||
self.assertEqual(out.getvalue(), plaintext)
|
||||
|
||||
with self.subTest("uu_codec"):
|
||||
import codecs
|
||||
decoded = codecs.decode(encodedtext, "uu_codec")
|
||||
self.assertEqual(decoded, plaintext)
|
||||
with self.subTest("uu_codec"):
|
||||
import codecs
|
||||
decoded = codecs.decode(encodedtext, "uu_codec")
|
||||
self.assertEqual(decoded, plaintext)
|
||||
|
||||
class UUStdIOTest(unittest.TestCase):
|
||||
|
||||
|
|
@ -250,11 +270,6 @@ class UUFileTest(unittest.TestCase):
|
|||
finally:
|
||||
self._kill(f)
|
||||
|
||||
def test_main():
|
||||
support.run_unittest(UUTest,
|
||||
UUStdIOTest,
|
||||
UUFileTest,
|
||||
)
|
||||
|
||||
if __name__=="__main__":
|
||||
test_main()
|
||||
unittest.main()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue