17db96d56Sopenharmony_ci# Copyright (C) 2002-2004 Python Software Foundation
27db96d56Sopenharmony_ci#
37db96d56Sopenharmony_ci# A torture test of the email package.  This should not be run as part of the
47db96d56Sopenharmony_ci# standard Python test suite since it requires several meg of email messages
57db96d56Sopenharmony_ci# collected in the wild.  These source messages are not checked into the
67db96d56Sopenharmony_ci# Python distro, but are available as part of the standalone email package at
77db96d56Sopenharmony_ci# http://sf.net/projects/mimelib
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ciimport sys
107db96d56Sopenharmony_ciimport os
117db96d56Sopenharmony_ciimport unittest
127db96d56Sopenharmony_cifrom io import StringIO
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_cifrom test.test_email import TestEmailBase
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ciimport email
177db96d56Sopenharmony_cifrom email import __file__ as testfile
187db96d56Sopenharmony_cifrom email.iterators import _structure
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_cidef openfile(filename):
217db96d56Sopenharmony_ci    from os.path import join, dirname, abspath
227db96d56Sopenharmony_ci    path = abspath(join(dirname(testfile), os.pardir, 'moredata', filename))
237db96d56Sopenharmony_ci    return open(path, 'r')
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci# Prevent this test from running in the Python distro
267db96d56Sopenharmony_cidef setUpModule():
277db96d56Sopenharmony_ci    try:
287db96d56Sopenharmony_ci        openfile('crispin-torture.txt')
297db96d56Sopenharmony_ci    except OSError:
307db96d56Sopenharmony_ci        raise unittest.SkipTest
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ciclass TortureBase(TestEmailBase):
357db96d56Sopenharmony_ci    def _msgobj(self, filename):
367db96d56Sopenharmony_ci        fp = openfile(filename)
377db96d56Sopenharmony_ci        try:
387db96d56Sopenharmony_ci            msg = email.message_from_file(fp)
397db96d56Sopenharmony_ci        finally:
407db96d56Sopenharmony_ci            fp.close()
417db96d56Sopenharmony_ci        return msg
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ciclass TestCrispinTorture(TortureBase):
467db96d56Sopenharmony_ci    # Mark Crispin's torture test from the SquirrelMail project
477db96d56Sopenharmony_ci    def test_mondo_message(self):
487db96d56Sopenharmony_ci        eq = self.assertEqual
497db96d56Sopenharmony_ci        neq = self.ndiffAssertEqual
507db96d56Sopenharmony_ci        msg = self._msgobj('crispin-torture.txt')
517db96d56Sopenharmony_ci        payload = msg.get_payload()
527db96d56Sopenharmony_ci        eq(type(payload), list)
537db96d56Sopenharmony_ci        eq(len(payload), 12)
547db96d56Sopenharmony_ci        eq(msg.preamble, None)
557db96d56Sopenharmony_ci        eq(msg.epilogue, '\n')
567db96d56Sopenharmony_ci        # Probably the best way to verify the message is parsed correctly is to
577db96d56Sopenharmony_ci        # dump its structure and compare it against the known structure.
587db96d56Sopenharmony_ci        fp = StringIO()
597db96d56Sopenharmony_ci        _structure(msg, fp=fp)
607db96d56Sopenharmony_ci        neq(fp.getvalue(), """\
617db96d56Sopenharmony_cimultipart/mixed
627db96d56Sopenharmony_ci    text/plain
637db96d56Sopenharmony_ci    message/rfc822
647db96d56Sopenharmony_ci        multipart/alternative
657db96d56Sopenharmony_ci            text/plain
667db96d56Sopenharmony_ci            multipart/mixed
677db96d56Sopenharmony_ci                text/richtext
687db96d56Sopenharmony_ci            application/andrew-inset
697db96d56Sopenharmony_ci    message/rfc822
707db96d56Sopenharmony_ci        audio/basic
717db96d56Sopenharmony_ci    audio/basic
727db96d56Sopenharmony_ci    image/pbm
737db96d56Sopenharmony_ci    message/rfc822
747db96d56Sopenharmony_ci        multipart/mixed
757db96d56Sopenharmony_ci            multipart/mixed
767db96d56Sopenharmony_ci                text/plain
777db96d56Sopenharmony_ci                audio/x-sun
787db96d56Sopenharmony_ci            multipart/mixed
797db96d56Sopenharmony_ci                image/gif
807db96d56Sopenharmony_ci                image/gif
817db96d56Sopenharmony_ci                application/x-be2
827db96d56Sopenharmony_ci                application/atomicmail
837db96d56Sopenharmony_ci            audio/x-sun
847db96d56Sopenharmony_ci    message/rfc822
857db96d56Sopenharmony_ci        multipart/mixed
867db96d56Sopenharmony_ci            text/plain
877db96d56Sopenharmony_ci            image/pgm
887db96d56Sopenharmony_ci            text/plain
897db96d56Sopenharmony_ci    message/rfc822
907db96d56Sopenharmony_ci        multipart/mixed
917db96d56Sopenharmony_ci            text/plain
927db96d56Sopenharmony_ci            image/pbm
937db96d56Sopenharmony_ci    message/rfc822
947db96d56Sopenharmony_ci        application/postscript
957db96d56Sopenharmony_ci    image/gif
967db96d56Sopenharmony_ci    message/rfc822
977db96d56Sopenharmony_ci        multipart/mixed
987db96d56Sopenharmony_ci            audio/basic
997db96d56Sopenharmony_ci            audio/basic
1007db96d56Sopenharmony_ci    message/rfc822
1017db96d56Sopenharmony_ci        multipart/mixed
1027db96d56Sopenharmony_ci            application/postscript
1037db96d56Sopenharmony_ci            text/plain
1047db96d56Sopenharmony_ci            message/rfc822
1057db96d56Sopenharmony_ci                multipart/mixed
1067db96d56Sopenharmony_ci                    text/plain
1077db96d56Sopenharmony_ci                    multipart/parallel
1087db96d56Sopenharmony_ci                        image/gif
1097db96d56Sopenharmony_ci                        audio/basic
1107db96d56Sopenharmony_ci                    application/atomicmail
1117db96d56Sopenharmony_ci                    message/rfc822
1127db96d56Sopenharmony_ci                        audio/x-sun
1137db96d56Sopenharmony_ci""")
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_cidef _testclasses():
1167db96d56Sopenharmony_ci    mod = sys.modules[__name__]
1177db96d56Sopenharmony_ci    return [getattr(mod, name) for name in dir(mod) if name.startswith('Test')]
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_cidef load_tests(loader, tests, pattern):
1217db96d56Sopenharmony_ci    suite = loader.suiteClass()
1227db96d56Sopenharmony_ci    for testclass in _testclasses():
1237db96d56Sopenharmony_ci        suite.addTest(loader.loadTestsFromTestCase(testclass))
1247db96d56Sopenharmony_ci    return suite
1257db96d56Sopenharmony_ci
1267db96d56Sopenharmony_ciif __name__ == "__main__":
1277db96d56Sopenharmony_ci    unittest.main()
128