PageRenderTime 29ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/celery/tests/test_app/test_loaders.py

https://github.com/netoxico/celery
Python | 256 lines | 192 code | 64 blank | 0 comment | 18 complexity | 0e1c2b9348ca5662eef2d72e797f3a1c MD5 | raw file
  1. from __future__ import absolute_import
  2. from __future__ import with_statement
  3. import os
  4. import sys
  5. import warnings
  6. from celery import task
  7. from celery import loaders
  8. from celery.app import app_or_default
  9. from celery.exceptions import CPendingDeprecationWarning, ImproperlyConfigured
  10. from celery.loaders import base
  11. from celery.loaders import default
  12. from celery.loaders.app import AppLoader
  13. from celery.tests.compat import catch_warnings
  14. from celery.tests.utils import unittest, AppCase
  15. class ObjectConfig(object):
  16. FOO = 1
  17. BAR = 2
  18. object_config = ObjectConfig()
  19. dict_config = dict(FOO=10, BAR=20)
  20. class Object(object):
  21. def __init__(self, **kwargs):
  22. for k, v in kwargs.items():
  23. setattr(self, k, v)
  24. class MockMail(object):
  25. class SendmailWarning(UserWarning):
  26. pass
  27. class Message(Object):
  28. pass
  29. class Mailer(Object):
  30. sent = []
  31. raise_on_send = False
  32. def send(self, message):
  33. if self.__class__.raise_on_send:
  34. raise KeyError("foo")
  35. self.sent.append(message)
  36. class DummyLoader(base.BaseLoader):
  37. def read_configuration(self):
  38. return {"foo": "bar", "CELERY_IMPORTS": ("os", "sys")}
  39. @property
  40. def mail(self):
  41. return MockMail()
  42. class TestLoaders(AppCase):
  43. def test_get_loader_cls(self):
  44. self.assertEqual(loaders.get_loader_cls("default"),
  45. default.Loader)
  46. def test_current_loader(self):
  47. warnings.resetwarnings()
  48. with catch_warnings(record=True) as log:
  49. self.assertIs(loaders.current_loader(), self.app.loader)
  50. warning = log[0].message
  51. self.assertIsInstance(warning, CPendingDeprecationWarning)
  52. self.assertIn("deprecation", warning.args[0])
  53. def test_load_settings(self):
  54. warnings.resetwarnings()
  55. with catch_warnings(record=True) as log:
  56. self.assertIs(loaders.load_settings(), self.app.conf)
  57. warning = log[0].message
  58. self.assertIsInstance(warning, CPendingDeprecationWarning)
  59. self.assertIn("deprecation", warning.args[0])
  60. class TestLoaderBase(unittest.TestCase):
  61. message_options = {"subject": "Subject",
  62. "body": "Body",
  63. "sender": "x@x.com",
  64. "to": "y@x.com"}
  65. server_options = {"host": "smtp.x.com",
  66. "port": 1234,
  67. "user": "x",
  68. "password": "qwerty",
  69. "timeout": 3}
  70. def setUp(self):
  71. self.loader = DummyLoader()
  72. def test_handlers_pass(self):
  73. self.loader.on_task_init("foo.task", "feedface-cafebabe")
  74. self.loader.on_worker_init()
  75. def test_import_task_module(self):
  76. self.assertEqual(sys, self.loader.import_task_module("sys"))
  77. def test_conf_property(self):
  78. self.assertEqual(self.loader.conf["foo"], "bar")
  79. self.assertEqual(self.loader._conf["foo"], "bar")
  80. self.assertEqual(self.loader.conf["foo"], "bar")
  81. def test_import_default_modules(self):
  82. modnames = lambda l: [m.__name__ for m in l]
  83. self.assertEqual(sorted(modnames(
  84. self.loader.import_default_modules())),
  85. sorted(modnames([os, sys, task])))
  86. def test_import_from_cwd_custom_imp(self):
  87. def imp(module, package=None):
  88. imp.called = True
  89. imp.called = False
  90. self.loader.import_from_cwd("foo", imp=imp)
  91. self.assertTrue(imp.called)
  92. def test_mail_admins_errors(self):
  93. MockMail.Mailer.raise_on_send = True
  94. opts = dict(self.message_options, **self.server_options)
  95. with catch_warnings(record=True) as log:
  96. self.loader.mail_admins(fail_silently=True, **opts)
  97. warning = log[0].message
  98. self.assertIsInstance(warning, MockMail.SendmailWarning)
  99. self.assertIn("KeyError", warning.args[0])
  100. with self.assertRaises(KeyError):
  101. self.loader.mail_admins(fail_silently=False, **opts)
  102. def test_mail_admins(self):
  103. MockMail.Mailer.raise_on_send = False
  104. opts = dict(self.message_options, **self.server_options)
  105. self.loader.mail_admins(**opts)
  106. message = MockMail.Mailer.sent.pop()
  107. self.assertDictContainsSubset(vars(message), self.message_options)
  108. def test_mail_attribute(self):
  109. from celery.utils import mail
  110. loader = base.BaseLoader()
  111. self.assertIs(loader.mail, mail)
  112. def test_cmdline_config_ValueError(self):
  113. with self.assertRaises(ValueError):
  114. self.loader.cmdline_config_parser(["broker.port=foobar"])
  115. class TestDefaultLoader(unittest.TestCase):
  116. def test_wanted_module_item(self):
  117. l = default.Loader()
  118. self.assertTrue(l.wanted_module_item("FOO"))
  119. self.assertTrue(l.wanted_module_item("Foo"))
  120. self.assertFalse(l.wanted_module_item("_FOO"))
  121. self.assertFalse(l.wanted_module_item("__FOO"))
  122. self.assertFalse(l.wanted_module_item("foo"))
  123. def test_read_configuration(self):
  124. from types import ModuleType
  125. class ConfigModule(ModuleType):
  126. pass
  127. celeryconfig = ConfigModule("celeryconfig")
  128. celeryconfig.CELERY_IMPORTS = ("os", "sys")
  129. configname = os.environ.get("CELERY_CONFIG_MODULE") or "celeryconfig"
  130. prevconfig = sys.modules[configname]
  131. sys.modules[configname] = celeryconfig
  132. try:
  133. l = default.Loader()
  134. settings = l.read_configuration()
  135. self.assertTupleEqual(settings.CELERY_IMPORTS, ("os", "sys"))
  136. settings = l.read_configuration()
  137. self.assertTupleEqual(settings.CELERY_IMPORTS, ("os", "sys"))
  138. l.on_worker_init()
  139. finally:
  140. sys.modules[configname] = prevconfig
  141. def test_import_from_cwd(self):
  142. l = default.Loader()
  143. old_path = list(sys.path)
  144. try:
  145. sys.path.remove(os.getcwd())
  146. except ValueError:
  147. pass
  148. celery = sys.modules.pop("celery", None)
  149. try:
  150. self.assertTrue(l.import_from_cwd("celery"))
  151. sys.modules.pop("celery", None)
  152. sys.path.insert(0, os.getcwd())
  153. self.assertTrue(l.import_from_cwd("celery"))
  154. finally:
  155. sys.path = old_path
  156. sys.modules["celery"] = celery
  157. def test_unconfigured_settings(self):
  158. context_executed = [False]
  159. class _Loader(default.Loader):
  160. def find_module(self, name):
  161. raise ImportError(name)
  162. with catch_warnings(record=True):
  163. l = _Loader()
  164. self.assertDictEqual(l.conf, {})
  165. context_executed[0] = True
  166. self.assertTrue(context_executed[0])
  167. class test_AppLoader(unittest.TestCase):
  168. def setUp(self):
  169. self.app = app_or_default()
  170. self.loader = AppLoader(app=self.app)
  171. def test_config_from_envvar(self, key="CELERY_HARNESS_CFG1"):
  172. self.assertFalse(self.loader.config_from_envvar("HDSAJIHWIQHEWQU",
  173. silent=True))
  174. with self.assertRaises(ImproperlyConfigured):
  175. self.loader.config_from_envvar("HDSAJIHWIQHEWQU", silent=False)
  176. os.environ[key] = __name__ + ".object_config"
  177. self.assertTrue(self.loader.config_from_envvar(key))
  178. self.assertEqual(self.loader.conf["FOO"], 1)
  179. self.assertEqual(self.loader.conf["BAR"], 2)
  180. os.environ[key] = "unknown_asdwqe.asdwqewqe"
  181. with self.assertRaises(ImportError):
  182. self.loader.config_from_envvar(key, silent=False)
  183. self.assertFalse(self.loader.config_from_envvar(key, silent=True))
  184. os.environ[key] = __name__ + ".dict_config"
  185. self.assertTrue(self.loader.config_from_envvar(key))
  186. self.assertEqual(self.loader.conf["FOO"], 10)
  187. self.assertEqual(self.loader.conf["BAR"], 20)
  188. def test_on_worker_init(self):
  189. self.loader.conf["CELERY_IMPORTS"] = ("subprocess", )
  190. sys.modules.pop("subprocess", None)
  191. self.loader.on_worker_init()
  192. self.assertIn("subprocess", sys.modules)