test_utils.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. import pickle
  2. import sys
  3. import socket
  4. import unittest2 as unittest
  5. from celery import utils
  6. from celery.utils import promise, mpromise, maybe_promise
  7. from celery.tests.utils import sleepdeprived, execute_context
  8. from celery.tests.utils import mask_modules
  9. def double(x):
  10. return x * 2
  11. class test_chunks(unittest.TestCase):
  12. def test_chunks(self):
  13. # n == 2
  14. x = utils.chunks(iter([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), 2)
  15. self.assertListEqual(list(x),
  16. [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9], [10]])
  17. # n == 3
  18. x = utils.chunks(iter([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), 3)
  19. self.assertListEqual(list(x),
  20. [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]])
  21. # n == 2 (exact)
  22. x = utils.chunks(iter([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 2)
  23. self.assertListEqual(list(x),
  24. [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]])
  25. class test_gen_unique_id(unittest.TestCase):
  26. def test_gen_unique_id_without_ctypes(self):
  27. old_utils = sys.modules.pop("celery.utils")
  28. def with_ctypes_masked(_val):
  29. from celery.utils import ctypes, gen_unique_id
  30. self.assertIsNone(ctypes)
  31. uuid = gen_unique_id()
  32. self.assertTrue(uuid)
  33. self.assertIsInstance(uuid, basestring)
  34. try:
  35. context = mask_modules("ctypes")
  36. execute_context(context, with_ctypes_masked)
  37. finally:
  38. sys.modules["celery.utils"] = old_utils
  39. class test_utils(unittest.TestCase):
  40. def test_repeatlast(self):
  41. items = range(6)
  42. it = utils.repeatlast(items)
  43. for i in items:
  44. self.assertEqual(it.next(), i)
  45. for j in items:
  46. self.assertEqual(it.next(), i)
  47. def test_get_full_cls_name(self):
  48. Class = type("Fox", (object, ), {"__module__": "quick.brown"})
  49. self.assertEqual(utils.get_full_cls_name(Class), "quick.brown.Fox")
  50. def test_is_iterable(self):
  51. for a in "f", ["f"], ("f", ), {"f": "f"}:
  52. self.assertTrue(utils.is_iterable(a))
  53. for b in object(), 1:
  54. self.assertFalse(utils.is_iterable(b))
  55. def test_padlist(self):
  56. self.assertListEqual(utils.padlist(["George", "Costanza", "NYC"], 3),
  57. ["George", "Costanza", "NYC"])
  58. self.assertListEqual(utils.padlist(["George", "Costanza"], 3),
  59. ["George", "Costanza", None])
  60. self.assertListEqual(utils.padlist(["George", "Costanza", "NYC"], 4,
  61. default="Earth"),
  62. ["George", "Costanza", "NYC", "Earth"])
  63. def test_firstmethod_AttributeError(self):
  64. self.assertIsNone(utils.firstmethod("foo")([object()]))
  65. def test_firstmethod_promises(self):
  66. class A(object):
  67. def __init__(self, value=None):
  68. self.value = value
  69. def m(self):
  70. return self.value
  71. self.assertEqual("four", utils.firstmethod("m")([
  72. A(), A(), A(), A("four"), A("five")]))
  73. self.assertEqual("four", utils.firstmethod("m")([
  74. A(), A(), A(), promise(lambda: A("four")), A("five")]))
  75. def test_first(self):
  76. iterations = [0]
  77. def predicate(value):
  78. iterations[0] += 1
  79. if value == 5:
  80. return True
  81. return False
  82. self.assertEqual(5, utils.first(predicate, xrange(10)))
  83. self.assertEqual(iterations[0], 6)
  84. iterations[0] = 0
  85. self.assertIsNone(utils.first(predicate, xrange(10, 20)))
  86. self.assertEqual(iterations[0], 10)
  87. def test_get_cls_by_name__instance_returns_instance(self):
  88. instance = object()
  89. self.assertIs(utils.get_cls_by_name(instance), instance)
  90. class test_retry_over_time(unittest.TestCase):
  91. def test_returns_retval_on_success(self):
  92. def _fun(x, y):
  93. return x * y
  94. ret = utils.retry_over_time(_fun, (socket.error, ), args=[16, 16],
  95. max_retries=3)
  96. self.assertEqual(ret, 256)
  97. @sleepdeprived
  98. def test_raises_on_unlisted_exception(self):
  99. def _fun(x, y):
  100. raise KeyError("bar")
  101. self.assertRaises(KeyError, utils.retry_over_time, _fun,
  102. (socket.error, ), args=[32, 32], max_retries=3)
  103. @sleepdeprived
  104. def test_retries_on_failure(self):
  105. iterations = [0]
  106. def _fun(x, y):
  107. iterations[0] += 1
  108. if iterations[0] == 3:
  109. return x * y
  110. raise socket.error("foozbaz")
  111. ret = utils.retry_over_time(_fun, (socket.error, ), args=[32, 32],
  112. max_retries=None)
  113. self.assertEqual(iterations[0], 3)
  114. self.assertEqual(ret, 1024)
  115. self.assertRaises(socket.error, utils.retry_over_time,
  116. _fun, (socket.error, ), args=[32, 32], max_retries=1)
  117. class test_promise(unittest.TestCase):
  118. def test__str__(self):
  119. self.assertEqual(str(promise(lambda: "the quick brown fox")),
  120. "the quick brown fox")
  121. def test__repr__(self):
  122. self.assertEqual(repr(promise(lambda: "fi fa fo")),
  123. "'fi fa fo'")
  124. def test_evaluate(self):
  125. self.assertEqual(promise(lambda: 2 + 2)(), 4)
  126. self.assertEqual(promise(lambda x: x * 4, 2), 8)
  127. self.assertEqual(promise(lambda x: x * 8, 2)(), 16)
  128. def test_cmp(self):
  129. self.assertEqual(promise(lambda: 10), promise(lambda: 10))
  130. self.assertNotEqual(promise(lambda: 10), promise(lambda: 20))
  131. def test__reduce__(self):
  132. x = promise(double, 4)
  133. y = pickle.loads(pickle.dumps(x))
  134. self.assertEqual(x(), y())
  135. def test__deepcopy__(self):
  136. from copy import deepcopy
  137. x = promise(double, 4)
  138. y = deepcopy(x)
  139. self.assertEqual(x._fun, y._fun)
  140. self.assertEqual(x._args, y._args)
  141. self.assertEqual(x(), y())
  142. class test_mpromise(unittest.TestCase):
  143. def test_is_memoized(self):
  144. it = iter(xrange(20, 30))
  145. p = mpromise(it.next)
  146. self.assertEqual(p(), 20)
  147. self.assertTrue(p.evaluated)
  148. self.assertEqual(p(), 20)
  149. self.assertEqual(repr(p), "20")
  150. class test_maybe_promise(unittest.TestCase):
  151. def test_evaluates(self):
  152. self.assertEqual(maybe_promise(promise(lambda: 10)), 10)
  153. self.assertEqual(maybe_promise(20), 20)