blob: 02d0171c374e285ab1197cc47ca8488f72a65580 [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
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):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000114 self.tmpin = support.TESTFN + "i"
115 self.tmpout = support.TESTFN + "o"
Walter Dörwald411e5a22003-05-06 08:57:41 +0000116
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:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000124 support.unlink(self.tmpin)
Thomas Woutersb2137042007-02-01 18:02:27 +0000125 fin = open(self.tmpin, 'wb')
Walter Dörwald411e5a22003-05-06 08:57:41 +0000126 fin.write(plaintext)
127 fin.close()
128
Thomas Woutersb2137042007-02-01 18:02:27 +0000129 fin = open(self.tmpin, 'rb')
Guido van Rossum34d19282007-08-09 01:03:29 +0000130 fout = open(self.tmpout, 'wb')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000131 uu.encode(fin, fout, self.tmpin, mode=0o644)
Walter Dörwald411e5a22003-05-06 08:57:41 +0000132 fin.close()
133 fout.close()
134
Guido van Rossum34d19282007-08-09 01:03:29 +0000135 fout = open(self.tmpout, 'rb')
Walter Dörwald411e5a22003-05-06 08:57:41 +0000136 s = fout.read()
137 fout.close()
Guido van Rossum34d19282007-08-09 01:03:29 +0000138 self.assertEqual(s, encodedtextwrapped(0o644, self.tmpin))
Walter Dörwald705fd472005-11-21 18:55:56 +0000139
140 # in_file and out_file as filenames
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000141 uu.encode(self.tmpin, self.tmpout, self.tmpin, mode=0o644)
Guido van Rossum34d19282007-08-09 01:03:29 +0000142 fout = open(self.tmpout, 'rb')
Walter Dörwald705fd472005-11-21 18:55:56 +0000143 s = fout.read()
144 fout.close()
Guido van Rossum34d19282007-08-09 01:03:29 +0000145 self.assertEqual(s, encodedtextwrapped(0o644, self.tmpin))
Walter Dörwald705fd472005-11-21 18:55:56 +0000146
Walter Dörwald411e5a22003-05-06 08:57:41 +0000147 finally:
148 self._kill(fin)
149 self._kill(fout)
150
151 def test_decode(self):
Guido van Rossum34d19282007-08-09 01:03:29 +0000152 f = None
Walter Dörwald411e5a22003-05-06 08:57:41 +0000153 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000154 support.unlink(self.tmpin)
Guido van Rossum34d19282007-08-09 01:03:29 +0000155 f = open(self.tmpin, 'wb')
156 f.write(encodedtextwrapped(0o644, self.tmpout))
Walter Dörwald411e5a22003-05-06 08:57:41 +0000157 f.close()
158
Guido van Rossum34d19282007-08-09 01:03:29 +0000159 f = open(self.tmpin, 'rb')
Walter Dörwald411e5a22003-05-06 08:57:41 +0000160 uu.decode(f)
161 f.close()
162
Guido van Rossum34d19282007-08-09 01:03:29 +0000163 f = open(self.tmpout, 'rb')
Walter Dörwald411e5a22003-05-06 08:57:41 +0000164 s = f.read()
165 f.close()
166 self.assertEqual(s, plaintext)
167 # XXX is there an xp way to verify the mode?
168 finally:
169 self._kill(f)
170
171 def test_decodetwice(self):
172 # Verify that decode() will refuse to overwrite an existing file
Guido van Rossum34d19282007-08-09 01:03:29 +0000173 f = None
Walter Dörwald411e5a22003-05-06 08:57:41 +0000174 try:
Guido van Rossum34d19282007-08-09 01:03:29 +0000175 f = io.BytesIO(encodedtextwrapped(0o644, self.tmpout))
Walter Dörwald411e5a22003-05-06 08:57:41 +0000176
Guido van Rossum34d19282007-08-09 01:03:29 +0000177 f = open(self.tmpin, 'rb')
Walter Dörwald411e5a22003-05-06 08:57:41 +0000178 uu.decode(f)
179 f.close()
180
Guido van Rossum34d19282007-08-09 01:03:29 +0000181 f = open(self.tmpin, 'rb')
Walter Dörwald411e5a22003-05-06 08:57:41 +0000182 self.assertRaises(uu.Error, uu.decode, f)
183 f.close()
184 finally:
185 self._kill(f)
186
187def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000188 support.run_unittest(UUTest,
Guido van Rossum34d19282007-08-09 01:03:29 +0000189 UUStdIOTest,
190 UUFileTest,
191 )
Walter Dörwald411e5a22003-05-06 08:57:41 +0000192
193if __name__=="__main__":
194 test_main()