/Lib/test/test_email/test_pickleable.py

https://github.com/albertz/CPython
Python | 76 lines | 56 code | 16 blank | 4 comment | 3 complexity | d2c824fe37042b473cf17ea0fc619424 MD5 | raw file
  1. import unittest
  2. import textwrap
  3. import copy
  4. import pickle
  5. import email
  6. import email.message
  7. from email import policy
  8. from email.headerregistry import HeaderRegistry
  9. from test.test_email import TestEmailBase, parameterize
  10. @parameterize
  11. class TestPickleCopyHeader(TestEmailBase):
  12. header_factory = HeaderRegistry()
  13. unstructured = header_factory('subject', 'this is a test')
  14. header_params = {
  15. 'subject': ('subject', 'this is a test'),
  16. 'from': ('from', 'frodo@mordor.net'),
  17. 'to': ('to', 'a: k@b.com, y@z.com;, j@f.com'),
  18. 'date': ('date', 'Tue, 29 May 2012 09:24:26 +1000'),
  19. }
  20. def header_as_deepcopy(self, name, value):
  21. header = self.header_factory(name, value)
  22. h = copy.deepcopy(header)
  23. self.assertEqual(str(h), str(header))
  24. def header_as_pickle(self, name, value):
  25. header = self.header_factory(name, value)
  26. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  27. p = pickle.dumps(header, proto)
  28. h = pickle.loads(p)
  29. self.assertEqual(str(h), str(header))
  30. @parameterize
  31. class TestPickleCopyMessage(TestEmailBase):
  32. # Message objects are a sequence, so we have to make them a one-tuple in
  33. # msg_params so they get passed to the parameterized test method as a
  34. # single argument instead of as a list of headers.
  35. msg_params = {}
  36. # Note: there will be no custom header objects in the parsed message.
  37. msg_params['parsed'] = (email.message_from_string(textwrap.dedent("""\
  38. Date: Tue, 29 May 2012 09:24:26 +1000
  39. From: frodo@mordor.net
  40. To: bilbo@underhill.org
  41. Subject: help
  42. I think I forgot the ring.
  43. """), policy=policy.default),)
  44. msg_params['created'] = (email.message.Message(policy=policy.default),)
  45. msg_params['created'][0]['Date'] = 'Tue, 29 May 2012 09:24:26 +1000'
  46. msg_params['created'][0]['From'] = 'frodo@mordor.net'
  47. msg_params['created'][0]['To'] = 'bilbo@underhill.org'
  48. msg_params['created'][0]['Subject'] = 'help'
  49. msg_params['created'][0].set_payload('I think I forgot the ring.')
  50. def msg_as_deepcopy(self, msg):
  51. msg2 = copy.deepcopy(msg)
  52. self.assertEqual(msg2.as_string(), msg.as_string())
  53. def msg_as_pickle(self, msg):
  54. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  55. p = pickle.dumps(msg, proto)
  56. msg2 = pickle.loads(p)
  57. self.assertEqual(msg2.as_string(), msg.as_string())
  58. if __name__ == '__main__':
  59. unittest.main()