test_local.py 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. from __future__ import absolute_import, unicode_literals
  2. import sys
  3. from mock import Mock
  4. from celery.five import string, long_t
  5. from celery.local import (
  6. Proxy,
  7. PromiseProxy,
  8. maybe_evaluate,
  9. try_import,
  10. )
  11. from celery.tests.case import Case
  12. class test_try_import(Case):
  13. def test_imports(self):
  14. self.assertTrue(try_import(__name__))
  15. def test_when_default(self):
  16. default = object()
  17. self.assertIs(try_import('foobar.awqewqe.asdwqewq', default), default)
  18. class test_Proxy(Case):
  19. def test_std_class_attributes(self):
  20. self.assertEqual(Proxy.__name__, 'Proxy')
  21. self.assertEqual(Proxy.__module__, 'celery.local')
  22. self.assertIsInstance(Proxy.__doc__, str)
  23. def test_name(self):
  24. def real():
  25. """real function"""
  26. return 'REAL'
  27. x = Proxy(lambda: real, name='xyz')
  28. self.assertEqual(x.__name__, 'xyz')
  29. y = Proxy(lambda: real)
  30. self.assertEqual(y.__name__, 'real')
  31. self.assertEqual(x.__doc__, 'real function')
  32. self.assertEqual(x.__class__, type(real))
  33. self.assertEqual(x.__dict__, real.__dict__)
  34. self.assertEqual(repr(x), repr(real))
  35. self.assertTrue(x.__module__)
  36. def test_get_current_local(self):
  37. x = Proxy(lambda: 10)
  38. object.__setattr__(x, '_Proxy_local', Mock())
  39. self.assertTrue(x._get_current_object())
  40. def test_bool(self):
  41. class X(object):
  42. def __bool__(self):
  43. return False
  44. __nonzero__ = __bool__
  45. x = Proxy(lambda: X())
  46. self.assertFalse(x)
  47. def test_slots(self):
  48. class X(object):
  49. __slots__ = ()
  50. x = Proxy(X)
  51. with self.assertRaises(AttributeError):
  52. x.__dict__
  53. def test_unicode(self):
  54. class X(object):
  55. def __unicode__(self):
  56. return 'UNICODE'
  57. __str__ = __unicode__
  58. def __repr__(self):
  59. return 'REPR'
  60. x = Proxy(lambda: X())
  61. self.assertEqual(string(x), 'UNICODE')
  62. del(X.__unicode__)
  63. del(X.__str__)
  64. self.assertEqual(string(x), 'REPR')
  65. def test_dir(self):
  66. class X(object):
  67. def __dir__(self):
  68. return ['a', 'b', 'c']
  69. x = Proxy(lambda: X())
  70. self.assertListEqual(dir(x), ['a', 'b', 'c'])
  71. class Y(object):
  72. def __dir__(self):
  73. raise RuntimeError()
  74. y = Proxy(lambda: Y())
  75. self.assertListEqual(dir(y), [])
  76. def test_getsetdel_attr(self):
  77. class X(object):
  78. a = 1
  79. b = 2
  80. c = 3
  81. def __dir__(self):
  82. return ['a', 'b', 'c']
  83. v = X()
  84. x = Proxy(lambda: v)
  85. self.assertListEqual(x.__members__, ['a', 'b', 'c'])
  86. self.assertEqual(x.a, 1)
  87. self.assertEqual(x.b, 2)
  88. self.assertEqual(x.c, 3)
  89. setattr(x, 'a', 10)
  90. self.assertEqual(x.a, 10)
  91. del(x.a)
  92. self.assertEqual(x.a, 1)
  93. def test_dictproxy(self):
  94. v = {}
  95. x = Proxy(lambda: v)
  96. x['foo'] = 42
  97. self.assertEqual(x['foo'], 42)
  98. self.assertEqual(len(x), 1)
  99. self.assertIn('foo', x)
  100. del(x['foo'])
  101. with self.assertRaises(KeyError):
  102. x['foo']
  103. self.assertTrue(iter(x))
  104. def test_listproxy(self):
  105. v = []
  106. x = Proxy(lambda: v)
  107. x.append(1)
  108. x.extend([2, 3, 4])
  109. self.assertEqual(x[0], 1)
  110. self.assertEqual(x[:-1], [1, 2, 3])
  111. del(x[-1])
  112. self.assertEqual(x[:-1], [1, 2])
  113. x[0] = 10
  114. self.assertEqual(x[0], 10)
  115. self.assertIn(10, x)
  116. self.assertEqual(len(x), 3)
  117. self.assertTrue(iter(x))
  118. x[0:2] = [1, 2]
  119. del(x[0:2])
  120. self.assertTrue(str(x))
  121. if sys.version_info[0] < 3:
  122. self.assertEqual(x.__cmp__(object()), -1)
  123. def test_complex_cast(self):
  124. class O(object):
  125. def __complex__(self):
  126. return 10.333
  127. o = Proxy(O)
  128. self.assertEqual(o.__complex__(), 10.333)
  129. def test_index(self):
  130. class O(object):
  131. def __index__(self):
  132. return 1
  133. o = Proxy(O)
  134. self.assertEqual(o.__index__(), 1)
  135. def test_coerce(self):
  136. class O(object):
  137. def __coerce__(self, other):
  138. return self, other
  139. o = Proxy(O)
  140. self.assertTrue(o.__coerce__(3))
  141. def test_int(self):
  142. self.assertEqual(Proxy(lambda: 10) + 1, Proxy(lambda: 11))
  143. self.assertEqual(Proxy(lambda: 10) - 1, Proxy(lambda: 9))
  144. self.assertEqual(Proxy(lambda: 10) * 2, Proxy(lambda: 20))
  145. self.assertEqual(Proxy(lambda: 10) ** 2, Proxy(lambda: 100))
  146. self.assertEqual(Proxy(lambda: 20) / 2, Proxy(lambda: 10))
  147. self.assertEqual(Proxy(lambda: 20) // 2, Proxy(lambda: 10))
  148. self.assertEqual(Proxy(lambda: 11) % 2, Proxy(lambda: 1))
  149. self.assertEqual(Proxy(lambda: 10) << 2, Proxy(lambda: 40))
  150. self.assertEqual(Proxy(lambda: 10) >> 2, Proxy(lambda: 2))
  151. self.assertEqual(Proxy(lambda: 10) ^ 7, Proxy(lambda: 13))
  152. self.assertEqual(Proxy(lambda: 10) | 40, Proxy(lambda: 42))
  153. self.assertEqual(~Proxy(lambda: 10), Proxy(lambda: -11))
  154. self.assertEqual(-Proxy(lambda: 10), Proxy(lambda: -10))
  155. self.assertEqual(+Proxy(lambda: -10), Proxy(lambda: -10))
  156. self.assertTrue(Proxy(lambda: 10) < Proxy(lambda: 20))
  157. self.assertTrue(Proxy(lambda: 20) > Proxy(lambda: 10))
  158. self.assertTrue(Proxy(lambda: 10) >= Proxy(lambda: 10))
  159. self.assertTrue(Proxy(lambda: 10) <= Proxy(lambda: 10))
  160. self.assertTrue(Proxy(lambda: 10) == Proxy(lambda: 10))
  161. self.assertTrue(Proxy(lambda: 20) != Proxy(lambda: 10))
  162. self.assertTrue(Proxy(lambda: 100).__divmod__(30))
  163. self.assertTrue(Proxy(lambda: 100).__truediv__(30))
  164. self.assertTrue(abs(Proxy(lambda: -100)))
  165. x = Proxy(lambda: 10)
  166. x -= 1
  167. self.assertEqual(x, 9)
  168. x = Proxy(lambda: 9)
  169. x += 1
  170. self.assertEqual(x, 10)
  171. x = Proxy(lambda: 10)
  172. x *= 2
  173. self.assertEqual(x, 20)
  174. x = Proxy(lambda: 20)
  175. x /= 2
  176. self.assertEqual(x, 10)
  177. x = Proxy(lambda: 10)
  178. x %= 2
  179. self.assertEqual(x, 0)
  180. x = Proxy(lambda: 10)
  181. x <<= 3
  182. self.assertEqual(x, 80)
  183. x = Proxy(lambda: 80)
  184. x >>= 4
  185. self.assertEqual(x, 5)
  186. x = Proxy(lambda: 5)
  187. x ^= 1
  188. self.assertEqual(x, 4)
  189. x = Proxy(lambda: 4)
  190. x **= 4
  191. self.assertEqual(x, 256)
  192. x = Proxy(lambda: 256)
  193. x //= 2
  194. self.assertEqual(x, 128)
  195. x = Proxy(lambda: 128)
  196. x |= 2
  197. self.assertEqual(x, 130)
  198. x = Proxy(lambda: 130)
  199. x &= 10
  200. self.assertEqual(x, 2)
  201. x = Proxy(lambda: 10)
  202. self.assertEqual(type(x.__float__()), float)
  203. self.assertEqual(type(x.__int__()), int)
  204. self.assertEqual(type(x.__long__()), long_t)
  205. self.assertTrue(hex(x))
  206. self.assertTrue(oct(x))
  207. def test_hash(self):
  208. class X(object):
  209. def __hash__(self):
  210. return 1234
  211. self.assertEqual(hash(Proxy(lambda: X())), 1234)
  212. def test_call(self):
  213. class X(object):
  214. def __call__(self):
  215. return 1234
  216. self.assertEqual(Proxy(lambda: X())(), 1234)
  217. def test_context(self):
  218. class X(object):
  219. entered = exited = False
  220. def __enter__(self):
  221. self.entered = True
  222. return 1234
  223. def __exit__(self, *exc_info):
  224. self.exited = True
  225. v = X()
  226. x = Proxy(lambda: v)
  227. with x as val:
  228. self.assertEqual(val, 1234)
  229. self.assertTrue(x.entered)
  230. self.assertTrue(x.exited)
  231. def test_reduce(self):
  232. class X(object):
  233. def __reduce__(self):
  234. return 123
  235. x = Proxy(lambda: X())
  236. self.assertEqual(x.__reduce__(), 123)
  237. class test_PromiseProxy(Case):
  238. def test_only_evaluated_once(self):
  239. class X(object):
  240. attr = 123
  241. evals = 0
  242. def __init__(self):
  243. self.__class__.evals += 1
  244. p = PromiseProxy(X)
  245. self.assertEqual(p.attr, 123)
  246. self.assertEqual(p.attr, 123)
  247. self.assertEqual(X.evals, 1)
  248. def test_maybe_evaluate(self):
  249. x = PromiseProxy(lambda: 30)
  250. self.assertFalse(x.__evaluated__())
  251. self.assertEqual(maybe_evaluate(x), 30)
  252. self.assertEqual(maybe_evaluate(x), 30)
  253. self.assertEqual(maybe_evaluate(30), 30)
  254. self.assertTrue(x.__evaluated__())