14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Copyright (C) 2002-2004 Python Software Foundation
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# A torture test of the email package.  This should not be run as part of the
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# standard Python test suite since it requires several meg of email messages
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# collected in the wild.  These source messages are not checked into the
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Python distro, but are available as part of the standalone email package at
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# http://sf.net/projects/mimelib
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport sys
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom cStringIO import StringIO
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom types import ListType
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom email.test.test_email import TestEmailBase
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test.test_support import TestSkipped, run_unittest
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport email
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom email import __file__ as testfile
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom email.iterators import _structure
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef openfile(filename):
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from os.path import join, dirname, abspath
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    path = abspath(join(dirname(testfile), os.pardir, 'moredata', filename))
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return open(path, 'r')
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Prevent this test from running in the Python distro
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry:
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    openfile('crispin-torture.txt')
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept IOError:
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    raise TestSkipped
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TortureBase(TestEmailBase):
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _msgobj(self, filename):
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        fp = openfile(filename)
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            msg = email.message_from_file(fp)
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        finally:
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            fp.close()
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return msg
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestCrispinTorture(TortureBase):
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Mark Crispin's torture test from the SquirrelMail project
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_mondo_message(self):
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq = self.assertEqual
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        neq = self.ndiffAssertEqual
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        msg = self._msgobj('crispin-torture.txt')
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        payload = msg.get_payload()
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(type(payload), ListType)
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(len(payload), 12)
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(msg.preamble, None)
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(msg.epilogue, '\n')
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Probably the best way to verify the message is parsed correctly is to
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # dump its structure and compare it against the known structure.
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        fp = StringIO()
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        _structure(msg, fp=fp)
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        neq(fp.getvalue(), """\
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaomultipart/mixed
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    text/plain
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    message/rfc822
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        multipart/alternative
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            text/plain
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            multipart/mixed
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                text/richtext
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            application/andrew-inset
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    message/rfc822
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        audio/basic
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    audio/basic
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    image/pbm
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    message/rfc822
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        multipart/mixed
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            multipart/mixed
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                text/plain
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                audio/x-sun
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            multipart/mixed
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                image/gif
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                image/gif
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                application/x-be2
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                application/atomicmail
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            audio/x-sun
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    message/rfc822
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        multipart/mixed
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            text/plain
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            image/pgm
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            text/plain
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    message/rfc822
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        multipart/mixed
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            text/plain
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            image/pbm
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    message/rfc822
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        application/postscript
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    image/gif
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    message/rfc822
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        multipart/mixed
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            audio/basic
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            audio/basic
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    message/rfc822
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        multipart/mixed
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            application/postscript
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            text/plain
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            message/rfc822
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                multipart/mixed
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    text/plain
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    multipart/parallel
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        image/gif
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        audio/basic
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    application/atomicmail
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    message/rfc822
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        audio/x-sun
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao""")
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef _testclasses():
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    mod = sys.modules[__name__]
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return [getattr(mod, name) for name in dir(mod) if name.startswith('Test')]
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef suite():
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    suite = unittest.TestSuite()
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for testclass in _testclasses():
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        suite.addTest(unittest.makeSuite(testclass))
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return suite
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_main():
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for testclass in _testclasses():
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        run_unittest(testclass)
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == '__main__':
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    unittest.main(defaultTest='suite')
137