14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Copyright (C) 2002-2004 Python Software Foundation
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# A torture test of the email package.  This should not be run as part of the
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# standard Python test suite since it requires several meg of email messages
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# collected in the wild.  These source messages are not checked into the
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Python distro, but are available as part of the standalone email package at
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# http://sf.net/projects/mimelib
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport sys
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport os
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom cStringIO import StringIO
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom types import ListType
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom email.test.test_email import TestEmailBase
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test.test_support import TestSkipped, run_unittest
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport email
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom email import __file__ as testfile
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom email.iterators import _structure
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef openfile(filename):
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    from os.path import join, dirname, abspath
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    path = abspath(join(dirname(testfile), os.pardir, 'moredata', filename))
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return open(path, 'r')
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Prevent this test from running in the Python distro
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtry:
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    openfile('crispin-torture.txt')
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcept IOError:
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    raise TestSkipped
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TortureBase(TestEmailBase):
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def _msgobj(self, filename):
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fp = openfile(filename)
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            msg = email.message_from_file(fp)
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        finally:
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            fp.close()
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return msg
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestCrispinTorture(TortureBase):
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Mark Crispin's torture test from the SquirrelMail project
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_mondo_message(self):
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        eq = self.assertEqual
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        neq = self.ndiffAssertEqual
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        msg = self._msgobj('crispin-torture.txt')
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        payload = msg.get_payload()
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        eq(type(payload), ListType)
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        eq(len(payload), 12)
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        eq(msg.preamble, None)
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        eq(msg.epilogue, '\n')
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Probably the best way to verify the message is parsed correctly is to
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # dump its structure and compare it against the known structure.
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fp = StringIO()
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        _structure(msg, fp=fp)
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        neq(fp.getvalue(), """\
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmultipart/mixed
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    text/plain
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    message/rfc822
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        multipart/alternative
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            text/plain
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            multipart/mixed
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                text/richtext
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            application/andrew-inset
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    message/rfc822
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        audio/basic
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    audio/basic
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    image/pbm
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    message/rfc822
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        multipart/mixed
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            multipart/mixed
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                text/plain
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                audio/x-sun
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            multipart/mixed
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                image/gif
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                image/gif
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                application/x-be2
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                application/atomicmail
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            audio/x-sun
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    message/rfc822
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        multipart/mixed
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            text/plain
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            image/pgm
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            text/plain
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    message/rfc822
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        multipart/mixed
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            text/plain
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            image/pbm
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    message/rfc822
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        application/postscript
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    image/gif
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    message/rfc822
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        multipart/mixed
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            audio/basic
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            audio/basic
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    message/rfc822
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        multipart/mixed
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            application/postscript
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            text/plain
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            message/rfc822
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                multipart/mixed
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    text/plain
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    multipart/parallel
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        image/gif
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        audio/basic
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    application/atomicmail
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    message/rfc822
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        audio/x-sun
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm""")
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef _testclasses():
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    mod = sys.modules[__name__]
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return [getattr(mod, name) for name in dir(mod) if name.startswith('Test')]
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef suite():
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    suite = unittest.TestSuite()
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for testclass in _testclasses():
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite.addTest(unittest.makeSuite(testclass))
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return suite
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_main():
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for testclass in _testclasses():
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        run_unittest(testclass)
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == '__main__':
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unittest.main(defaultTest='suite')
137