test_loaders.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import os
  2. import sys
  3. import unittest
  4. from billiard.utils.functional import wraps
  5. from celery import loaders
  6. from celery.loaders import base
  7. from celery.loaders import djangoapp
  8. from celery.loaders import default
  9. from testunits.utils import with_environ
  10. class TestLoaders(unittest.TestCase):
  11. def test_get_loader_cls(self):
  12. self.assertEquals(loaders.get_loader_cls("django"),
  13. loaders.DjangoLoader)
  14. self.assertEquals(loaders.get_loader_cls("default"),
  15. loaders.DefaultLoader)
  16. # Execute cached branch.
  17. self.assertEquals(loaders.get_loader_cls("django"),
  18. loaders.DjangoLoader)
  19. self.assertEquals(loaders.get_loader_cls("default"),
  20. loaders.DefaultLoader)
  21. @with_environ("CELERY_LOADER", "default")
  22. def test_detect_loader_CELERY_LOADER(self):
  23. self.assertEquals(loaders.detect_loader(), loaders.DefaultLoader)
  24. class DummyLoader(base.BaseLoader):
  25. class Config(object):
  26. def __init__(self, **kwargs):
  27. for attr, val in kwargs.items():
  28. setattr(self, attr, val)
  29. def read_configuration(self):
  30. return self.Config(foo="bar", CELERY_IMPORTS=("os", "sys"))
  31. class TestLoaderBase(unittest.TestCase):
  32. def setUp(self):
  33. self.loader = DummyLoader()
  34. def test_handlers_pass(self):
  35. self.loader.on_task_init("foo.task", "feedface-cafebabe")
  36. self.loader.on_worker_init()
  37. def test_import_task_module(self):
  38. import sys
  39. self.assertEquals(sys, self.loader.import_task_module("sys"))
  40. def test_conf_property(self):
  41. self.assertEquals(self.loader.conf.foo, "bar")
  42. self.assertEquals(self.loader._conf_cache.foo, "bar")
  43. self.assertEquals(self.loader.conf.foo, "bar")
  44. def test_import_default_modules(self):
  45. import os
  46. import sys
  47. self.assertEquals(self.loader.import_default_modules(), [os, sys])
  48. class TestDjangoLoader(unittest.TestCase):
  49. def setUp(self):
  50. self.loader = loaders.DjangoLoader()
  51. def test_on_worker_init(self):
  52. from django.conf import settings
  53. old_imports = settings.CELERY_IMPORTS
  54. settings.CELERY_IMPORTS = ("xxx.does.not.exist", )
  55. try:
  56. self.assertRaises(ImportError, self.loader.on_worker_init)
  57. finally:
  58. settings.CELERY_IMPORTS = old_imports
  59. def test_race_protection(self):
  60. djangoapp._RACE_PROTECTION = True
  61. try:
  62. self.assertFalse(self.loader.on_worker_init())
  63. finally:
  64. djangoapp._RACE_PROTECTION = False
  65. def test_find_related_module_no_path(self):
  66. self.assertFalse(djangoapp.find_related_module("sys", "tasks"))
  67. def test_find_related_module_no_related(self):
  68. self.assertFalse(djangoapp.find_related_module("someapp",
  69. "frobulators"))
  70. class TestDefaultLoader(unittest.TestCase):
  71. def test_wanted_module_item(self):
  72. self.assertTrue(default.wanted_module_item("FOO"))
  73. self.assertTrue(default.wanted_module_item("foo"))
  74. self.assertFalse(default.wanted_module_item("_foo"))
  75. self.assertFalse(default.wanted_module_item("__foo"))
  76. def test_read_configuration(self):
  77. from types import ModuleType
  78. class ConfigModule(ModuleType):
  79. pass
  80. celeryconfig = ConfigModule("celeryconfig")
  81. celeryconfig.CELERY_IMPORTS = ("os", "sys")
  82. sys.modules["celeryconfig"] = celeryconfig
  83. try:
  84. l = default.Loader()
  85. settings = l.read_configuration()
  86. self.assertEquals(settings.CELERY_IMPORTS, ("os", "sys"))
  87. from django.conf import settings
  88. settings.configured = False
  89. settings = l.read_configuration()
  90. self.assertEquals(settings.CELERY_IMPORTS, ("os", "sys"))
  91. self.assertTrue(settings.configured)
  92. l.on_worker_init()
  93. finally:
  94. sys.modules.pop("celeryconfig", None)