blob: df41cbc12d40d086ae718a856ee0de360c57040a [file] [log] [blame]
Tim Peters48dacc62001-07-11 21:43:42 +00001"""
2Tests for uu module.
3Nick Mathewson
4"""
5
Walter Dörwald411e5a22003-05-06 08:57:41 +00006import unittest
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +03007from test import test_support as support
Walter Dörwald411e5a22003-05-06 08:57:41 +00008
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +03009import cStringIO
10import sys
Tim Peters48dacc62001-07-11 21:43:42 +000011import uu
Tim Peters48dacc62001-07-11 21:43:42 +000012
Walter Dörwald411e5a22003-05-06 08:57:41 +000013plaintext = "The smooth-scaled python crept over the sleeping dog\n"
14
15encodedtext = """\
Tim Peters48dacc62001-07-11 21:43:42 +000016M5&AE('-M;V]T:\"US8V%L960@<'ET:&]N(&-R97!T(&]V97(@=&AE('-L965P
17(:6YG(&1O9PH """
Tim Peters48dacc62001-07-11 21:43:42 +000018
Walter Dörwald411e5a22003-05-06 08:57:41 +000019encodedtextwrapped = "begin %03o %s\n" + encodedtext.replace("%", "%%") + "\n \nend\n"
Tim Peters48dacc62001-07-11 21:43:42 +000020
Walter Dörwald411e5a22003-05-06 08:57:41 +000021class UUTest(unittest.TestCase):
Tim Peters48dacc62001-07-11 21:43:42 +000022
Walter Dörwald411e5a22003-05-06 08:57:41 +000023 def test_encode(self):
24 inp = cStringIO.StringIO(plaintext)
25 out = cStringIO.StringIO()
26 uu.encode(inp, out, "t1")
27 self.assertEqual(out.getvalue(), encodedtextwrapped % (0666, "t1"))
28 inp = cStringIO.StringIO(plaintext)
29 out = cStringIO.StringIO()
30 uu.encode(inp, out, "t1", 0644)
31 self.assertEqual(out.getvalue(), encodedtextwrapped % (0644, "t1"))
Tim Peters48dacc62001-07-11 21:43:42 +000032
Walter Dörwald411e5a22003-05-06 08:57:41 +000033 def test_decode(self):
34 inp = cStringIO.StringIO(encodedtextwrapped % (0666, "t1"))
35 out = cStringIO.StringIO()
36 uu.decode(inp, out)
37 self.assertEqual(out.getvalue(), plaintext)
38 inp = cStringIO.StringIO(
39 "UUencoded files may contain many lines,\n" +
40 "even some that have 'begin' in them.\n" +
41 encodedtextwrapped % (0666, "t1")
42 )
43 out = cStringIO.StringIO()
44 uu.decode(inp, out)
45 self.assertEqual(out.getvalue(), plaintext)
Tim Peters48dacc62001-07-11 21:43:42 +000046
Walter Dörwald411e5a22003-05-06 08:57:41 +000047 def test_truncatedinput(self):
48 inp = cStringIO.StringIO("begin 644 t1\n" + encodedtext)
49 out = cStringIO.StringIO()
50 try:
51 uu.decode(inp, out)
Andrew Svetlov4bb142b2012-12-18 21:27:37 +020052 self.fail("No exception raised")
Walter Dörwald411e5a22003-05-06 08:57:41 +000053 except uu.Error, e:
54 self.assertEqual(str(e), "Truncated input file")
Tim Peters48dacc62001-07-11 21:43:42 +000055
Walter Dörwald411e5a22003-05-06 08:57:41 +000056 def test_missingbegin(self):
57 inp = cStringIO.StringIO("")
58 out = cStringIO.StringIO()
59 try:
60 uu.decode(inp, out)
Andrew Svetlov4bb142b2012-12-18 21:27:37 +020061 self.fail("No exception raised")
Walter Dörwald411e5a22003-05-06 08:57:41 +000062 except uu.Error, e:
63 self.assertEqual(str(e), "No valid begin line found in input file")
Tim Peters48dacc62001-07-11 21:43:42 +000064
Serhiy Storchakab4f3d802014-11-07 14:07:43 +020065 def test_garbage_padding(self):
66 # Issue #22406
67 encodedtext = (
68 "begin 644 file\n"
69 # length 1; bits 001100 111111 111111 111111
70 "\x21\x2C\x5F\x5F\x5F\n"
71 "\x20\n"
72 "end\n"
73 )
74 plaintext = "\x33" # 00110011
75
76 inp = cStringIO.StringIO(encodedtext)
77 out = cStringIO.StringIO()
78 uu.decode(inp, out, quiet=True)
79 self.assertEqual(out.getvalue(), plaintext)
80
81 import codecs
82 decoded = codecs.decode(encodedtext, "uu_codec")
83 self.assertEqual(decoded, plaintext)
84
Walter Dörwald411e5a22003-05-06 08:57:41 +000085class UUStdIOTest(unittest.TestCase):
Tim Peters48dacc62001-07-11 21:43:42 +000086
Walter Dörwald411e5a22003-05-06 08:57:41 +000087 def setUp(self):
88 self.stdin = sys.stdin
89 self.stdout = sys.stdout
Tim Peters48dacc62001-07-11 21:43:42 +000090
Walter Dörwald411e5a22003-05-06 08:57:41 +000091 def tearDown(self):
92 sys.stdin = self.stdin
93 sys.stdout = self.stdout
Barry Warsawd1795702001-08-17 20:00:11 +000094
Walter Dörwald411e5a22003-05-06 08:57:41 +000095 def test_encode(self):
96 sys.stdin = cStringIO.StringIO(plaintext)
97 sys.stdout = cStringIO.StringIO()
98 uu.encode("-", "-", "t1", 0666)
99 self.assertEqual(
100 sys.stdout.getvalue(),
101 encodedtextwrapped % (0666, "t1")
102 )
103
104 def test_decode(self):
105 sys.stdin = cStringIO.StringIO(encodedtextwrapped % (0666, "t1"))
106 sys.stdout = cStringIO.StringIO()
107 uu.decode("-", "-")
108 self.assertEqual(sys.stdout.getvalue(), plaintext)
109
110class UUFileTest(unittest.TestCase):
111
Walter Dörwald411e5a22003-05-06 08:57:41 +0000112 def setUp(self):
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +0300113 self.tmpin = support.TESTFN + "i"
114 self.tmpout = support.TESTFN + "o"
115 self.addCleanup(support.unlink, self.tmpin)
116 self.addCleanup(support.unlink, self.tmpout)
Walter Dörwald411e5a22003-05-06 08:57:41 +0000117
118 def test_encode(self):
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +0300119 with open(self.tmpin, 'wb') as fin:
Walter Dörwald411e5a22003-05-06 08:57:41 +0000120 fin.write(plaintext)
Walter Dörwald411e5a22003-05-06 08:57:41 +0000121
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +0300122 with open(self.tmpin, 'rb') as fin:
123 with open(self.tmpout, 'w') as fout:
124 uu.encode(fin, fout, self.tmpin, mode=0o644)
Walter Dörwald411e5a22003-05-06 08:57:41 +0000125
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +0300126 with open(self.tmpout, 'r') as fout:
Walter Dörwald411e5a22003-05-06 08:57:41 +0000127 s = fout.read()
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +0300128 self.assertEqual(s, encodedtextwrapped % (0o644, self.tmpin))
Walter Dörwald705fd472005-11-21 18:55:56 +0000129
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +0300130 # in_file and out_file as filenames
131 uu.encode(self.tmpin, self.tmpout, self.tmpin, mode=0o644)
132 with open(self.tmpout, 'r') as fout:
Walter Dörwald705fd472005-11-21 18:55:56 +0000133 s = fout.read()
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +0300134 self.assertEqual(s, encodedtextwrapped % (0o644, self.tmpin))
Walter Dörwald411e5a22003-05-06 08:57:41 +0000135
136 def test_decode(self):
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +0300137 with open(self.tmpin, 'w') as f:
138 f.write(encodedtextwrapped % (0o644, self.tmpout))
Walter Dörwald411e5a22003-05-06 08:57:41 +0000139
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +0300140 with open(self.tmpin, 'r') as f:
Walter Dörwald411e5a22003-05-06 08:57:41 +0000141 uu.decode(f)
Walter Dörwald411e5a22003-05-06 08:57:41 +0000142
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +0300143 with open(self.tmpout, 'r') as f:
Walter Dörwald411e5a22003-05-06 08:57:41 +0000144 s = f.read()
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +0300145 self.assertEqual(s, plaintext)
146 # XXX is there an xp way to verify the mode?
Walter Dörwald411e5a22003-05-06 08:57:41 +0000147
Antoine Pitrou61d14b72010-10-31 16:17:36 +0000148 def test_decode_filename(self):
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +0300149 with open(self.tmpin, 'w') as f:
150 f.write(encodedtextwrapped % (0o644, self.tmpout))
Antoine Pitrou61d14b72010-10-31 16:17:36 +0000151
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +0300152 uu.decode(self.tmpin)
Antoine Pitrou61d14b72010-10-31 16:17:36 +0000153
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +0300154 with open(self.tmpout, 'r') as f:
Antoine Pitrou61d14b72010-10-31 16:17:36 +0000155 s = f.read()
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +0300156 self.assertEqual(s, plaintext)
Antoine Pitrou61d14b72010-10-31 16:17:36 +0000157
Walter Dörwald411e5a22003-05-06 08:57:41 +0000158 def test_decodetwice(self):
159 # Verify that decode() will refuse to overwrite an existing file
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +0300160 with open(self.tmpin, 'wb') as f:
161 f.write(encodedtextwrapped % (0o644, self.tmpout))
162 with open(self.tmpin, 'r') as f:
Walter Dörwald411e5a22003-05-06 08:57:41 +0000163 uu.decode(f)
Walter Dörwald411e5a22003-05-06 08:57:41 +0000164
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +0300165 with open(self.tmpin, 'r') as f:
Walter Dörwald411e5a22003-05-06 08:57:41 +0000166 self.assertRaises(uu.Error, uu.decode, f)
Walter Dörwald411e5a22003-05-06 08:57:41 +0000167
168def test_main():
Serhiy Storchaka9b5c9482018-06-03 19:31:53 +0300169 support.run_unittest(UUTest, UUStdIOTest, UUFileTest)
Walter Dörwald411e5a22003-05-06 08:57:41 +0000170
171if __name__=="__main__":
172 test_main()