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