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_compat.py 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. from __future__ import absolute_import
  2. from kombu import Connection, Exchange, Queue
  3. from kombu import compat
  4. from .case import Case, Mock, patch
  5. from .mocks import Transport, Channel
  6. class test_misc(Case):
  7. def test_iterconsume(self):
  8. class MyConnection(object):
  9. drained = 0
  10. def drain_events(self, *args, **kwargs):
  11. self.drained += 1
  12. return self.drained
  13. class Consumer(object):
  14. active = False
  15. def consume(self, *args, **kwargs):
  16. self.active = True
  17. conn = MyConnection()
  18. consumer = Consumer()
  19. it = compat._iterconsume(conn, consumer)
  20. self.assertEqual(next(it), 1)
  21. self.assertTrue(consumer.active)
  22. it2 = compat._iterconsume(conn, consumer, limit=10)
  23. self.assertEqual(list(it2), [2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
  24. def test_Queue_from_dict(self):
  25. defs = {'binding_key': 'foo.#',
  26. 'exchange': 'fooex',
  27. 'exchange_type': 'topic',
  28. 'durable': True,
  29. 'auto_delete': False}
  30. q1 = Queue.from_dict('foo', **dict(defs))
  31. self.assertEqual(q1.name, 'foo')
  32. self.assertEqual(q1.routing_key, 'foo.#')
  33. self.assertEqual(q1.exchange.name, 'fooex')
  34. self.assertEqual(q1.exchange.type, 'topic')
  35. self.assertTrue(q1.durable)
  36. self.assertTrue(q1.exchange.durable)
  37. self.assertFalse(q1.auto_delete)
  38. self.assertFalse(q1.exchange.auto_delete)
  39. q2 = Queue.from_dict('foo', **dict(defs,
  40. exchange_durable=False))
  41. self.assertTrue(q2.durable)
  42. self.assertFalse(q2.exchange.durable)
  43. q3 = Queue.from_dict('foo', **dict(defs,
  44. exchange_auto_delete=True))
  45. self.assertFalse(q3.auto_delete)
  46. self.assertTrue(q3.exchange.auto_delete)
  47. q4 = Queue.from_dict('foo', **dict(defs,
  48. queue_durable=False))
  49. self.assertFalse(q4.durable)
  50. self.assertTrue(q4.exchange.durable)
  51. q5 = Queue.from_dict('foo', **dict(defs,
  52. queue_auto_delete=True))
  53. self.assertTrue(q5.auto_delete)
  54. self.assertFalse(q5.exchange.auto_delete)
  55. self.assertEqual(Queue.from_dict('foo', **dict(defs)),
  56. Queue.from_dict('foo', **dict(defs)))
  57. class test_Publisher(Case):
  58. def setUp(self):
  59. self.connection = Connection(transport=Transport)
  60. def test_constructor(self):
  61. pub = compat.Publisher(self.connection,
  62. exchange='test_Publisher_constructor',
  63. routing_key='rkey')
  64. self.assertIsInstance(pub.backend, Channel)
  65. self.assertEqual(pub.exchange.name, 'test_Publisher_constructor')
  66. self.assertTrue(pub.exchange.durable)
  67. self.assertFalse(pub.exchange.auto_delete)
  68. self.assertEqual(pub.exchange.type, 'direct')
  69. pub2 = compat.Publisher(self.connection,
  70. exchange='test_Publisher_constructor2',
  71. routing_key='rkey',
  72. auto_delete=True,
  73. durable=False)
  74. self.assertTrue(pub2.exchange.auto_delete)
  75. self.assertFalse(pub2.exchange.durable)
  76. explicit = Exchange('test_Publisher_constructor_explicit',
  77. type='topic')
  78. pub3 = compat.Publisher(self.connection,
  79. exchange=explicit)
  80. self.assertEqual(pub3.exchange, explicit)
  81. compat.Publisher(self.connection,
  82. exchange='test_Publisher_constructor3',
  83. channel=self.connection.default_channel)
  84. def test_send(self):
  85. pub = compat.Publisher(self.connection,
  86. exchange='test_Publisher_send',
  87. routing_key='rkey')
  88. pub.send({'foo': 'bar'})
  89. self.assertIn('basic_publish', pub.backend)
  90. pub.close()
  91. def test__enter__exit__(self):
  92. pub = compat.Publisher(self.connection,
  93. exchange='test_Publisher_send',
  94. routing_key='rkey')
  95. x = pub.__enter__()
  96. self.assertIs(x, pub)
  97. x.__exit__()
  98. self.assertTrue(pub._closed)
  99. class test_Consumer(Case):
  100. def setUp(self):
  101. self.connection = Connection(transport=Transport)
  102. @patch('kombu.compat._iterconsume')
  103. def test_iterconsume_calls__iterconsume(self, it, n='test_iterconsume'):
  104. c = compat.Consumer(self.connection, queue=n, exchange=n)
  105. c.iterconsume(limit=10, no_ack=True)
  106. it.assert_called_with(c.connection, c, True, 10)
  107. def test_constructor(self, n='test_Consumer_constructor'):
  108. c = compat.Consumer(self.connection, queue=n, exchange=n,
  109. routing_key='rkey')
  110. self.assertIsInstance(c.backend, Channel)
  111. q = c.queues[0]
  112. self.assertTrue(q.durable)
  113. self.assertTrue(q.exchange.durable)
  114. self.assertFalse(q.auto_delete)
  115. self.assertFalse(q.exchange.auto_delete)
  116. self.assertEqual(q.name, n)
  117. self.assertEqual(q.exchange.name, n)
  118. c2 = compat.Consumer(self.connection, queue=n + '2',
  119. exchange=n + '2',
  120. routing_key='rkey', durable=False,
  121. auto_delete=True, exclusive=True)
  122. q2 = c2.queues[0]
  123. self.assertFalse(q2.durable)
  124. self.assertFalse(q2.exchange.durable)
  125. self.assertTrue(q2.auto_delete)
  126. self.assertTrue(q2.exchange.auto_delete)
  127. def test__enter__exit__(self, n='test__enter__exit__'):
  128. c = compat.Consumer(self.connection, queue=n, exchange=n,
  129. routing_key='rkey')
  130. x = c.__enter__()
  131. self.assertIs(x, c)
  132. x.__exit__()
  133. self.assertTrue(c._closed)
  134. def test_revive(self, n='test_revive'):
  135. c = compat.Consumer(self.connection, queue=n, exchange=n)
  136. with self.connection.channel() as c2:
  137. c.revive(c2)
  138. self.assertIs(c.backend, c2)
  139. def test__iter__(self, n='test__iter__'):
  140. c = compat.Consumer(self.connection, queue=n, exchange=n)
  141. c.iterqueue = Mock()
  142. c.__iter__()
  143. c.iterqueue.assert_called_with(infinite=True)
  144. def test_iter(self, n='test_iterqueue'):
  145. c = compat.Consumer(self.connection, queue=n, exchange=n,
  146. routing_key='rkey')
  147. c.close()
  148. def test_process_next(self, n='test_process_next'):
  149. c = compat.Consumer(self.connection, queue=n, exchange=n,
  150. routing_key='rkey')
  151. with self.assertRaises(NotImplementedError):
  152. c.process_next()
  153. c.close()
  154. def test_iterconsume(self, n='test_iterconsume'):
  155. c = compat.Consumer(self.connection, queue=n, exchange=n,
  156. routing_key='rkey')
  157. c.close()
  158. def test_discard_all(self, n='test_discard_all'):
  159. c = compat.Consumer(self.connection, queue=n, exchange=n,
  160. routing_key='rkey')
  161. c.discard_all()
  162. self.assertIn('queue_purge', c.backend)
  163. def test_fetch(self, n='test_fetch'):
  164. c = compat.Consumer(self.connection, queue=n, exchange=n,
  165. routing_key='rkey')
  166. self.assertIsNone(c.fetch())
  167. self.assertIsNone(c.fetch(no_ack=True))
  168. self.assertIn('basic_get', c.backend)
  169. callback_called = [False]
  170. def receive(payload, message):
  171. callback_called[0] = True
  172. c.backend.to_deliver.append('42')
  173. payload = c.fetch().payload
  174. self.assertEqual(payload, '42')
  175. c.backend.to_deliver.append('46')
  176. c.register_callback(receive)
  177. self.assertEqual(c.fetch(enable_callbacks=True).payload, '46')
  178. self.assertTrue(callback_called[0])
  179. def test_discard_all_filterfunc_not_supported(self, n='xjf21j21'):
  180. c = compat.Consumer(self.connection, queue=n, exchange=n,
  181. routing_key='rkey')
  182. with self.assertRaises(NotImplementedError):
  183. c.discard_all(filterfunc=lambda x: x)
  184. c.close()
  185. def test_wait(self, n='test_wait'):
  186. class C(compat.Consumer):
  187. def iterconsume(self, limit=None):
  188. for i in range(limit):
  189. yield i
  190. c = C(self.connection,
  191. queue=n, exchange=n, routing_key='rkey')
  192. self.assertEqual(c.wait(10), list(range(10)))
  193. c.close()
  194. def test_iterqueue(self, n='test_iterqueue'):
  195. i = [0]
  196. class C(compat.Consumer):
  197. def fetch(self, limit=None):
  198. z = i[0]
  199. i[0] += 1
  200. return z
  201. c = C(self.connection,
  202. queue=n, exchange=n, routing_key='rkey')
  203. self.assertEqual(list(c.iterqueue(limit=10)), list(range(10)))
  204. c.close()
  205. class test_ConsumerSet(Case):
  206. def setUp(self):
  207. self.connection = Connection(transport=Transport)
  208. def test_providing_channel(self):
  209. chan = Mock(name='channel')
  210. cs = compat.ConsumerSet(self.connection, channel=chan)
  211. self.assertTrue(cs._provided_channel)
  212. self.assertIs(cs.backend, chan)
  213. cs.cancel = Mock(name='cancel')
  214. cs.close()
  215. self.assertFalse(chan.close.called)
  216. @patch('kombu.compat._iterconsume')
  217. def test_iterconsume(self, _iterconsume, n='test_iterconsume'):
  218. c = compat.Consumer(self.connection, queue=n, exchange=n)
  219. cs = compat.ConsumerSet(self.connection, consumers=[c])
  220. cs.iterconsume(limit=10, no_ack=True)
  221. _iterconsume.assert_called_with(c.connection, cs, True, 10)
  222. def test_revive(self, n='test_revive'):
  223. c = compat.Consumer(self.connection, queue=n, exchange=n)
  224. cs = compat.ConsumerSet(self.connection, consumers=[c])
  225. with self.connection.channel() as c2:
  226. cs.revive(c2)
  227. self.assertIs(cs.backend, c2)
  228. def test_constructor(self, prefix='0daf8h21'):
  229. dcon = {'%s.xyx' % prefix: {'exchange': '%s.xyx' % prefix,
  230. 'routing_key': 'xyx'},
  231. '%s.xyz' % prefix: {'exchange': '%s.xyz' % prefix,
  232. 'routing_key': 'xyz'}}
  233. consumers = [compat.Consumer(self.connection, queue=prefix + str(i),
  234. exchange=prefix + str(i))
  235. for i in range(3)]
  236. c = compat.ConsumerSet(self.connection, consumers=consumers)
  237. c2 = compat.ConsumerSet(self.connection, from_dict=dcon)
  238. self.assertEqual(len(c.queues), 3)
  239. self.assertEqual(len(c2.queues), 2)
  240. c.add_consumer(compat.Consumer(self.connection,
  241. queue=prefix + 'xaxxxa',
  242. exchange=prefix + 'xaxxxa'))
  243. self.assertEqual(len(c.queues), 4)
  244. for cq in c.queues:
  245. self.assertIs(cq.channel, c.channel)
  246. c2.add_consumer_from_dict({
  247. '%s.xxx' % prefix: {
  248. 'exchange': '%s.xxx' % prefix,
  249. 'routing_key': 'xxx',
  250. },
  251. })
  252. self.assertEqual(len(c2.queues), 3)
  253. for c2q in c2.queues:
  254. self.assertIs(c2q.channel, c2.channel)
  255. c.discard_all()
  256. self.assertEqual(c.channel.called.count('queue_purge'), 4)
  257. c.consume()
  258. c.close()
  259. c2.close()
  260. self.assertIn('basic_cancel', c.channel)
  261. self.assertIn('close', c.channel)
  262. self.assertIn('close', c2.channel)