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