""" Tests for uu module. Nick Mathewson """ from test_support import verify, TestFailed, verbose, TESTFN import sys, os import uu from StringIO import StringIO teststr = "The smooth-scaled python crept over the sleeping dog\n" expected = """\ M5&AE('-M;V]T:\"US8V%L960@<'ET:&]N(&-R97!T(&]V97(@=&AE('-L965P (:6YG(&1O9PH """ encoded1 = "begin 666 t1\n"+expected+"\n \nend\n" if verbose: print '1. encode file->file' inp = StringIO(teststr) out = StringIO() uu.encode(inp, out, "t1") verify(out.getvalue() == encoded1) inp = StringIO(teststr) out = StringIO() uu.encode(inp, out, "t1", 0644) verify(out.getvalue() == "begin 644 t1\n"+expected+"\n \nend\n") if verbose: print '2. decode file->file' inp = StringIO(encoded1) out = StringIO() uu.decode(inp, out) verify(out.getvalue() == teststr) inp = StringIO("""UUencoded files may contain many lines, even some that have 'begin' in them.\n"""+encoded1) out = StringIO() uu.decode(inp, out) verify(out.getvalue() == teststr) stdinsave = sys.stdin stdoutsave = sys.stdout try: if verbose: print '3. encode stdin->stdout' sys.stdin = StringIO(teststr) sys.stdout = StringIO() uu.encode("-", "-", "t1", 0666) verify(sys.stdout.getvalue() == encoded1) if verbose: print >>stdoutsave, '4. decode stdin->stdout' sys.stdin = StringIO(encoded1) sys.stdout = StringIO() uu.decode("-", "-") verify(sys.stdout.getvalue() == teststr) finally: sys.stdin = stdinsave sys.stdout = stdoutsave if verbose: print '5. encode file->file' tmpIn = TESTFN + "i" tmpOut = TESTFN + "o" try: fin = open(tmpIn, 'wb') fin.write(teststr) fin.close() fin = open(tmpIn, 'rb') fout = open(tmpOut, 'w') uu.encode(fin, fout, tmpIn, mode=0644) fin.close() fout.close() fout = open(tmpOut, 'r') s = fout.read() fout.close() verify(s == 'begin 644 ' + tmpIn + '\n' + expected + '\n \nend\n') os.unlink(tmpIn) if verbose: print '6. decode file-> file' uu.decode(tmpOut) fin = open(tmpIn, 'rb') s = fin.read() fin.close() verify(s == teststr) # XXX is there an xp way to verify the mode? finally: try: fin.close() except: pass try: fout.close() except: pass try: os.unlink(tmpIn) except: pass try: os.unlink(tmpOut) except: pass if verbose: print '7. error: truncated input' inp = StringIO("begin 644 t1\n"+expected) out = StringIO() try: uu.decode(inp, out) raise TestFailed("No exception thrown") except uu.Error, e: verify(str(e) == 'Truncated input file') if verbose: print '8. error: missing begin' inp = StringIO("") out = StringIO() try: uu.decode(inp, out) raise TestFailed("No exception thrown") except uu.Error, e: verify(str(e) == 'No valid begin line found in input file') # Test to verify that decode() will refuse to overwrite an existing file import tempfile outfile = tempfile.mktemp() inp = StringIO('Here is a message to be uuencoded') out = StringIO() uu.encode(inp, out, outfile) out.seek(0) try: if verbose: print '9. decode w/file not exists is okay' uu.decode(out) if not os.path.exists(outfile): raise TestFailed('uudecode w/ out_file=None failed') fp = open(outfile) data = fp.read() fp.close() if data <> inp.getvalue(): raise TestFailed('uudecode stored something weird') # Try to write it again, which should cause a failure if verbose: print '10. uudecode w/file exists fails' out.seek(0) try: uu.decode(out) except uu.Error: pass else: raise TestFailed('expected to get a "file exists" error') finally: try: os.unlink(outfile) except OSError: pass