PageRenderTime 393ms CodeModel.GetById 201ms app.highlight 19ms RepoModel.GetById 171ms app.codeStats 0ms

/Lib/test/test_uu.py

http://unladen-swallow.googlecode.com/
Python | 184 lines | 176 code | 4 blank | 4 comment | 2 complexity | 8d221d8166121024c23ce21c8f24deab MD5 | raw file
  1"""
  2Tests for uu module.
  3Nick Mathewson
  4"""
  5
  6import unittest
  7from test import test_support
  8
  9import sys, os, uu, cStringIO
 10import uu
 11
 12plaintext = "The smooth-scaled python crept over the sleeping dog\n"
 13
 14encodedtext = """\
 15M5&AE('-M;V]T:\"US8V%L960@<'ET:&]N(&-R97!T(&]V97(@=&AE('-L965P
 16(:6YG(&1O9PH """
 17
 18encodedtextwrapped = "begin %03o %s\n" + encodedtext.replace("%", "%%") + "\n \nend\n"
 19
 20class UUTest(unittest.TestCase):
 21
 22    def test_encode(self):
 23        inp = cStringIO.StringIO(plaintext)
 24        out = cStringIO.StringIO()
 25        uu.encode(inp, out, "t1")
 26        self.assertEqual(out.getvalue(), encodedtextwrapped % (0666, "t1"))
 27        inp = cStringIO.StringIO(plaintext)
 28        out = cStringIO.StringIO()
 29        uu.encode(inp, out, "t1", 0644)
 30        self.assertEqual(out.getvalue(), encodedtextwrapped % (0644, "t1"))
 31
 32    def test_decode(self):
 33        inp = cStringIO.StringIO(encodedtextwrapped % (0666, "t1"))
 34        out = cStringIO.StringIO()
 35        uu.decode(inp, out)
 36        self.assertEqual(out.getvalue(), plaintext)
 37        inp = cStringIO.StringIO(
 38            "UUencoded files may contain many lines,\n" +
 39            "even some that have 'begin' in them.\n" +
 40            encodedtextwrapped % (0666, "t1")
 41        )
 42        out = cStringIO.StringIO()
 43        uu.decode(inp, out)
 44        self.assertEqual(out.getvalue(), plaintext)
 45
 46    def test_truncatedinput(self):
 47        inp = cStringIO.StringIO("begin 644 t1\n" + encodedtext)
 48        out = cStringIO.StringIO()
 49        try:
 50            uu.decode(inp, out)
 51            self.fail("No exception thrown")
 52        except uu.Error, e:
 53            self.assertEqual(str(e), "Truncated input file")
 54
 55    def test_missingbegin(self):
 56        inp = cStringIO.StringIO("")
 57        out = cStringIO.StringIO()
 58        try:
 59            uu.decode(inp, out)
 60            self.fail("No exception thrown")
 61        except uu.Error, e:
 62            self.assertEqual(str(e), "No valid begin line found in input file")
 63
 64class UUStdIOTest(unittest.TestCase):
 65
 66    def setUp(self):
 67        self.stdin = sys.stdin
 68        self.stdout = sys.stdout
 69
 70    def tearDown(self):
 71        sys.stdin = self.stdin
 72        sys.stdout = self.stdout
 73
 74    def test_encode(self):
 75        sys.stdin = cStringIO.StringIO(plaintext)
 76        sys.stdout = cStringIO.StringIO()
 77        uu.encode("-", "-", "t1", 0666)
 78        self.assertEqual(
 79            sys.stdout.getvalue(),
 80            encodedtextwrapped % (0666, "t1")
 81        )
 82
 83    def test_decode(self):
 84        sys.stdin = cStringIO.StringIO(encodedtextwrapped % (0666, "t1"))
 85        sys.stdout = cStringIO.StringIO()
 86        uu.decode("-", "-")
 87        self.assertEqual(sys.stdout.getvalue(), plaintext)
 88
 89class UUFileTest(unittest.TestCase):
 90
 91    def _kill(self, f):
 92        # close and remove file
 93        try:
 94            f.close()
 95        except (SystemExit, KeyboardInterrupt):
 96            raise
 97        except:
 98            pass
 99        try:
100            os.unlink(f.name)
101        except (SystemExit, KeyboardInterrupt):
102            raise
103        except:
104            pass
105
106    def setUp(self):
107        self.tmpin  = test_support.TESTFN + "i"
108        self.tmpout = test_support.TESTFN + "o"
109
110    def tearDown(self):
111        del self.tmpin
112        del self.tmpout
113
114    def test_encode(self):
115        fin = fout = None
116        try:
117            test_support.unlink(self.tmpin)
118            fin = open(self.tmpin, 'wb')
119            fin.write(plaintext)
120            fin.close()
121
122            fin = open(self.tmpin, 'rb')
123            fout = open(self.tmpout, 'w')
124            uu.encode(fin, fout, self.tmpin, mode=0644)
125            fin.close()
126            fout.close()
127
128            fout = open(self.tmpout, 'r')
129            s = fout.read()
130            fout.close()
131            self.assertEqual(s, encodedtextwrapped % (0644, self.tmpin))
132
133            # in_file and out_file as filenames
134            uu.encode(self.tmpin, self.tmpout, self.tmpin, mode=0644)
135            fout = open(self.tmpout, 'r')
136            s = fout.read()
137            fout.close()
138            self.assertEqual(s, encodedtextwrapped % (0644, self.tmpin))
139
140        finally:
141            self._kill(fin)
142            self._kill(fout)
143
144    def test_decode(self):
145        f = None
146        try:
147            test_support.unlink(self.tmpin)
148            f = open(self.tmpin, 'w')
149            f.write(encodedtextwrapped % (0644, self.tmpout))
150            f.close()
151
152            f = open(self.tmpin, 'r')
153            uu.decode(f)
154            f.close()
155
156            f = open(self.tmpout, 'r')
157            s = f.read()
158            f.close()
159            self.assertEqual(s, plaintext)
160            # XXX is there an xp way to verify the mode?
161        finally:
162            self._kill(f)
163
164    def test_decodetwice(self):
165        # Verify that decode() will refuse to overwrite an existing file
166        f = None
167        try:
168            f = cStringIO.StringIO(encodedtextwrapped % (0644, self.tmpout))
169
170            f = open(self.tmpin, 'r')
171            uu.decode(f)
172            f.close()
173
174            f = open(self.tmpin, 'r')
175            self.assertRaises(uu.Error, uu.decode, f)
176            f.close()
177        finally:
178            self._kill(f)
179
180def test_main():
181    test_support.run_unittest(UUTest, UUStdIOTest, UUFileTest)
182
183if __name__=="__main__":
184    test_main()