blob: d2b6e7379c19a5f1d7c5a96b19e785dbc87000a0 [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
Benjamin Petersonee8712c2008-05-20 21:35:26 +00007from test import support
Walter Dörwald411e5a22003-05-06 08:57:41 +00008
Guido van Rossum34d19282007-08-09 01:03:29 +00009import sys, os
Tim Peters48dacc62001-07-11 21:43:42 +000010import uu
Guido van Rossum34d19282007-08-09 01:03:29 +000011from io import BytesIO
12import io
Tim Peters48dacc62001-07-11 21:43:42 +000013
Guido van Rossum34d19282007-08-09 01:03:29 +000014plaintext = b"The smooth-scaled python crept over the sleeping dog\n"
Walter Dörwald411e5a22003-05-06 08:57:41 +000015
Guido van Rossum34d19282007-08-09 01:03:29 +000016encodedtext = b"""\
Tim Peters48dacc62001-07-11 21:43:42 +000017M5&AE('-M;V]T:\"US8V%L960@<'ET:&]N(&-R97!T(&]V97(@=&AE('-L965P
18(:6YG(&1O9PH """
Tim Peters48dacc62001-07-11 21:43:42 +000019
Alexandre Vassalotti794652d2008-06-11 22:58:36 +000020# Stolen from io.py
21class FakeIO(io.TextIOWrapper):
22 """Text I/O implementation using an in-memory buffer.
23
24 Can be a used as a drop-in replacement for sys.stdin and sys.stdout.
25 """
26
27 # XXX This is really slow, but fully functional
28
29 def __init__(self, initial_value="", encoding="utf-8",
30 errors="strict", newline="\n"):
31 super(FakeIO, self).__init__(io.BytesIO(),
32 encoding=encoding,
33 errors=errors,
34 newline=newline)
35 if initial_value:
36 if not isinstance(initial_value, str):
37 initial_value = str(initial_value)
38 self.write(initial_value)
39 self.seek(0)
40
41 def getvalue(self):
42 self.flush()
43 return self.buffer.getvalue().decode(self._encoding, self._errors)
44
45
Guido van Rossum34d19282007-08-09 01:03:29 +000046def encodedtextwrapped(mode, filename):
47 return (bytes("begin %03o %s\n" % (mode, filename), "ascii") +
48 encodedtext + b"\n \nend\n")
Tim Peters48dacc62001-07-11 21:43:42 +000049
Walter Dörwald411e5a22003-05-06 08:57:41 +000050class UUTest(unittest.TestCase):
Tim Peters48dacc62001-07-11 21:43:42 +000051
Walter Dörwald411e5a22003-05-06 08:57:41 +000052 def test_encode(self):
Guido van Rossum34d19282007-08-09 01:03:29 +000053 inp = io.BytesIO(plaintext)
54 out = io.BytesIO()
Walter Dörwald411e5a22003-05-06 08:57:41 +000055 uu.encode(inp, out, "t1")
Guido van Rossum34d19282007-08-09 01:03:29 +000056 self.assertEqual(out.getvalue(), encodedtextwrapped(0o666, "t1"))
57 inp = io.BytesIO(plaintext)
58 out = io.BytesIO()
Guido van Rossumcd16bf62007-06-13 18:07:49 +000059 uu.encode(inp, out, "t1", 0o644)
Guido van Rossum34d19282007-08-09 01:03:29 +000060 self.assertEqual(out.getvalue(), encodedtextwrapped(0o644, "t1"))
Tim Peters48dacc62001-07-11 21:43:42 +000061
Walter Dörwald411e5a22003-05-06 08:57:41 +000062 def test_decode(self):
Guido van Rossum34d19282007-08-09 01:03:29 +000063 inp = io.BytesIO(encodedtextwrapped(0o666, "t1"))
64 out = io.BytesIO()
Walter Dörwald411e5a22003-05-06 08:57:41 +000065 uu.decode(inp, out)
66 self.assertEqual(out.getvalue(), plaintext)
Guido van Rossum34d19282007-08-09 01:03:29 +000067 inp = io.BytesIO(
68 b"UUencoded files may contain many lines,\n" +
69 b"even some that have 'begin' in them.\n" +
70 encodedtextwrapped(0o666, "t1")
Walter Dörwald411e5a22003-05-06 08:57:41 +000071 )
Guido van Rossum34d19282007-08-09 01:03:29 +000072 out = io.BytesIO()
Walter Dörwald411e5a22003-05-06 08:57:41 +000073 uu.decode(inp, out)
74 self.assertEqual(out.getvalue(), plaintext)
Tim Peters48dacc62001-07-11 21:43:42 +000075
Walter Dörwald411e5a22003-05-06 08:57:41 +000076 def test_truncatedinput(self):
Guido van Rossum34d19282007-08-09 01:03:29 +000077 inp = io.BytesIO(b"begin 644 t1\n" + encodedtext)
78 out = io.BytesIO()
Walter Dörwald411e5a22003-05-06 08:57:41 +000079 try:
80 uu.decode(inp, out)
81 self.fail("No exception thrown")
Guido van Rossumb940e112007-01-10 16:19:56 +000082 except uu.Error as e:
Walter Dörwald411e5a22003-05-06 08:57:41 +000083 self.assertEqual(str(e), "Truncated input file")
Tim Peters48dacc62001-07-11 21:43:42 +000084
Walter Dörwald411e5a22003-05-06 08:57:41 +000085 def test_missingbegin(self):
Guido van Rossum34d19282007-08-09 01:03:29 +000086 inp = io.BytesIO(b"")
87 out = io.BytesIO()
Walter Dörwald411e5a22003-05-06 08:57:41 +000088 try:
89 uu.decode(inp, out)
90 self.fail("No exception thrown")
Guido van Rossumb940e112007-01-10 16:19:56 +000091 except uu.Error as e:
Walter Dörwald411e5a22003-05-06 08:57:41 +000092 self.assertEqual(str(e), "No valid begin line found in input file")
Tim Peters48dacc62001-07-11 21:43:42 +000093
Walter Dörwald411e5a22003-05-06 08:57:41 +000094class UUStdIOTest(unittest.TestCase):
Tim Peters48dacc62001-07-11 21:43:42 +000095
Walter Dörwald411e5a22003-05-06 08:57:41 +000096 def setUp(self):
97 self.stdin = sys.stdin
98 self.stdout = sys.stdout
Tim Peters48dacc62001-07-11 21:43:42 +000099
Walter Dörwald411e5a22003-05-06 08:57:41 +0000100 def tearDown(self):
101 sys.stdin = self.stdin
102 sys.stdout = self.stdout
Barry Warsawd1795702001-08-17 20:00:11 +0000103
Walter Dörwald411e5a22003-05-06 08:57:41 +0000104 def test_encode(self):
Alexandre Vassalotti794652d2008-06-11 22:58:36 +0000105 sys.stdin = FakeIO(plaintext.decode("ascii"))
106 sys.stdout = FakeIO()
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000107 uu.encode("-", "-", "t1", 0o666)
Guido van Rossum34d19282007-08-09 01:03:29 +0000108 self.assertEqual(sys.stdout.getvalue(),
109 encodedtextwrapped(0o666, "t1").decode("ascii"))
Walter Dörwald411e5a22003-05-06 08:57:41 +0000110
111 def test_decode(self):
Alexandre Vassalotti794652d2008-06-11 22:58:36 +0000112 sys.stdin = FakeIO(encodedtextwrapped(0o666, "t1").decode("ascii"))
113 sys.stdout = FakeIO()
Walter Dörwald411e5a22003-05-06 08:57:41 +0000114 uu.decode("-", "-")
Guido van Rossum34d19282007-08-09 01:03:29 +0000115 stdout = sys.stdout
116 sys.stdout = self.stdout
117 sys.stdin = self.stdin
118 self.assertEqual(stdout.getvalue(), plaintext.decode("ascii"))
Walter Dörwald411e5a22003-05-06 08:57:41 +0000119
120class UUFileTest(unittest.TestCase):
121
122 def _kill(self, f):
123 # close and remove file
Guido van Rossum34d19282007-08-09 01:03:29 +0000124 if f is None:
125 return
Walter Dörwald411e5a22003-05-06 08:57:41 +0000126 try:
127 f.close()
128 except (SystemExit, KeyboardInterrupt):
129 raise
130 except:
131 pass
132 try:
133 os.unlink(f.name)
134 except (SystemExit, KeyboardInterrupt):
135 raise
136 except:
137 pass
138
139 def setUp(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000140 self.tmpin = support.TESTFN + "i"
141 self.tmpout = support.TESTFN + "o"
Walter Dörwald411e5a22003-05-06 08:57:41 +0000142
143 def tearDown(self):
144 del self.tmpin
145 del self.tmpout
146
147 def test_encode(self):
Guido van Rossum34d19282007-08-09 01:03:29 +0000148 fin = fout = None
Walter Dörwald411e5a22003-05-06 08:57:41 +0000149 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000150 support.unlink(self.tmpin)
Thomas Woutersb2137042007-02-01 18:02:27 +0000151 fin = open(self.tmpin, 'wb')
Walter Dörwald411e5a22003-05-06 08:57:41 +0000152 fin.write(plaintext)
153 fin.close()
154
Thomas Woutersb2137042007-02-01 18:02:27 +0000155 fin = open(self.tmpin, 'rb')
Guido van Rossum34d19282007-08-09 01:03:29 +0000156 fout = open(self.tmpout, 'wb')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000157 uu.encode(fin, fout, self.tmpin, mode=0o644)
Walter Dörwald411e5a22003-05-06 08:57:41 +0000158 fin.close()
159 fout.close()
160
Guido van Rossum34d19282007-08-09 01:03:29 +0000161 fout = open(self.tmpout, 'rb')
Walter Dörwald411e5a22003-05-06 08:57:41 +0000162 s = fout.read()
163 fout.close()
Guido van Rossum34d19282007-08-09 01:03:29 +0000164 self.assertEqual(s, encodedtextwrapped(0o644, self.tmpin))
Walter Dörwald705fd472005-11-21 18:55:56 +0000165
166 # in_file and out_file as filenames
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000167 uu.encode(self.tmpin, self.tmpout, self.tmpin, mode=0o644)
Guido van Rossum34d19282007-08-09 01:03:29 +0000168 fout = open(self.tmpout, 'rb')
Walter Dörwald705fd472005-11-21 18:55:56 +0000169 s = fout.read()
170 fout.close()
Guido van Rossum34d19282007-08-09 01:03:29 +0000171 self.assertEqual(s, encodedtextwrapped(0o644, self.tmpin))
Walter Dörwald705fd472005-11-21 18:55:56 +0000172
Walter Dörwald411e5a22003-05-06 08:57:41 +0000173 finally:
174 self._kill(fin)
175 self._kill(fout)
176
177 def test_decode(self):
Guido van Rossum34d19282007-08-09 01:03:29 +0000178 f = None
Walter Dörwald411e5a22003-05-06 08:57:41 +0000179 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000180 support.unlink(self.tmpin)
Guido van Rossum34d19282007-08-09 01:03:29 +0000181 f = open(self.tmpin, 'wb')
182 f.write(encodedtextwrapped(0o644, self.tmpout))
Walter Dörwald411e5a22003-05-06 08:57:41 +0000183 f.close()
184
Guido van Rossum34d19282007-08-09 01:03:29 +0000185 f = open(self.tmpin, 'rb')
Walter Dörwald411e5a22003-05-06 08:57:41 +0000186 uu.decode(f)
187 f.close()
188
Guido van Rossum34d19282007-08-09 01:03:29 +0000189 f = open(self.tmpout, 'rb')
Walter Dörwald411e5a22003-05-06 08:57:41 +0000190 s = f.read()
191 f.close()
192 self.assertEqual(s, plaintext)
193 # XXX is there an xp way to verify the mode?
194 finally:
195 self._kill(f)
196
197 def test_decodetwice(self):
198 # Verify that decode() will refuse to overwrite an existing file
Guido van Rossum34d19282007-08-09 01:03:29 +0000199 f = None
Walter Dörwald411e5a22003-05-06 08:57:41 +0000200 try:
Guido van Rossum34d19282007-08-09 01:03:29 +0000201 f = io.BytesIO(encodedtextwrapped(0o644, self.tmpout))
Walter Dörwald411e5a22003-05-06 08:57:41 +0000202
Guido van Rossum34d19282007-08-09 01:03:29 +0000203 f = open(self.tmpin, 'rb')
Walter Dörwald411e5a22003-05-06 08:57:41 +0000204 uu.decode(f)
205 f.close()
206
Guido van Rossum34d19282007-08-09 01:03:29 +0000207 f = open(self.tmpin, 'rb')
Walter Dörwald411e5a22003-05-06 08:57:41 +0000208 self.assertRaises(uu.Error, uu.decode, f)
209 f.close()
210 finally:
211 self._kill(f)
212
213def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000214 support.run_unittest(UUTest,
Guido van Rossum34d19282007-08-09 01:03:29 +0000215 UUStdIOTest,
216 UUFileTest,
217 )
Walter Dörwald411e5a22003-05-06 08:57:41 +0000218
219if __name__=="__main__":
220 test_main()