# Copyright (C) 2002-2004 Python Software Foundation

#

# A torture test of the email package.  This should not be run as part of the

# standard Python test suite since it requires several meg of email messages

# collected in the wild.  These source messages are not checked into the

# Python distro, but are available as part of the standalone email package at

# http://sf.net/projects/mimelib



import sys

import os

import unittest

from cStringIO import StringIO

from types import ListType



from email.test.test_email import TestEmailBase

from test.test_support import TestSkipped



import email

from email import __file__ as testfile

from email.iterators import _structure



def openfile(filename):

    from os.path import join, dirname, abspath

    path = abspath(join(dirname(testfile), os.pardir, 'moredata', filename))

    return open(path, 'r')



# Prevent this test from running in the Python distro

try:

    openfile('crispin-torture.txt')

except IOError:

    raise TestSkipped







class TortureBase(TestEmailBase):

    def _msgobj(self, filename):

        fp = openfile(filename)

        try:

            msg = email.message_from_file(fp)

        finally:

            fp.close()

        return msg







class TestCrispinTorture(TortureBase):

    # Mark Crispin's torture test from the SquirrelMail project

    def test_mondo_message(self):

        eq = self.assertEqual

        neq = self.ndiffAssertEqual

        msg = self._msgobj('crispin-torture.txt')

        payload = msg.get_payload()

        eq(type(payload), ListType)

        eq(len(payload), 12)

        eq(msg.preamble, None)

        eq(msg.epilogue, '\n')

        # Probably the best way to verify the message is parsed correctly is to

        # dump its structure and compare it against the known structure.

        fp = StringIO()

        _structure(msg, fp=fp)

        neq(fp.getvalue(), """\

multipart/mixed

    text/plain

    message/rfc822

        multipart/alternative

            text/plain

            multipart/mixed

                text/richtext

            application/andrew-inset

    message/rfc822

        audio/basic

    audio/basic

    image/pbm

    message/rfc822

        multipart/mixed

            multipart/mixed

                text/plain

                audio/x-sun

            multipart/mixed

                image/gif

                image/gif

                application/x-be2

                application/atomicmail

            audio/x-sun

    message/rfc822

        multipart/mixed

            text/plain

            image/pgm

            text/plain

    message/rfc822

        multipart/mixed

            text/plain

            image/pbm

    message/rfc822

        application/postscript

    image/gif

    message/rfc822

        multipart/mixed

            audio/basic

            audio/basic

    message/rfc822

        multipart/mixed

            application/postscript

            text/plain

            message/rfc822

                multipart/mixed

                    text/plain

                    multipart/parallel

                        image/gif

                        audio/basic

                    application/atomicmail

                    message/rfc822

                        audio/x-sun

""")





def _testclasses():

    mod = sys.modules[__name__]

    return [getattr(mod, name) for name in dir(mod) if name.startswith('Test')]





def suite():

    suite = unittest.TestSuite()

    for testclass in _testclasses():

        suite.addTest(unittest.makeSuite(testclass))

    return suite





def test_main():

    for testclass in _testclasses():

        test_support.run_unittest(testclass)







if __name__ == '__main__':

    unittest.main(defaultTest='suite')

