| # 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, run_unittest |
| |
| 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(): |
| run_unittest(testclass) |
| |
| |
| |
| if __name__ == '__main__': |
| unittest.main(defaultTest='suite') |