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