10c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# This set of tests exercises the backward-compatibility class 20c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# in mailbox.py (the ones without write support). 30c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport mailbox 50c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport os 60c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport time 70c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport unittest 80c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom test import test_support 90c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# cleanup earlier tests 110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitry: 120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.unlink(test_support.TESTFN) 130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiexcept os.error: 140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiFROM_ = "From some.body@dummy.domain Sat Jul 24 13:43:35 2004\n" 170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiDUMMY_MESSAGE = """\ 180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiFrom: some.body@dummy.domain 190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiTo: me@my.domain 200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiSubject: Simple Test 210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiThis is a dummy message. 230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi""" 240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass MaildirTestCase(unittest.TestCase): 260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def setUp(self): 280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # create a new maildir mailbox to work with: 290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._dir = test_support.TESTFN 300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.mkdir(self._dir) 310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.mkdir(os.path.join(self._dir, "cur")) 320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.mkdir(os.path.join(self._dir, "tmp")) 330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.mkdir(os.path.join(self._dir, "new")) 340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._counter = 1 350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._msgfiles = [] 360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def tearDown(self): 380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi map(os.unlink, self._msgfiles) 390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(os.path.join(self._dir, "cur")) 400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(os.path.join(self._dir, "tmp")) 410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(os.path.join(self._dir, "new")) 420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(self._dir) 430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def createMessage(self, dir, mbox=False): 450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi t = int(time.time() % 1000000) 460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pid = self._counter 470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._counter += 1 480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi filename = os.extsep.join((str(t), str(pid), "myhostname", "mydomain")) 490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tmpname = os.path.join(self._dir, "tmp", filename) 500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi newname = os.path.join(self._dir, dir, filename) 510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with open(tmpname, "w") as fp: 520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._msgfiles.append(tmpname) 530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if mbox: 540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi fp.write(FROM_) 550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi fp.write(DUMMY_MESSAGE) 560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if hasattr(os, "link"): 570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.link(tmpname, newname) 580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with open(newname, "w") as fp: 600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi fp.write(DUMMY_MESSAGE) 610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._msgfiles.append(newname) 620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return tmpname 630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_empty_maildir(self): 650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Test an empty maildir mailbox""" 660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test for regression on bug #117490: 670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.mbox = mailbox.Maildir(test_support.TESTFN) 680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(len(self.mbox) == 0) 690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(self.mbox.next() is None) 700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(self.mbox.next() is None) 710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_nonempty_maildir_cur(self): 730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.createMessage("cur") 740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.mbox = mailbox.Maildir(test_support.TESTFN) 750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(len(self.mbox) == 1) 760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi msg = self.mbox.next() 770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(msg is not None) 780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi msg.fp.close() 790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(self.mbox.next() is None) 800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(self.mbox.next() is None) 810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_nonempty_maildir_new(self): 830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.createMessage("new") 840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.mbox = mailbox.Maildir(test_support.TESTFN) 850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(len(self.mbox) == 1) 860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi msg = self.mbox.next() 870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(msg is not None) 880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi msg.fp.close() 890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(self.mbox.next() is None) 900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(self.mbox.next() is None) 910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_nonempty_maildir_both(self): 930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.createMessage("cur") 940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.createMessage("new") 950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.mbox = mailbox.Maildir(test_support.TESTFN) 960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(len(self.mbox) == 2) 970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi msg = self.mbox.next() 980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(msg is not None) 990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi msg.fp.close() 1000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi msg = self.mbox.next() 1010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(msg is not None) 1020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi msg.fp.close() 1030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(self.mbox.next() is None) 1040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(self.mbox.next() is None) 1050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_unix_mbox(self): 1070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ### should be better! 1080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import email.parser 1090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi fname = self.createMessage("cur", True) 1100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi n = 0 1110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with open(fname) as f: 1120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for msg in mailbox.PortableUnixMailbox(f, 1130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi email.parser.Parser().parse): 1140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi n += 1 1150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(msg["subject"], "Simple Test") 1160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(len(str(msg)), len(FROM_)+len(DUMMY_MESSAGE)) 1170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(n, 1) 1180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass MboxTestCase(unittest.TestCase): 1200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def setUp(self): 1210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # create a new maildir mailbox to work with: 1220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._path = test_support.TESTFN 1230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def tearDown(self): 1250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.unlink(self._path) 1260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_from_regex (self): 1280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing new regex from bug #1633678 1290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with open(self._path, 'w') as f: 1300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write("""From fred@example.com Mon May 31 13:24:50 2004 +0200 1310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiSubject: message 1 1320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yibody1 1340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiFrom fred@example.com Mon May 31 13:24:50 2004 -0200 1350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiSubject: message 2 1360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yibody2 1380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiFrom fred@example.com Mon May 31 13:24:50 2004 1390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiSubject: message 3 1400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yibody3 1420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiFrom fred@example.com Mon May 31 13:24:50 2004 1430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiSubject: message 4 1440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yibody4 1460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi""") 1470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with open(self._path, 'r') as f: 1480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi box = mailbox.UnixMailbox(f) 1490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(len(list(iter(box))) == 4) 1500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # XXX We still need more tests! 1530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef test_main(): 1560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_support.run_unittest(MaildirTestCase, MboxTestCase) 1570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif __name__ == "__main__": 1600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_main() 161