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