home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 14 / hacker14.iso / programacao / pythonwin / python.exe / TEST_EMAIL_TORTURE.PY < prev    next >
Encoding:
Python Source  |  2002-10-07  |  3.7 KB  |  137 lines

  1. # Copyright (C) 2002 Python Software Foundation
  2. #
  3. # A torture test of the email package.  This should not be run as part of the
  4. # standard Python test suite since it requires several meg of email messages
  5. # collected in the wild.  These source messages are not checked into the
  6. # Python distro, but are available as part of the standalone email package at
  7. # http://sf.net/projects/mimelib
  8.  
  9. import sys
  10. import os
  11. import unittest
  12. from cStringIO import StringIO
  13. from types import ListType
  14.  
  15. from email.test.test_email import TestEmailBase
  16. from test.test_support import TestSkipped
  17.  
  18. import email
  19. from email import __file__ as testfile
  20. from email.Iterators import _structure
  21.  
  22. def openfile(filename):
  23.     from os.path import join, dirname, abspath
  24.     path = abspath(join(dirname(testfile), os.pardir, 'moredata', filename))
  25.     return open(path, 'r')
  26.  
  27. # Prevent this test from running in the Python distro
  28. try:
  29.     openfile('crispin-torture.txt')
  30. except IOError:
  31.     raise TestSkipped
  32.  
  33.  
  34.  
  35. class TortureBase(TestEmailBase):
  36.     def _msgobj(self, filename):
  37.         fp = openfile(filename)
  38.         try:
  39.             msg = email.message_from_file(fp)
  40.         finally:
  41.             fp.close()
  42.         return msg
  43.  
  44.  
  45.  
  46. class TestCrispinTorture(TortureBase):
  47.     # Mark Crispin's torture test from the SquirrelMail project
  48.     def test_mondo_message(self):
  49.         eq = self.assertEqual
  50.         neq = self.ndiffAssertEqual
  51.         msg = self._msgobj('crispin-torture.txt')
  52.         payload = msg.get_payload()
  53.         eq(type(payload), ListType)
  54.         eq(len(payload), 12)
  55.         eq(msg.preamble, None)
  56.         eq(msg.epilogue, '\n\n')
  57.         # Probably the best way to verify the message is parsed correctly is to
  58.         # dump its structure and compare it against the known structure.
  59.         fp = StringIO()
  60.         _structure(msg, fp=fp)
  61.         neq(fp.getvalue(), """\
  62. multipart/mixed
  63.     text/plain
  64.     message/rfc822
  65.         multipart/alternative
  66.             text/plain
  67.             multipart/mixed
  68.                 text/richtext
  69.             application/andrew-inset
  70.     message/rfc822
  71.         audio/basic
  72.     audio/basic
  73.     image/pbm
  74.     message/rfc822
  75.         multipart/mixed
  76.             multipart/mixed
  77.                 text/plain
  78.                 audio/x-sun
  79.             multipart/mixed
  80.                 image/gif
  81.                 image/gif
  82.                 application/x-be2
  83.                 application/atomicmail
  84.             audio/x-sun
  85.     message/rfc822
  86.         multipart/mixed
  87.             text/plain
  88.             image/pgm
  89.             text/plain
  90.     message/rfc822
  91.         multipart/mixed
  92.             text/plain
  93.             image/pbm
  94.     message/rfc822
  95.         application/postscript
  96.     image/gif
  97.     message/rfc822
  98.         multipart/mixed
  99.             audio/basic
  100.             audio/basic
  101.     message/rfc822
  102.         multipart/mixed
  103.             application/postscript
  104.             text/plain
  105.             message/rfc822
  106.                 multipart/mixed
  107.                     text/plain
  108.                     multipart/parallel
  109.                         image/gif
  110.                         audio/basic
  111.                     application/atomicmail
  112.                     message/rfc822
  113.                         audio/x-sun
  114. """)
  115.  
  116.  
  117. def _testclasses():
  118.     mod = sys.modules[__name__]
  119.     return [getattr(mod, name) for name in dir(mod) if name.startswith('Test')]
  120.  
  121.  
  122. def suite():
  123.     suite = unittest.TestSuite()
  124.     for testclass in _testclasses():
  125.         suite.addTest(unittest.makeSuite(testclass))
  126.     return suite
  127.  
  128.  
  129. def test_main():
  130.     for testclass in _testclasses():
  131.         test_support.run_unittest(testclass)
  132.  
  133.  
  134.  
  135. if __name__ == '__main__':
  136.     unittest.main(defaultTest='suite')
  137.