1# This set of tests exercises the backward-compatibility class 2# in mailbox.py (the ones without write support). 3 4import mailbox 5import os 6import time 7import unittest 8from test import test_support 9 10# cleanup earlier tests 11try: 12 os.unlink(test_support.TESTFN) 13except os.error: 14 pass 15 16FROM_ = "From some.body@dummy.domain Sat Jul 24 13:43:35 2004\n" 17DUMMY_MESSAGE = """\ 18From: some.body@dummy.domain 19To: me@my.domain 20Subject: Simple Test 21 22This is a dummy message. 23""" 24 25class MaildirTestCase(unittest.TestCase): 26 27 def setUp(self): 28 # create a new maildir mailbox to work with: 29 self._dir = test_support.TESTFN 30 os.mkdir(self._dir) 31 os.mkdir(os.path.join(self._dir, "cur")) 32 os.mkdir(os.path.join(self._dir, "tmp")) 33 os.mkdir(os.path.join(self._dir, "new")) 34 self._counter = 1 35 self._msgfiles = [] 36 37 def tearDown(self): 38 map(os.unlink, self._msgfiles) 39 os.rmdir(os.path.join(self._dir, "cur")) 40 os.rmdir(os.path.join(self._dir, "tmp")) 41 os.rmdir(os.path.join(self._dir, "new")) 42 os.rmdir(self._dir) 43 44 def createMessage(self, dir, mbox=False): 45 t = int(time.time() % 1000000) 46 pid = self._counter 47 self._counter += 1 48 filename = os.extsep.join((str(t), str(pid), "myhostname", "mydomain")) 49 tmpname = os.path.join(self._dir, "tmp", filename) 50 newname = os.path.join(self._dir, dir, filename) 51 with open(tmpname, "w") as fp: 52 self._msgfiles.append(tmpname) 53 if mbox: 54 fp.write(FROM_) 55 fp.write(DUMMY_MESSAGE) 56 if hasattr(os, "link"): 57 os.link(tmpname, newname) 58 else: 59 with open(newname, "w") as fp: 60 fp.write(DUMMY_MESSAGE) 61 self._msgfiles.append(newname) 62 return tmpname 63 64 def test_empty_maildir(self): 65 """Test an empty maildir mailbox""" 66 # Test for regression on bug #117490: 67 self.mbox = mailbox.Maildir(test_support.TESTFN) 68 self.assertTrue(len(self.mbox) == 0) 69 self.assertTrue(self.mbox.next() is None) 70 self.assertTrue(self.mbox.next() is None) 71 72 def test_nonempty_maildir_cur(self): 73 self.createMessage("cur") 74 self.mbox = mailbox.Maildir(test_support.TESTFN) 75 self.assertTrue(len(self.mbox) == 1) 76 msg = self.mbox.next() 77 self.assertTrue(msg is not None) 78 msg.fp.close() 79 self.assertTrue(self.mbox.next() is None) 80 self.assertTrue(self.mbox.next() is None) 81 82 def test_nonempty_maildir_new(self): 83 self.createMessage("new") 84 self.mbox = mailbox.Maildir(test_support.TESTFN) 85 self.assertTrue(len(self.mbox) == 1) 86 msg = self.mbox.next() 87 self.assertTrue(msg is not None) 88 msg.fp.close() 89 self.assertTrue(self.mbox.next() is None) 90 self.assertTrue(self.mbox.next() is None) 91 92 def test_nonempty_maildir_both(self): 93 self.createMessage("cur") 94 self.createMessage("new") 95 self.mbox = mailbox.Maildir(test_support.TESTFN) 96 self.assertTrue(len(self.mbox) == 2) 97 msg = self.mbox.next() 98 self.assertTrue(msg is not None) 99 msg.fp.close() 100 msg = self.mbox.next() 101 self.assertTrue(msg is not None) 102 msg.fp.close() 103 self.assertTrue(self.mbox.next() is None) 104 self.assertTrue(self.mbox.next() is None) 105 106 def test_unix_mbox(self): 107 ### should be better! 108 import email.parser 109 fname = self.createMessage("cur", True) 110 n = 0 111 with open(fname) as f: 112 for msg in mailbox.PortableUnixMailbox(f, 113 email.parser.Parser().parse): 114 n += 1 115 self.assertEqual(msg["subject"], "Simple Test") 116 self.assertEqual(len(str(msg)), len(FROM_)+len(DUMMY_MESSAGE)) 117 self.assertEqual(n, 1) 118 119class MboxTestCase(unittest.TestCase): 120 def setUp(self): 121 # create a new maildir mailbox to work with: 122 self._path = test_support.TESTFN 123 124 def tearDown(self): 125 os.unlink(self._path) 126 127 def test_from_regex (self): 128 # Testing new regex from bug #1633678 129 with open(self._path, 'w') as f: 130 f.write("""From fred@example.com Mon May 31 13:24:50 2004 +0200 131Subject: message 1 132 133body1 134From fred@example.com Mon May 31 13:24:50 2004 -0200 135Subject: message 2 136 137body2 138From fred@example.com Mon May 31 13:24:50 2004 139Subject: message 3 140 141body3 142From fred@example.com Mon May 31 13:24:50 2004 143Subject: message 4 144 145body4 146""") 147 with open(self._path, 'r') as f: 148 box = mailbox.UnixMailbox(f) 149 self.assertTrue(len(list(iter(box))) == 4) 150 151 152 # XXX We still need more tests! 153 154 155def test_main(): 156 test_support.run_unittest(MaildirTestCase, MboxTestCase) 157 158 159if __name__ == "__main__": 160 test_main() 161