blob: 47231747aba7abf118cdb6350f68c1070cb2bbac [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
7from test import test_support
8
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
Guido van Rossum34d19282007-08-09 01:03:29 +000020def encodedtextwrapped(mode, filename):
21 return (bytes("begin %03o %s\n" % (mode, filename), "ascii") +
22 encodedtext + b"\n \nend\n")
Tim Peters48dacc62001-07-11 21:43:42 +000023
Walter Dörwald411e5a22003-05-06 08:57:41 +000024class UUTest(unittest.TestCase):
Tim Peters48dacc62001-07-11 21:43:42 +000025
Walter Dörwald411e5a22003-05-06 08:57:41 +000026 def test_encode(self):
Guido van Rossum34d19282007-08-09 01:03:29 +000027 inp = io.BytesIO(plaintext)
28 out = io.BytesIO()
Walter Dörwald411e5a22003-05-06 08:57:41 +000029 uu.encode(inp, out, "t1")
Guido van Rossum34d19282007-08-09 01:03:29 +000030 self.assertEqual(out.getvalue(), encodedtextwrapped(0o666, "t1"))
31 inp = io.BytesIO(plaintext)
32 out = io.BytesIO()
Guido van Rossumcd16bf62007-06-13 18:07:49 +000033 uu.encode(inp, out, "t1", 0o644)
Guido van Rossum34d19282007-08-09 01:03:29 +000034 self.assertEqual(out.getvalue(), encodedtextwrapped(0o644, "t1"))
Tim Peters48dacc62001-07-11 21:43:42 +000035
Walter Dörwald411e5a22003-05-06 08:57:41 +000036 def test_decode(self):
Guido van Rossum34d19282007-08-09 01:03:29 +000037 inp = io.BytesIO(encodedtextwrapped(0o666, "t1"))
38 out = io.BytesIO()
Walter Dörwald411e5a22003-05-06 08:57:41 +000039 uu.decode(inp, out)
40 self.assertEqual(out.getvalue(), plaintext)
Guido van Rossum34d19282007-08-09 01:03:29 +000041 inp = io.BytesIO(
42 b"UUencoded files may contain many lines,\n" +
43 b"even some that have 'begin' in them.\n" +
44 encodedtextwrapped(0o666, "t1")
Walter Dörwald411e5a22003-05-06 08:57:41 +000045 )
Guido van Rossum34d19282007-08-09 01:03:29 +000046 out = io.BytesIO()
Walter Dörwald411e5a22003-05-06 08:57:41 +000047 uu.decode(inp, out)
48 self.assertEqual(out.getvalue(), plaintext)
Tim Peters48dacc62001-07-11 21:43:42 +000049
Walter Dörwald411e5a22003-05-06 08:57:41 +000050 def test_truncatedinput(self):
Guido van Rossum34d19282007-08-09 01:03:29 +000051 inp = io.BytesIO(b"begin 644 t1\n" + encodedtext)
52 out = io.BytesIO()
Walter Dörwald411e5a22003-05-06 08:57:41 +000053 try:
54 uu.decode(inp, out)
55 self.fail("No exception thrown")
Guido van Rossumb940e112007-01-10 16:19:56 +000056 except uu.Error as e:
Walter Dörwald411e5a22003-05-06 08:57:41 +000057 self.assertEqual(str(e), "Truncated input file")
Tim Peters48dacc62001-07-11 21:43:42 +000058
Walter Dörwald411e5a22003-05-06 08:57:41 +000059 def test_missingbegin(self):
Guido van Rossum34d19282007-08-09 01:03:29 +000060 inp = io.BytesIO(b"")
61 out = io.BytesIO()
Walter Dörwald411e5a22003-05-06 08:57:41 +000062 try:
63 uu.decode(inp, out)
64 self.fail("No exception thrown")
Guido van Rossumb940e112007-01-10 16:19:56 +000065 except uu.Error as e:
Walter Dörwald411e5a22003-05-06 08:57:41 +000066 self.assertEqual(str(e), "No valid begin line found in input file")
Tim Peters48dacc62001-07-11 21:43:42 +000067
Walter Dörwald411e5a22003-05-06 08:57:41 +000068class UUStdIOTest(unittest.TestCase):
Tim Peters48dacc62001-07-11 21:43:42 +000069
Walter Dörwald411e5a22003-05-06 08:57:41 +000070 def setUp(self):
71 self.stdin = sys.stdin
72 self.stdout = sys.stdout
Tim Peters48dacc62001-07-11 21:43:42 +000073
Walter Dörwald411e5a22003-05-06 08:57:41 +000074 def tearDown(self):
75 sys.stdin = self.stdin
76 sys.stdout = self.stdout
Barry Warsawd1795702001-08-17 20:00:11 +000077
Walter Dörwald411e5a22003-05-06 08:57:41 +000078 def test_encode(self):
Guido van Rossum34d19282007-08-09 01:03:29 +000079 sys.stdin = io.StringIO(plaintext.decode("ascii"))
80 sys.stdout = io.StringIO()
Guido van Rossumcd16bf62007-06-13 18:07:49 +000081 uu.encode("-", "-", "t1", 0o666)
Guido van Rossum34d19282007-08-09 01:03:29 +000082 self.assertEqual(sys.stdout.getvalue(),
83 encodedtextwrapped(0o666, "t1").decode("ascii"))
Walter Dörwald411e5a22003-05-06 08:57:41 +000084
85 def test_decode(self):
Guido van Rossum34d19282007-08-09 01:03:29 +000086 sys.stdin = io.StringIO(encodedtextwrapped(0o666, "t1").decode("ascii"))
87 sys.stdout = io.StringIO()
Walter Dörwald411e5a22003-05-06 08:57:41 +000088 uu.decode("-", "-")
Guido van Rossum34d19282007-08-09 01:03:29 +000089 stdout = sys.stdout
90 sys.stdout = self.stdout
91 sys.stdin = self.stdin
92 self.assertEqual(stdout.getvalue(), plaintext.decode("ascii"))
Walter Dörwald411e5a22003-05-06 08:57:41 +000093
94class UUFileTest(unittest.TestCase):
95
96 def _kill(self, f):
97 # close and remove file
Guido van Rossum34d19282007-08-09 01:03:29 +000098 if f is None:
99 return
Walter Dörwald411e5a22003-05-06 08:57:41 +0000100 try:
101 f.close()
102 except (SystemExit, KeyboardInterrupt):
103 raise
104 except:
105 pass
106 try:
107 os.unlink(f.name)
108 except (SystemExit, KeyboardInterrupt):
109 raise
110 except:
111 pass
112
113 def setUp(self):
114 self.tmpin = test_support.TESTFN + "i"
115 self.tmpout = test_support.TESTFN + "o"
116
117 def tearDown(self):
118 del self.tmpin
119 del self.tmpout
120
121 def test_encode(self):
Guido van Rossum34d19282007-08-09 01:03:29 +0000122 fin = fout = None
Walter Dörwald411e5a22003-05-06 08:57:41 +0000123 try:
Thomas Woutersb2137042007-02-01 18:02:27 +0000124 fin = open(self.tmpin, 'wb')
Walter Dörwald411e5a22003-05-06 08:57:41 +0000125 fin.write(plaintext)
126 fin.close()
127
Thomas Woutersb2137042007-02-01 18:02:27 +0000128 fin = open(self.tmpin, 'rb')
Guido van Rossum34d19282007-08-09 01:03:29 +0000129 fout = open(self.tmpout, 'wb')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000130 uu.encode(fin, fout, self.tmpin, mode=0o644)
Walter Dörwald411e5a22003-05-06 08:57:41 +0000131 fin.close()
132 fout.close()
133
Guido van Rossum34d19282007-08-09 01:03:29 +0000134 fout = open(self.tmpout, 'rb')
Walter Dörwald411e5a22003-05-06 08:57:41 +0000135 s = fout.read()
136 fout.close()
Guido van Rossum34d19282007-08-09 01:03:29 +0000137 self.assertEqual(s, encodedtextwrapped(0o644, self.tmpin))
Walter Dörwald705fd472005-11-21 18:55:56 +0000138
139 # in_file and out_file as filenames
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000140 uu.encode(self.tmpin, self.tmpout, self.tmpin, mode=0o644)
Guido van Rossum34d19282007-08-09 01:03:29 +0000141 fout = open(self.tmpout, 'rb')
Walter Dörwald705fd472005-11-21 18:55:56 +0000142 s = fout.read()
143 fout.close()
Guido van Rossum34d19282007-08-09 01:03:29 +0000144 self.assertEqual(s, encodedtextwrapped(0o644, self.tmpin))
Walter Dörwald705fd472005-11-21 18:55:56 +0000145
Walter Dörwald411e5a22003-05-06 08:57:41 +0000146 finally:
147 self._kill(fin)
148 self._kill(fout)
149
150 def test_decode(self):
Guido van Rossum34d19282007-08-09 01:03:29 +0000151 f = None
Walter Dörwald411e5a22003-05-06 08:57:41 +0000152 try:
Guido van Rossum34d19282007-08-09 01:03:29 +0000153 f = open(self.tmpin, 'wb')
154 f.write(encodedtextwrapped(0o644, self.tmpout))
Walter Dörwald411e5a22003-05-06 08:57:41 +0000155 f.close()
156
Guido van Rossum34d19282007-08-09 01:03:29 +0000157 f = open(self.tmpin, 'rb')
Walter Dörwald411e5a22003-05-06 08:57:41 +0000158 uu.decode(f)
159 f.close()
160
Guido van Rossum34d19282007-08-09 01:03:29 +0000161 f = open(self.tmpout, 'rb')
Walter Dörwald411e5a22003-05-06 08:57:41 +0000162 s = f.read()
163 f.close()
164 self.assertEqual(s, plaintext)
165 # XXX is there an xp way to verify the mode?
166 finally:
167 self._kill(f)
168
169 def test_decodetwice(self):
170 # Verify that decode() will refuse to overwrite an existing file
Guido van Rossum34d19282007-08-09 01:03:29 +0000171 f = None
Walter Dörwald411e5a22003-05-06 08:57:41 +0000172 try:
Guido van Rossum34d19282007-08-09 01:03:29 +0000173 f = io.BytesIO(encodedtextwrapped(0o644, self.tmpout))
Walter Dörwald411e5a22003-05-06 08:57:41 +0000174
Guido van Rossum34d19282007-08-09 01:03:29 +0000175 f = open(self.tmpin, 'rb')
Walter Dörwald411e5a22003-05-06 08:57:41 +0000176 uu.decode(f)
177 f.close()
178
Guido van Rossum34d19282007-08-09 01:03:29 +0000179 f = open(self.tmpin, 'rb')
Walter Dörwald411e5a22003-05-06 08:57:41 +0000180 self.assertRaises(uu.Error, uu.decode, f)
181 f.close()
182 finally:
183 self._kill(f)
184
185def test_main():
Guido van Rossum34d19282007-08-09 01:03:29 +0000186 test_support.run_unittest(UUTest,
187 UUStdIOTest,
188 UUFileTest,
189 )
Walter Dörwald411e5a22003-05-06 08:57:41 +0000190
191if __name__=="__main__":
192 test_main()