Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_utils.py 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. from __future__ import absolute_import
  2. from __future__ import unicode_literals
  3. import pickle
  4. import sys
  5. from functools import wraps
  6. from kombu import version_info_t
  7. from kombu import utils
  8. from kombu.utils.text import version_string_as_tuple
  9. from kombu.five import string_t
  10. from kombu.tests.case import (
  11. Case, Mock, patch,
  12. redirect_stdouts, mask_modules, module_exists, skip_if_module,
  13. )
  14. if sys.version_info >= (3, 0):
  15. from io import StringIO, BytesIO
  16. else:
  17. from StringIO import StringIO, StringIO as BytesIO # noqa
  18. class OldString(object):
  19. def __init__(self, value):
  20. self.value = value
  21. def __str__(self):
  22. return self.value
  23. def split(self, *args, **kwargs):
  24. return self.value.split(*args, **kwargs)
  25. def rsplit(self, *args, **kwargs):
  26. return self.value.rsplit(*args, **kwargs)
  27. class test_kombu_module(Case):
  28. def test_dir(self):
  29. import kombu
  30. self.assertTrue(dir(kombu))
  31. class test_utils(Case):
  32. def test_maybe_list(self):
  33. self.assertEqual(utils.maybe_list(None), [])
  34. self.assertEqual(utils.maybe_list(1), [1])
  35. self.assertEqual(utils.maybe_list([1, 2, 3]), [1, 2, 3])
  36. def test_fxrange_no_repeatlast(self):
  37. self.assertEqual(list(utils.fxrange(1.0, 3.0, 1.0)),
  38. [1.0, 2.0, 3.0])
  39. def test_fxrangemax(self):
  40. self.assertEqual(list(utils.fxrangemax(1.0, 3.0, 1.0, 30.0)),
  41. [1.0, 2.0, 3.0, 3.0, 3.0, 3.0,
  42. 3.0, 3.0, 3.0, 3.0, 3.0])
  43. self.assertEqual(list(utils.fxrangemax(1.0, None, 1.0, 30.0)),
  44. [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0])
  45. def test_reprkwargs(self):
  46. self.assertTrue(utils.reprkwargs({'foo': 'bar', 1: 2, 'k': 'v'}))
  47. def test_reprcall(self):
  48. self.assertTrue(
  49. utils.reprcall('add', (2, 2), {'copy': True}),
  50. )
  51. class test_UUID(Case):
  52. def test_uuid4(self):
  53. self.assertNotEqual(utils.uuid4(),
  54. utils.uuid4())
  55. def test_uuid(self):
  56. i1 = utils.uuid()
  57. i2 = utils.uuid()
  58. self.assertIsInstance(i1, str)
  59. self.assertNotEqual(i1, i2)
  60. @skip_if_module('__pypy__')
  61. def test_uuid_without_ctypes(self):
  62. old_utils = sys.modules.pop('kombu.utils')
  63. @mask_modules('ctypes')
  64. def with_ctypes_masked():
  65. from kombu.utils import ctypes, uuid
  66. self.assertIsNone(ctypes)
  67. tid = uuid()
  68. self.assertTrue(tid)
  69. self.assertIsInstance(tid, string_t)
  70. try:
  71. with_ctypes_masked()
  72. finally:
  73. sys.modules['celery.utils'] = old_utils
  74. class test_Misc(Case):
  75. def test_kwdict(self):
  76. def f(**kwargs):
  77. return kwargs
  78. kw = {'foo': 'foo',
  79. 'bar': 'bar'}
  80. self.assertTrue(f(**utils.kwdict(kw)))
  81. class MyStringIO(StringIO):
  82. def close(self):
  83. pass
  84. class MyBytesIO(BytesIO):
  85. def close(self):
  86. pass
  87. class test_emergency_dump_state(Case):
  88. @redirect_stdouts
  89. def test_dump(self, stdout, stderr):
  90. fh = MyBytesIO()
  91. utils.emergency_dump_state({'foo': 'bar'}, open_file=lambda n, m: fh)
  92. self.assertDictEqual(pickle.loads(fh.getvalue()), {'foo': 'bar'})
  93. self.assertTrue(stderr.getvalue())
  94. self.assertFalse(stdout.getvalue())
  95. @redirect_stdouts
  96. def test_dump_second_strategy(self, stdout, stderr):
  97. fh = MyStringIO()
  98. def raise_something(*args, **kwargs):
  99. raise KeyError('foo')
  100. utils.emergency_dump_state(
  101. {'foo': 'bar'},
  102. open_file=lambda n, m: fh, dump=raise_something
  103. )
  104. self.assertIn('foo', fh.getvalue())
  105. self.assertIn('bar', fh.getvalue())
  106. self.assertTrue(stderr.getvalue())
  107. self.assertFalse(stdout.getvalue())
  108. def insomnia(fun):
  109. @wraps(fun)
  110. def _inner(*args, **kwargs):
  111. def mysleep(i):
  112. pass
  113. prev_sleep = utils.sleep
  114. utils.sleep = mysleep
  115. try:
  116. return fun(*args, **kwargs)
  117. finally:
  118. utils.sleep = prev_sleep
  119. return _inner
  120. class test_retry_over_time(Case):
  121. def setUp(self):
  122. self.index = 0
  123. class Predicate(Exception):
  124. pass
  125. def myfun(self):
  126. if self.index < 9:
  127. raise self.Predicate()
  128. return 42
  129. def errback(self, exc, intervals, retries):
  130. interval = next(intervals)
  131. sleepvals = (None, 2.0, 4.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 16.0)
  132. self.index += 1
  133. self.assertEqual(interval, sleepvals[self.index])
  134. return interval
  135. @insomnia
  136. def test_simple(self):
  137. prev_count, utils.count = utils.count, Mock()
  138. try:
  139. utils.count.return_value = list(range(1))
  140. x = utils.retry_over_time(self.myfun, self.Predicate,
  141. errback=None, interval_max=14)
  142. self.assertIsNone(x)
  143. utils.count.return_value = list(range(10))
  144. cb = Mock()
  145. x = utils.retry_over_time(self.myfun, self.Predicate,
  146. errback=self.errback, callback=cb,
  147. interval_max=14)
  148. self.assertEqual(x, 42)
  149. self.assertEqual(self.index, 9)
  150. cb.assert_called_with()
  151. finally:
  152. utils.count = prev_count
  153. @insomnia
  154. def test_retry_once(self):
  155. with self.assertRaises(self.Predicate):
  156. utils.retry_over_time(
  157. self.myfun, self.Predicate,
  158. max_retries=1, errback=self.errback, interval_max=14,
  159. )
  160. self.assertEqual(self.index, 1)
  161. # no errback
  162. with self.assertRaises(self.Predicate):
  163. utils.retry_over_time(
  164. self.myfun, self.Predicate,
  165. max_retries=1, errback=None, interval_max=14,
  166. )
  167. @insomnia
  168. def test_retry_always(self):
  169. Predicate = self.Predicate
  170. class Fun(object):
  171. def __init__(self):
  172. self.calls = 0
  173. def __call__(self, *args, **kwargs):
  174. try:
  175. if self.calls >= 10:
  176. return 42
  177. raise Predicate()
  178. finally:
  179. self.calls += 1
  180. fun = Fun()
  181. self.assertEqual(
  182. utils.retry_over_time(
  183. fun, self.Predicate,
  184. max_retries=0, errback=None, interval_max=14,
  185. ),
  186. 42,
  187. )
  188. self.assertEqual(fun.calls, 11)
  189. class test_cached_property(Case):
  190. def test_deleting(self):
  191. class X(object):
  192. xx = False
  193. @utils.cached_property
  194. def foo(self):
  195. return 42
  196. @foo.deleter # noqa
  197. def foo(self, value):
  198. self.xx = value
  199. x = X()
  200. del(x.foo)
  201. self.assertFalse(x.xx)
  202. x.__dict__['foo'] = 'here'
  203. del(x.foo)
  204. self.assertEqual(x.xx, 'here')
  205. def test_when_access_from_class(self):
  206. class X(object):
  207. xx = None
  208. @utils.cached_property
  209. def foo(self):
  210. return 42
  211. @foo.setter # noqa
  212. def foo(self, value):
  213. self.xx = 10
  214. desc = X.__dict__['foo']
  215. self.assertIs(X.foo, desc)
  216. self.assertIs(desc.__get__(None), desc)
  217. self.assertIs(desc.__set__(None, 1), desc)
  218. self.assertIs(desc.__delete__(None), desc)
  219. self.assertTrue(desc.setter(1))
  220. x = X()
  221. x.foo = 30
  222. self.assertEqual(x.xx, 10)
  223. del(x.foo)
  224. class test_symbol_by_name(Case):
  225. def test_instance_returns_instance(self):
  226. instance = object()
  227. self.assertIs(utils.symbol_by_name(instance), instance)
  228. def test_returns_default(self):
  229. default = object()
  230. self.assertIs(
  231. utils.symbol_by_name('xyz.ryx.qedoa.weq:foz', default=default),
  232. default,
  233. )
  234. def test_no_default(self):
  235. with self.assertRaises(ImportError):
  236. utils.symbol_by_name('xyz.ryx.qedoa.weq:foz')
  237. def test_imp_reraises_ValueError(self):
  238. imp = Mock()
  239. imp.side_effect = ValueError()
  240. with self.assertRaises(ValueError):
  241. utils.symbol_by_name('kombu.Connection', imp=imp)
  242. def test_package(self):
  243. from kombu.entity import Exchange
  244. self.assertIs(
  245. utils.symbol_by_name('.entity:Exchange', package='kombu'),
  246. Exchange,
  247. )
  248. self.assertTrue(utils.symbol_by_name(':Consumer', package='kombu'))
  249. class test_ChannelPromise(Case):
  250. def test_repr(self):
  251. obj = Mock(name='cb')
  252. self.assertIn(
  253. 'promise',
  254. repr(utils.ChannelPromise(obj)),
  255. )
  256. self.assertFalse(obj.called)
  257. class test_entrypoints(Case):
  258. @mask_modules('pkg_resources')
  259. def test_without_pkg_resources(self):
  260. self.assertListEqual(list(utils.entrypoints('kombu.test')), [])
  261. @module_exists('pkg_resources')
  262. def test_with_pkg_resources(self):
  263. with patch('pkg_resources.iter_entry_points', create=True) as iterep:
  264. eps = iterep.return_value = [Mock(), Mock()]
  265. self.assertTrue(list(utils.entrypoints('kombu.test')))
  266. iterep.assert_called_with('kombu.test')
  267. eps[0].load.assert_called_with()
  268. eps[1].load.assert_called_with()
  269. class test_shufflecycle(Case):
  270. def test_shuffles(self):
  271. prev_repeat, utils.repeat = utils.repeat, Mock()
  272. try:
  273. utils.repeat.return_value = list(range(10))
  274. values = set(['A', 'B', 'C'])
  275. cycle = utils.shufflecycle(values)
  276. seen = set()
  277. for i in range(10):
  278. next(cycle)
  279. utils.repeat.assert_called_with(None)
  280. self.assertTrue(seen.issubset(values))
  281. with self.assertRaises(StopIteration):
  282. next(cycle)
  283. next(cycle)
  284. finally:
  285. utils.repeat = prev_repeat
  286. class test_version_string_as_tuple(Case):
  287. def test_versions(self):
  288. self.assertTupleEqual(
  289. version_string_as_tuple('3'),
  290. version_info_t(3, 0, 0, '', ''),
  291. )
  292. self.assertTupleEqual(
  293. version_string_as_tuple('3.3'),
  294. version_info_t(3, 3, 0, '', ''),
  295. )
  296. self.assertTupleEqual(
  297. version_string_as_tuple('3.3.1'),
  298. version_info_t(3, 3, 1, '', ''),
  299. )
  300. self.assertTupleEqual(
  301. version_string_as_tuple('3.3.1a3'),
  302. version_info_t(3, 3, 1, 'a3', ''),
  303. )
  304. self.assertTupleEqual(
  305. version_string_as_tuple('3.3.1a3-40c32'),
  306. version_info_t(3, 3, 1, 'a3', '40c32'),
  307. )
  308. self.assertEqual(
  309. version_string_as_tuple('3.3.1.a3.40c32'),
  310. version_info_t(3, 3, 1, 'a3', '40c32'),
  311. )