/tests/test_mixed.py

https://github.com/aio-libs/janus · Python · 234 lines · 178 code · 56 blank · 0 comment · 23 complexity · 1b1781e740caad2482902985fdb36eaa MD5 · raw file

  1. import asyncio
  2. import sys
  3. import unittest
  4. import janus
  5. import pytest
  6. class TestMixedMode(unittest.TestCase):
  7. @pytest.mark.skipif(
  8. sys.version_info < (3, 7),
  9. reason="forbidding implicit loop creation works on "
  10. "Python 3.7 or higher only",
  11. )
  12. def test_ctor_noloop(self):
  13. with self.assertRaises(RuntimeError):
  14. janus.Queue()
  15. @pytest.mark.asyncio
  16. async def test_maxsize(self):
  17. q = janus.Queue(5)
  18. self.assertIs(5, q.maxsize)
  19. @pytest.mark.asyncio
  20. async def test_maxsize_named_param(self):
  21. q = janus.Queue(maxsize=7)
  22. self.assertIs(7, q.maxsize)
  23. @pytest.mark.asyncio
  24. async def test_maxsize_default(self):
  25. q = janus.Queue()
  26. self.assertIs(0, q.maxsize)
  27. @pytest.mark.asyncio
  28. async def test_unfinished(self):
  29. q = janus.Queue()
  30. self.assertEqual(q.sync_q.unfinished_tasks, 0)
  31. self.assertEqual(q.async_q.unfinished_tasks, 0)
  32. q.sync_q.put(1)
  33. self.assertEqual(q.sync_q.unfinished_tasks, 1)
  34. self.assertEqual(q.async_q.unfinished_tasks, 1)
  35. q.sync_q.get()
  36. self.assertEqual(q.sync_q.unfinished_tasks, 1)
  37. self.assertEqual(q.async_q.unfinished_tasks, 1)
  38. q.sync_q.task_done()
  39. self.assertEqual(q.sync_q.unfinished_tasks, 0)
  40. self.assertEqual(q.async_q.unfinished_tasks, 0)
  41. q.close()
  42. await q.wait_closed()
  43. @pytest.mark.asyncio
  44. async def test_sync_put_async_get(self):
  45. loop = janus.current_loop()
  46. q = janus.Queue()
  47. def threaded():
  48. for i in range(5):
  49. q.sync_q.put(i)
  50. async def go():
  51. f = loop.run_in_executor(None, threaded)
  52. for i in range(5):
  53. val = await q.async_q.get()
  54. self.assertEqual(val, i)
  55. self.assertTrue(q.async_q.empty())
  56. await f
  57. for i in range(3):
  58. await go()
  59. q.close()
  60. await q.wait_closed()
  61. @pytest.mark.asyncio
  62. async def test_sync_put_async_join(self):
  63. loop = janus.current_loop()
  64. q = janus.Queue()
  65. for i in range(5):
  66. q.sync_q.put(i)
  67. async def do_work():
  68. await asyncio.sleep(1)
  69. while True:
  70. await q.async_q.get()
  71. q.async_q.task_done()
  72. task = loop.create_task(do_work())
  73. async def wait_for_empty_queue():
  74. await q.async_q.join()
  75. task.cancel()
  76. await wait_for_empty_queue()
  77. q.close()
  78. await q.wait_closed()
  79. @pytest.mark.asyncio
  80. async def test_async_put_sync_get(self):
  81. loop = janus.current_loop()
  82. q = janus.Queue()
  83. def threaded():
  84. for i in range(5):
  85. val = q.sync_q.get()
  86. self.assertEqual(val, i)
  87. async def go():
  88. f = loop.run_in_executor(None, threaded)
  89. for i in range(5):
  90. await q.async_q.put(i)
  91. await f
  92. self.assertTrue(q.async_q.empty())
  93. for i in range(3):
  94. await go()
  95. q.close()
  96. await q.wait_closed()
  97. @pytest.mark.asyncio
  98. async def test_sync_join_async_done(self):
  99. loop = janus.current_loop()
  100. q = janus.Queue()
  101. def threaded():
  102. for i in range(5):
  103. q.sync_q.put(i)
  104. q.sync_q.join()
  105. async def go():
  106. f = loop.run_in_executor(None, threaded)
  107. for i in range(5):
  108. val = await q.async_q.get()
  109. self.assertEqual(val, i)
  110. q.async_q.task_done()
  111. self.assertTrue(q.async_q.empty())
  112. await f
  113. for i in range(3):
  114. await go()
  115. q.close()
  116. await q.wait_closed()
  117. @pytest.mark.asyncio
  118. async def test_async_join_async_done(self):
  119. loop = janus.current_loop()
  120. q = janus.Queue()
  121. def threaded():
  122. for i in range(5):
  123. val = q.sync_q.get()
  124. self.assertEqual(val, i)
  125. q.sync_q.task_done()
  126. async def go():
  127. f = loop.run_in_executor(None, threaded)
  128. for i in range(5):
  129. await q.async_q.put(i)
  130. await q.async_q.join()
  131. await f
  132. self.assertTrue(q.async_q.empty())
  133. for i in range(3):
  134. await go()
  135. q.close()
  136. await q.wait_closed()
  137. @pytest.mark.asyncio
  138. async def test_wait_without_closing(self):
  139. q = janus.Queue()
  140. with self.assertRaises(RuntimeError):
  141. await q.wait_closed()
  142. q.close()
  143. await q.wait_closed()
  144. @pytest.mark.asyncio
  145. async def test_modifying_forbidden_after_closing(self):
  146. q = janus.Queue()
  147. q.close()
  148. with self.assertRaises(RuntimeError):
  149. q.sync_q.put(5)
  150. with self.assertRaises(RuntimeError):
  151. q.sync_q.get()
  152. with self.assertRaises(RuntimeError):
  153. q.sync_q.task_done()
  154. with self.assertRaises(RuntimeError):
  155. await q.async_q.put(5)
  156. with self.assertRaises(RuntimeError):
  157. q.async_q.put_nowait(5)
  158. with self.assertRaises(RuntimeError):
  159. q.async_q.get_nowait()
  160. with self.assertRaises(RuntimeError):
  161. await q.sync_q.task_done()
  162. await q.wait_closed()
  163. @pytest.mark.asyncio
  164. async def test_double_closing(self):
  165. q = janus.Queue()
  166. q.close()
  167. q.close()
  168. await q.wait_closed()
  169. @pytest.mark.asyncio
  170. async def test_closed(self):
  171. q = janus.Queue()
  172. self.assertFalse(q.closed)
  173. self.assertFalse(q.async_q.closed)
  174. self.assertFalse(q.sync_q.closed)
  175. q.close()
  176. self.assertTrue(q.closed)
  177. self.assertTrue(q.async_q.closed)
  178. self.assertTrue(q.sync_q.closed)