test_cache.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import sys
  2. import unittest
  3. from billiard.serialization import pickle
  4. from celery import states
  5. from celery.utils import gen_unique_id
  6. from celery.backends.cache import CacheBackend
  7. from celery.datastructures import ExceptionInfo
  8. class SomeClass(object):
  9. def __init__(self, data):
  10. self.data = data
  11. class TestCacheBackend(unittest.TestCase):
  12. def test_mark_as_done(self):
  13. cb = CacheBackend()
  14. tid = gen_unique_id()
  15. self.assertFalse(cb.is_successful(tid))
  16. self.assertEquals(cb.get_status(tid), states.PENDING)
  17. self.assertEquals(cb.get_result(tid), None)
  18. cb.mark_as_done(tid, 42)
  19. self.assertTrue(cb.is_successful(tid))
  20. self.assertEquals(cb.get_status(tid), states.SUCCESS)
  21. self.assertEquals(cb.get_result(tid), 42)
  22. self.assertTrue(cb._cache.get(tid))
  23. self.assertTrue(cb.get_result(tid), 42)
  24. def test_is_pickled(self):
  25. cb = CacheBackend()
  26. tid2 = gen_unique_id()
  27. result = {"foo": "baz", "bar": SomeClass(12345)}
  28. cb.mark_as_done(tid2, result)
  29. # is serialized properly.
  30. rindb = cb.get_result(tid2)
  31. self.assertEquals(rindb.get("foo"), "baz")
  32. self.assertEquals(rindb.get("bar").data, 12345)
  33. def test_mark_as_failure(self):
  34. cb = CacheBackend()
  35. einfo = None
  36. tid3 = gen_unique_id()
  37. try:
  38. raise KeyError("foo")
  39. except KeyError, exception:
  40. einfo = ExceptionInfo(sys.exc_info())
  41. pass
  42. cb.mark_as_failure(tid3, exception, traceback=einfo.traceback)
  43. self.assertFalse(cb.is_successful(tid3))
  44. self.assertEquals(cb.get_status(tid3), states.FAILURE)
  45. self.assertTrue(isinstance(cb.get_result(tid3), KeyError))
  46. self.assertEquals(cb.get_traceback(tid3), einfo.traceback)
  47. def test_process_cleanup(self):
  48. cb = CacheBackend()
  49. cb.process_cleanup()
  50. class TestCustomCacheBackend(unittest.TestCase):
  51. def test_custom_cache_backend(self):
  52. from celery import conf
  53. prev_backend = conf.CELERY_CACHE_BACKEND
  54. prev_module = sys.modules["celery.backends.cache"]
  55. conf.CELERY_CACHE_BACKEND = "dummy://"
  56. sys.modules.pop("celery.backends.cache")
  57. try:
  58. from celery.backends.cache import cache
  59. from django.core.cache import cache as django_cache
  60. self.assertEquals(cache.__class__.__module__,
  61. "django.core.cache.backends.dummy")
  62. self.assertTrue(cache is not django_cache)
  63. finally:
  64. conf.CELERY_CACHE_BACKEND = prev_backend
  65. sys.modules["celery.backends.cache"] = prev_module
  66. class TestMemcacheWrapper(unittest.TestCase):
  67. def test_memcache_wrapper(self):
  68. from django.core.cache.backends import memcached
  69. from django.core.cache.backends import locmem
  70. prev_cache_cls = memcached.CacheClass
  71. memcached.CacheClass = locmem.CacheClass
  72. prev_backend_module = sys.modules.pop("celery.backends.cache")
  73. try:
  74. from celery.backends.cache import cache, DjangoMemcacheWrapper
  75. self.assertTrue(isinstance(cache, DjangoMemcacheWrapper))
  76. key = "cu.test_memcache_wrapper"
  77. val = "The quick brown fox."
  78. default = "The lazy dog."
  79. self.assertEquals(cache.get(key, default=default), default)
  80. cache.set(key, val)
  81. self.assertEquals(pickle.loads(cache.get(key, default=default)),
  82. val)
  83. finally:
  84. memcached.CacheClass = prev_cache_cls
  85. sys.modules["celery.backends.cache"] = prev_backend_module