PageRenderTime 64ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 1ms

/Lib/test/test_asyncio/test_tasks.py

https://bitbucket.org/TJG/cpython
Python | 2019 lines | 1578 code | 369 blank | 72 comment | 83 complexity | 503e4b5a8f9ead020d09d957df4779ce MD5 | raw file
Possible License(s): Unlicense, CC-BY-SA-3.0, 0BSD

Large files files are truncated, but you can click here to view the full file

  1. """Tests for tasks.py."""
  2. import os
  3. import re
  4. import sys
  5. import types
  6. import unittest
  7. import weakref
  8. from unittest import mock
  9. import asyncio
  10. from asyncio import coroutines
  11. from asyncio import test_utils
  12. try:
  13. from test import support
  14. from test.script_helper import assert_python_ok
  15. except ImportError:
  16. from asyncio import test_support as support
  17. from asyncio.test_support import assert_python_ok
  18. PY34 = (sys.version_info >= (3, 4))
  19. PY35 = (sys.version_info >= (3, 5))
  20. @asyncio.coroutine
  21. def coroutine_function():
  22. pass
  23. def format_coroutine(qualname, state, src, source_traceback, generator=False):
  24. if generator:
  25. state = '%s' % state
  26. else:
  27. state = '%s, defined' % state
  28. if source_traceback is not None:
  29. frame = source_traceback[-1]
  30. return ('coro=<%s() %s at %s> created at %s:%s'
  31. % (qualname, state, src, frame[0], frame[1]))
  32. else:
  33. return 'coro=<%s() %s at %s>' % (qualname, state, src)
  34. class Dummy:
  35. def __repr__(self):
  36. return '<Dummy>'
  37. def __call__(self, *args):
  38. pass
  39. class TaskTests(test_utils.TestCase):
  40. def setUp(self):
  41. self.loop = self.new_test_loop()
  42. def test_task_class(self):
  43. @asyncio.coroutine
  44. def notmuch():
  45. return 'ok'
  46. t = asyncio.Task(notmuch(), loop=self.loop)
  47. self.loop.run_until_complete(t)
  48. self.assertTrue(t.done())
  49. self.assertEqual(t.result(), 'ok')
  50. self.assertIs(t._loop, self.loop)
  51. loop = asyncio.new_event_loop()
  52. self.set_event_loop(loop)
  53. t = asyncio.Task(notmuch(), loop=loop)
  54. self.assertIs(t._loop, loop)
  55. loop.run_until_complete(t)
  56. loop.close()
  57. def test_async_coroutine(self):
  58. @asyncio.coroutine
  59. def notmuch():
  60. return 'ok'
  61. t = asyncio.async(notmuch(), loop=self.loop)
  62. self.loop.run_until_complete(t)
  63. self.assertTrue(t.done())
  64. self.assertEqual(t.result(), 'ok')
  65. self.assertIs(t._loop, self.loop)
  66. loop = asyncio.new_event_loop()
  67. self.set_event_loop(loop)
  68. t = asyncio.async(notmuch(), loop=loop)
  69. self.assertIs(t._loop, loop)
  70. loop.run_until_complete(t)
  71. loop.close()
  72. def test_async_future(self):
  73. f_orig = asyncio.Future(loop=self.loop)
  74. f_orig.set_result('ko')
  75. f = asyncio.async(f_orig)
  76. self.loop.run_until_complete(f)
  77. self.assertTrue(f.done())
  78. self.assertEqual(f.result(), 'ko')
  79. self.assertIs(f, f_orig)
  80. loop = asyncio.new_event_loop()
  81. self.set_event_loop(loop)
  82. with self.assertRaises(ValueError):
  83. f = asyncio.async(f_orig, loop=loop)
  84. loop.close()
  85. f = asyncio.async(f_orig, loop=self.loop)
  86. self.assertIs(f, f_orig)
  87. def test_async_task(self):
  88. @asyncio.coroutine
  89. def notmuch():
  90. return 'ok'
  91. t_orig = asyncio.Task(notmuch(), loop=self.loop)
  92. t = asyncio.async(t_orig)
  93. self.loop.run_until_complete(t)
  94. self.assertTrue(t.done())
  95. self.assertEqual(t.result(), 'ok')
  96. self.assertIs(t, t_orig)
  97. loop = asyncio.new_event_loop()
  98. self.set_event_loop(loop)
  99. with self.assertRaises(ValueError):
  100. t = asyncio.async(t_orig, loop=loop)
  101. loop.close()
  102. t = asyncio.async(t_orig, loop=self.loop)
  103. self.assertIs(t, t_orig)
  104. def test_async_neither(self):
  105. with self.assertRaises(TypeError):
  106. asyncio.async('ok')
  107. def test_task_repr(self):
  108. self.loop.set_debug(False)
  109. @asyncio.coroutine
  110. def notmuch():
  111. yield from []
  112. return 'abc'
  113. # test coroutine function
  114. self.assertEqual(notmuch.__name__, 'notmuch')
  115. if PY35:
  116. self.assertEqual(notmuch.__qualname__,
  117. 'TaskTests.test_task_repr.<locals>.notmuch')
  118. self.assertEqual(notmuch.__module__, __name__)
  119. filename, lineno = test_utils.get_function_source(notmuch)
  120. src = "%s:%s" % (filename, lineno)
  121. # test coroutine object
  122. gen = notmuch()
  123. if coroutines._DEBUG or PY35:
  124. coro_qualname = 'TaskTests.test_task_repr.<locals>.notmuch'
  125. else:
  126. coro_qualname = 'notmuch'
  127. self.assertEqual(gen.__name__, 'notmuch')
  128. if PY35:
  129. self.assertEqual(gen.__qualname__,
  130. coro_qualname)
  131. # test pending Task
  132. t = asyncio.Task(gen, loop=self.loop)
  133. t.add_done_callback(Dummy())
  134. coro = format_coroutine(coro_qualname, 'running', src,
  135. t._source_traceback, generator=True)
  136. self.assertEqual(repr(t),
  137. '<Task pending %s cb=[<Dummy>()]>' % coro)
  138. # test cancelling Task
  139. t.cancel() # Does not take immediate effect!
  140. self.assertEqual(repr(t),
  141. '<Task cancelling %s cb=[<Dummy>()]>' % coro)
  142. # test cancelled Task
  143. self.assertRaises(asyncio.CancelledError,
  144. self.loop.run_until_complete, t)
  145. coro = format_coroutine(coro_qualname, 'done', src,
  146. t._source_traceback)
  147. self.assertEqual(repr(t),
  148. '<Task cancelled %s>' % coro)
  149. # test finished Task
  150. t = asyncio.Task(notmuch(), loop=self.loop)
  151. self.loop.run_until_complete(t)
  152. coro = format_coroutine(coro_qualname, 'done', src,
  153. t._source_traceback)
  154. self.assertEqual(repr(t),
  155. "<Task finished %s result='abc'>" % coro)
  156. def test_task_repr_coro_decorator(self):
  157. self.loop.set_debug(False)
  158. @asyncio.coroutine
  159. def notmuch():
  160. # notmuch() function doesn't use yield from: it will be wrapped by
  161. # @coroutine decorator
  162. return 123
  163. # test coroutine function
  164. self.assertEqual(notmuch.__name__, 'notmuch')
  165. if PY35:
  166. self.assertEqual(notmuch.__qualname__,
  167. 'TaskTests.test_task_repr_coro_decorator'
  168. '.<locals>.notmuch')
  169. self.assertEqual(notmuch.__module__, __name__)
  170. # test coroutine object
  171. gen = notmuch()
  172. if coroutines._DEBUG or PY35:
  173. # On Python >= 3.5, generators now inherit the name of the
  174. # function, as expected, and have a qualified name (__qualname__
  175. # attribute).
  176. coro_name = 'notmuch'
  177. coro_qualname = ('TaskTests.test_task_repr_coro_decorator'
  178. '.<locals>.notmuch')
  179. else:
  180. # On Python < 3.5, generators inherit the name of the code, not of
  181. # the function. See: http://bugs.python.org/issue21205
  182. coro_name = coro_qualname = 'coro'
  183. self.assertEqual(gen.__name__, coro_name)
  184. if PY35:
  185. self.assertEqual(gen.__qualname__, coro_qualname)
  186. # test repr(CoroWrapper)
  187. if coroutines._DEBUG:
  188. # format the coroutine object
  189. if coroutines._DEBUG:
  190. filename, lineno = test_utils.get_function_source(notmuch)
  191. frame = gen._source_traceback[-1]
  192. coro = ('%s() running, defined at %s:%s, created at %s:%s'
  193. % (coro_qualname, filename, lineno,
  194. frame[0], frame[1]))
  195. else:
  196. code = gen.gi_code
  197. coro = ('%s() running at %s:%s'
  198. % (coro_qualname, code.co_filename,
  199. code.co_firstlineno))
  200. self.assertEqual(repr(gen), '<CoroWrapper %s>' % coro)
  201. # test pending Task
  202. t = asyncio.Task(gen, loop=self.loop)
  203. t.add_done_callback(Dummy())
  204. # format the coroutine object
  205. if coroutines._DEBUG:
  206. src = '%s:%s' % test_utils.get_function_source(notmuch)
  207. else:
  208. code = gen.gi_code
  209. src = '%s:%s' % (code.co_filename, code.co_firstlineno)
  210. coro = format_coroutine(coro_qualname, 'running', src,
  211. t._source_traceback,
  212. generator=not coroutines._DEBUG)
  213. self.assertEqual(repr(t),
  214. '<Task pending %s cb=[<Dummy>()]>' % coro)
  215. self.loop.run_until_complete(t)
  216. def test_task_repr_wait_for(self):
  217. self.loop.set_debug(False)
  218. @asyncio.coroutine
  219. def wait_for(fut):
  220. return (yield from fut)
  221. fut = asyncio.Future(loop=self.loop)
  222. task = asyncio.Task(wait_for(fut), loop=self.loop)
  223. test_utils.run_briefly(self.loop)
  224. self.assertRegex(repr(task),
  225. '<Task .* wait_for=%s>' % re.escape(repr(fut)))
  226. fut.set_result(None)
  227. self.loop.run_until_complete(task)
  228. def test_task_basics(self):
  229. @asyncio.coroutine
  230. def outer():
  231. a = yield from inner1()
  232. b = yield from inner2()
  233. return a+b
  234. @asyncio.coroutine
  235. def inner1():
  236. return 42
  237. @asyncio.coroutine
  238. def inner2():
  239. return 1000
  240. t = outer()
  241. self.assertEqual(self.loop.run_until_complete(t), 1042)
  242. def test_cancel(self):
  243. def gen():
  244. when = yield
  245. self.assertAlmostEqual(10.0, when)
  246. yield 0
  247. loop = self.new_test_loop(gen)
  248. @asyncio.coroutine
  249. def task():
  250. yield from asyncio.sleep(10.0, loop=loop)
  251. return 12
  252. t = asyncio.Task(task(), loop=loop)
  253. loop.call_soon(t.cancel)
  254. with self.assertRaises(asyncio.CancelledError):
  255. loop.run_until_complete(t)
  256. self.assertTrue(t.done())
  257. self.assertTrue(t.cancelled())
  258. self.assertFalse(t.cancel())
  259. def test_cancel_yield(self):
  260. @asyncio.coroutine
  261. def task():
  262. yield
  263. yield
  264. return 12
  265. t = asyncio.Task(task(), loop=self.loop)
  266. test_utils.run_briefly(self.loop) # start coro
  267. t.cancel()
  268. self.assertRaises(
  269. asyncio.CancelledError, self.loop.run_until_complete, t)
  270. self.assertTrue(t.done())
  271. self.assertTrue(t.cancelled())
  272. self.assertFalse(t.cancel())
  273. def test_cancel_inner_future(self):
  274. f = asyncio.Future(loop=self.loop)
  275. @asyncio.coroutine
  276. def task():
  277. yield from f
  278. return 12
  279. t = asyncio.Task(task(), loop=self.loop)
  280. test_utils.run_briefly(self.loop) # start task
  281. f.cancel()
  282. with self.assertRaises(asyncio.CancelledError):
  283. self.loop.run_until_complete(t)
  284. self.assertTrue(f.cancelled())
  285. self.assertTrue(t.cancelled())
  286. def test_cancel_both_task_and_inner_future(self):
  287. f = asyncio.Future(loop=self.loop)
  288. @asyncio.coroutine
  289. def task():
  290. yield from f
  291. return 12
  292. t = asyncio.Task(task(), loop=self.loop)
  293. test_utils.run_briefly(self.loop)
  294. f.cancel()
  295. t.cancel()
  296. with self.assertRaises(asyncio.CancelledError):
  297. self.loop.run_until_complete(t)
  298. self.assertTrue(t.done())
  299. self.assertTrue(f.cancelled())
  300. self.assertTrue(t.cancelled())
  301. def test_cancel_task_catching(self):
  302. fut1 = asyncio.Future(loop=self.loop)
  303. fut2 = asyncio.Future(loop=self.loop)
  304. @asyncio.coroutine
  305. def task():
  306. yield from fut1
  307. try:
  308. yield from fut2
  309. except asyncio.CancelledError:
  310. return 42
  311. t = asyncio.Task(task(), loop=self.loop)
  312. test_utils.run_briefly(self.loop)
  313. self.assertIs(t._fut_waiter, fut1) # White-box test.
  314. fut1.set_result(None)
  315. test_utils.run_briefly(self.loop)
  316. self.assertIs(t._fut_waiter, fut2) # White-box test.
  317. t.cancel()
  318. self.assertTrue(fut2.cancelled())
  319. res = self.loop.run_until_complete(t)
  320. self.assertEqual(res, 42)
  321. self.assertFalse(t.cancelled())
  322. def test_cancel_task_ignoring(self):
  323. fut1 = asyncio.Future(loop=self.loop)
  324. fut2 = asyncio.Future(loop=self.loop)
  325. fut3 = asyncio.Future(loop=self.loop)
  326. @asyncio.coroutine
  327. def task():
  328. yield from fut1
  329. try:
  330. yield from fut2
  331. except asyncio.CancelledError:
  332. pass
  333. res = yield from fut3
  334. return res
  335. t = asyncio.Task(task(), loop=self.loop)
  336. test_utils.run_briefly(self.loop)
  337. self.assertIs(t._fut_waiter, fut1) # White-box test.
  338. fut1.set_result(None)
  339. test_utils.run_briefly(self.loop)
  340. self.assertIs(t._fut_waiter, fut2) # White-box test.
  341. t.cancel()
  342. self.assertTrue(fut2.cancelled())
  343. test_utils.run_briefly(self.loop)
  344. self.assertIs(t._fut_waiter, fut3) # White-box test.
  345. fut3.set_result(42)
  346. res = self.loop.run_until_complete(t)
  347. self.assertEqual(res, 42)
  348. self.assertFalse(fut3.cancelled())
  349. self.assertFalse(t.cancelled())
  350. def test_cancel_current_task(self):
  351. loop = asyncio.new_event_loop()
  352. self.set_event_loop(loop)
  353. @asyncio.coroutine
  354. def task():
  355. t.cancel()
  356. self.assertTrue(t._must_cancel) # White-box test.
  357. # The sleep should be cancelled immediately.
  358. yield from asyncio.sleep(100, loop=loop)
  359. return 12
  360. t = asyncio.Task(task(), loop=loop)
  361. self.assertRaises(
  362. asyncio.CancelledError, loop.run_until_complete, t)
  363. self.assertTrue(t.done())
  364. self.assertFalse(t._must_cancel) # White-box test.
  365. self.assertFalse(t.cancel())
  366. def test_stop_while_run_in_complete(self):
  367. def gen():
  368. when = yield
  369. self.assertAlmostEqual(0.1, when)
  370. when = yield 0.1
  371. self.assertAlmostEqual(0.2, when)
  372. when = yield 0.1
  373. self.assertAlmostEqual(0.3, when)
  374. yield 0.1
  375. loop = self.new_test_loop(gen)
  376. x = 0
  377. waiters = []
  378. @asyncio.coroutine
  379. def task():
  380. nonlocal x
  381. while x < 10:
  382. waiters.append(asyncio.sleep(0.1, loop=loop))
  383. yield from waiters[-1]
  384. x += 1
  385. if x == 2:
  386. loop.stop()
  387. t = asyncio.Task(task(), loop=loop)
  388. with self.assertRaises(RuntimeError) as cm:
  389. loop.run_until_complete(t)
  390. self.assertEqual(str(cm.exception),
  391. 'Event loop stopped before Future completed.')
  392. self.assertFalse(t.done())
  393. self.assertEqual(x, 2)
  394. self.assertAlmostEqual(0.3, loop.time())
  395. # close generators
  396. for w in waiters:
  397. w.close()
  398. t.cancel()
  399. self.assertRaises(asyncio.CancelledError, loop.run_until_complete, t)
  400. def test_wait_for(self):
  401. def gen():
  402. when = yield
  403. self.assertAlmostEqual(0.2, when)
  404. when = yield 0
  405. self.assertAlmostEqual(0.1, when)
  406. when = yield 0.1
  407. loop = self.new_test_loop(gen)
  408. foo_running = None
  409. @asyncio.coroutine
  410. def foo():
  411. nonlocal foo_running
  412. foo_running = True
  413. try:
  414. yield from asyncio.sleep(0.2, loop=loop)
  415. finally:
  416. foo_running = False
  417. return 'done'
  418. fut = asyncio.Task(foo(), loop=loop)
  419. with self.assertRaises(asyncio.TimeoutError):
  420. loop.run_until_complete(asyncio.wait_for(fut, 0.1, loop=loop))
  421. self.assertTrue(fut.done())
  422. # it should have been cancelled due to the timeout
  423. self.assertTrue(fut.cancelled())
  424. self.assertAlmostEqual(0.1, loop.time())
  425. self.assertEqual(foo_running, False)
  426. def test_wait_for_blocking(self):
  427. loop = self.new_test_loop()
  428. @asyncio.coroutine
  429. def coro():
  430. return 'done'
  431. res = loop.run_until_complete(asyncio.wait_for(coro(),
  432. timeout=None,
  433. loop=loop))
  434. self.assertEqual(res, 'done')
  435. def test_wait_for_with_global_loop(self):
  436. def gen():
  437. when = yield
  438. self.assertAlmostEqual(0.2, when)
  439. when = yield 0
  440. self.assertAlmostEqual(0.01, when)
  441. yield 0.01
  442. loop = self.new_test_loop(gen)
  443. @asyncio.coroutine
  444. def foo():
  445. yield from asyncio.sleep(0.2, loop=loop)
  446. return 'done'
  447. asyncio.set_event_loop(loop)
  448. try:
  449. fut = asyncio.Task(foo(), loop=loop)
  450. with self.assertRaises(asyncio.TimeoutError):
  451. loop.run_until_complete(asyncio.wait_for(fut, 0.01))
  452. finally:
  453. asyncio.set_event_loop(None)
  454. self.assertAlmostEqual(0.01, loop.time())
  455. self.assertTrue(fut.done())
  456. self.assertTrue(fut.cancelled())
  457. def test_wait_for_race_condition(self):
  458. def gen():
  459. yield 0.1
  460. yield 0.1
  461. yield 0.1
  462. loop = self.new_test_loop(gen)
  463. fut = asyncio.Future(loop=loop)
  464. task = asyncio.wait_for(fut, timeout=0.2, loop=loop)
  465. loop.call_later(0.1, fut.set_result, "ok")
  466. res = loop.run_until_complete(task)
  467. self.assertEqual(res, "ok")
  468. def test_wait(self):
  469. def gen():
  470. when = yield
  471. self.assertAlmostEqual(0.1, when)
  472. when = yield 0
  473. self.assertAlmostEqual(0.15, when)
  474. yield 0.15
  475. loop = self.new_test_loop(gen)
  476. a = asyncio.Task(asyncio.sleep(0.1, loop=loop), loop=loop)
  477. b = asyncio.Task(asyncio.sleep(0.15, loop=loop), loop=loop)
  478. @asyncio.coroutine
  479. def foo():
  480. done, pending = yield from asyncio.wait([b, a], loop=loop)
  481. self.assertEqual(done, set([a, b]))
  482. self.assertEqual(pending, set())
  483. return 42
  484. res = loop.run_until_complete(asyncio.Task(foo(), loop=loop))
  485. self.assertEqual(res, 42)
  486. self.assertAlmostEqual(0.15, loop.time())
  487. # Doing it again should take no time and exercise a different path.
  488. res = loop.run_until_complete(asyncio.Task(foo(), loop=loop))
  489. self.assertAlmostEqual(0.15, loop.time())
  490. self.assertEqual(res, 42)
  491. def test_wait_with_global_loop(self):
  492. def gen():
  493. when = yield
  494. self.assertAlmostEqual(0.01, when)
  495. when = yield 0
  496. self.assertAlmostEqual(0.015, when)
  497. yield 0.015
  498. loop = self.new_test_loop(gen)
  499. a = asyncio.Task(asyncio.sleep(0.01, loop=loop), loop=loop)
  500. b = asyncio.Task(asyncio.sleep(0.015, loop=loop), loop=loop)
  501. @asyncio.coroutine
  502. def foo():
  503. done, pending = yield from asyncio.wait([b, a])
  504. self.assertEqual(done, set([a, b]))
  505. self.assertEqual(pending, set())
  506. return 42
  507. asyncio.set_event_loop(loop)
  508. res = loop.run_until_complete(
  509. asyncio.Task(foo(), loop=loop))
  510. self.assertEqual(res, 42)
  511. def test_wait_duplicate_coroutines(self):
  512. @asyncio.coroutine
  513. def coro(s):
  514. return s
  515. c = coro('test')
  516. task = asyncio.Task(
  517. asyncio.wait([c, c, coro('spam')], loop=self.loop),
  518. loop=self.loop)
  519. done, pending = self.loop.run_until_complete(task)
  520. self.assertFalse(pending)
  521. self.assertEqual(set(f.result() for f in done), {'test', 'spam'})
  522. def test_wait_errors(self):
  523. self.assertRaises(
  524. ValueError, self.loop.run_until_complete,
  525. asyncio.wait(set(), loop=self.loop))
  526. # -1 is an invalid return_when value
  527. sleep_coro = asyncio.sleep(10.0, loop=self.loop)
  528. wait_coro = asyncio.wait([sleep_coro], return_when=-1, loop=self.loop)
  529. self.assertRaises(ValueError,
  530. self.loop.run_until_complete, wait_coro)
  531. sleep_coro.close()
  532. def test_wait_first_completed(self):
  533. def gen():
  534. when = yield
  535. self.assertAlmostEqual(10.0, when)
  536. when = yield 0
  537. self.assertAlmostEqual(0.1, when)
  538. yield 0.1
  539. loop = self.new_test_loop(gen)
  540. a = asyncio.Task(asyncio.sleep(10.0, loop=loop), loop=loop)
  541. b = asyncio.Task(asyncio.sleep(0.1, loop=loop), loop=loop)
  542. task = asyncio.Task(
  543. asyncio.wait([b, a], return_when=asyncio.FIRST_COMPLETED,
  544. loop=loop),
  545. loop=loop)
  546. done, pending = loop.run_until_complete(task)
  547. self.assertEqual({b}, done)
  548. self.assertEqual({a}, pending)
  549. self.assertFalse(a.done())
  550. self.assertTrue(b.done())
  551. self.assertIsNone(b.result())
  552. self.assertAlmostEqual(0.1, loop.time())
  553. # move forward to close generator
  554. loop.advance_time(10)
  555. loop.run_until_complete(asyncio.wait([a, b], loop=loop))
  556. def test_wait_really_done(self):
  557. # there is possibility that some tasks in the pending list
  558. # became done but their callbacks haven't all been called yet
  559. @asyncio.coroutine
  560. def coro1():
  561. yield
  562. @asyncio.coroutine
  563. def coro2():
  564. yield
  565. yield
  566. a = asyncio.Task(coro1(), loop=self.loop)
  567. b = asyncio.Task(coro2(), loop=self.loop)
  568. task = asyncio.Task(
  569. asyncio.wait([b, a], return_when=asyncio.FIRST_COMPLETED,
  570. loop=self.loop),
  571. loop=self.loop)
  572. done, pending = self.loop.run_until_complete(task)
  573. self.assertEqual({a, b}, done)
  574. self.assertTrue(a.done())
  575. self.assertIsNone(a.result())
  576. self.assertTrue(b.done())
  577. self.assertIsNone(b.result())
  578. def test_wait_first_exception(self):
  579. def gen():
  580. when = yield
  581. self.assertAlmostEqual(10.0, when)
  582. yield 0
  583. loop = self.new_test_loop(gen)
  584. # first_exception, task already has exception
  585. a = asyncio.Task(asyncio.sleep(10.0, loop=loop), loop=loop)
  586. @asyncio.coroutine
  587. def exc():
  588. raise ZeroDivisionError('err')
  589. b = asyncio.Task(exc(), loop=loop)
  590. task = asyncio.Task(
  591. asyncio.wait([b, a], return_when=asyncio.FIRST_EXCEPTION,
  592. loop=loop),
  593. loop=loop)
  594. done, pending = loop.run_until_complete(task)
  595. self.assertEqual({b}, done)
  596. self.assertEqual({a}, pending)
  597. self.assertAlmostEqual(0, loop.time())
  598. # move forward to close generator
  599. loop.advance_time(10)
  600. loop.run_until_complete(asyncio.wait([a, b], loop=loop))
  601. def test_wait_first_exception_in_wait(self):
  602. def gen():
  603. when = yield
  604. self.assertAlmostEqual(10.0, when)
  605. when = yield 0
  606. self.assertAlmostEqual(0.01, when)
  607. yield 0.01
  608. loop = self.new_test_loop(gen)
  609. # first_exception, exception during waiting
  610. a = asyncio.Task(asyncio.sleep(10.0, loop=loop), loop=loop)
  611. @asyncio.coroutine
  612. def exc():
  613. yield from asyncio.sleep(0.01, loop=loop)
  614. raise ZeroDivisionError('err')
  615. b = asyncio.Task(exc(), loop=loop)
  616. task = asyncio.wait([b, a], return_when=asyncio.FIRST_EXCEPTION,
  617. loop=loop)
  618. done, pending = loop.run_until_complete(task)
  619. self.assertEqual({b}, done)
  620. self.assertEqual({a}, pending)
  621. self.assertAlmostEqual(0.01, loop.time())
  622. # move forward to close generator
  623. loop.advance_time(10)
  624. loop.run_until_complete(asyncio.wait([a, b], loop=loop))
  625. def test_wait_with_exception(self):
  626. def gen():
  627. when = yield
  628. self.assertAlmostEqual(0.1, when)
  629. when = yield 0
  630. self.assertAlmostEqual(0.15, when)
  631. yield 0.15
  632. loop = self.new_test_loop(gen)
  633. a = asyncio.Task(asyncio.sleep(0.1, loop=loop), loop=loop)
  634. @asyncio.coroutine
  635. def sleeper():
  636. yield from asyncio.sleep(0.15, loop=loop)
  637. raise ZeroDivisionError('really')
  638. b = asyncio.Task(sleeper(), loop=loop)
  639. @asyncio.coroutine
  640. def foo():
  641. done, pending = yield from asyncio.wait([b, a], loop=loop)
  642. self.assertEqual(len(done), 2)
  643. self.assertEqual(pending, set())
  644. errors = set(f for f in done if f.exception() is not None)
  645. self.assertEqual(len(errors), 1)
  646. loop.run_until_complete(asyncio.Task(foo(), loop=loop))
  647. self.assertAlmostEqual(0.15, loop.time())
  648. loop.run_until_complete(asyncio.Task(foo(), loop=loop))
  649. self.assertAlmostEqual(0.15, loop.time())
  650. def test_wait_with_timeout(self):
  651. def gen():
  652. when = yield
  653. self.assertAlmostEqual(0.1, when)
  654. when = yield 0
  655. self.assertAlmostEqual(0.15, when)
  656. when = yield 0
  657. self.assertAlmostEqual(0.11, when)
  658. yield 0.11
  659. loop = self.new_test_loop(gen)
  660. a = asyncio.Task(asyncio.sleep(0.1, loop=loop), loop=loop)
  661. b = asyncio.Task(asyncio.sleep(0.15, loop=loop), loop=loop)
  662. @asyncio.coroutine
  663. def foo():
  664. done, pending = yield from asyncio.wait([b, a], timeout=0.11,
  665. loop=loop)
  666. self.assertEqual(done, set([a]))
  667. self.assertEqual(pending, set([b]))
  668. loop.run_until_complete(asyncio.Task(foo(), loop=loop))
  669. self.assertAlmostEqual(0.11, loop.time())
  670. # move forward to close generator
  671. loop.advance_time(10)
  672. loop.run_until_complete(asyncio.wait([a, b], loop=loop))
  673. def test_wait_concurrent_complete(self):
  674. def gen():
  675. when = yield
  676. self.assertAlmostEqual(0.1, when)
  677. when = yield 0
  678. self.assertAlmostEqual(0.15, when)
  679. when = yield 0
  680. self.assertAlmostEqual(0.1, when)
  681. yield 0.1
  682. loop = self.new_test_loop(gen)
  683. a = asyncio.Task(asyncio.sleep(0.1, loop=loop), loop=loop)
  684. b = asyncio.Task(asyncio.sleep(0.15, loop=loop), loop=loop)
  685. done, pending = loop.run_until_complete(
  686. asyncio.wait([b, a], timeout=0.1, loop=loop))
  687. self.assertEqual(done, set([a]))
  688. self.assertEqual(pending, set([b]))
  689. self.assertAlmostEqual(0.1, loop.time())
  690. # move forward to close generator
  691. loop.advance_time(10)
  692. loop.run_until_complete(asyncio.wait([a, b], loop=loop))
  693. def test_as_completed(self):
  694. def gen():
  695. yield 0
  696. yield 0
  697. yield 0.01
  698. yield 0
  699. loop = self.new_test_loop(gen)
  700. # disable "slow callback" warning
  701. loop.slow_callback_duration = 1.0
  702. completed = set()
  703. time_shifted = False
  704. @asyncio.coroutine
  705. def sleeper(dt, x):
  706. nonlocal time_shifted
  707. yield from asyncio.sleep(dt, loop=loop)
  708. completed.add(x)
  709. if not time_shifted and 'a' in completed and 'b' in completed:
  710. time_shifted = True
  711. loop.advance_time(0.14)
  712. return x
  713. a = sleeper(0.01, 'a')
  714. b = sleeper(0.01, 'b')
  715. c = sleeper(0.15, 'c')
  716. @asyncio.coroutine
  717. def foo():
  718. values = []
  719. for f in asyncio.as_completed([b, c, a], loop=loop):
  720. values.append((yield from f))
  721. return values
  722. res = loop.run_until_complete(asyncio.Task(foo(), loop=loop))
  723. self.assertAlmostEqual(0.15, loop.time())
  724. self.assertTrue('a' in res[:2])
  725. self.assertTrue('b' in res[:2])
  726. self.assertEqual(res[2], 'c')
  727. # Doing it again should take no time and exercise a different path.
  728. res = loop.run_until_complete(asyncio.Task(foo(), loop=loop))
  729. self.assertAlmostEqual(0.15, loop.time())
  730. def test_as_completed_with_timeout(self):
  731. def gen():
  732. yield
  733. yield 0
  734. yield 0
  735. yield 0.1
  736. loop = self.new_test_loop(gen)
  737. a = asyncio.sleep(0.1, 'a', loop=loop)
  738. b = asyncio.sleep(0.15, 'b', loop=loop)
  739. @asyncio.coroutine
  740. def foo():
  741. values = []
  742. for f in asyncio.as_completed([a, b], timeout=0.12, loop=loop):
  743. if values:
  744. loop.advance_time(0.02)
  745. try:
  746. v = yield from f
  747. values.append((1, v))
  748. except asyncio.TimeoutError as exc:
  749. values.append((2, exc))
  750. return values
  751. res = loop.run_until_complete(asyncio.Task(foo(), loop=loop))
  752. self.assertEqual(len(res), 2, res)
  753. self.assertEqual(res[0], (1, 'a'))
  754. self.assertEqual(res[1][0], 2)
  755. self.assertIsInstance(res[1][1], asyncio.TimeoutError)
  756. self.assertAlmostEqual(0.12, loop.time())
  757. # move forward to close generator
  758. loop.advance_time(10)
  759. loop.run_until_complete(asyncio.wait([a, b], loop=loop))
  760. def test_as_completed_with_unused_timeout(self):
  761. def gen():
  762. yield
  763. yield 0
  764. yield 0.01
  765. loop = self.new_test_loop(gen)
  766. a = asyncio.sleep(0.01, 'a', loop=loop)
  767. @asyncio.coroutine
  768. def foo():
  769. for f in asyncio.as_completed([a], timeout=1, loop=loop):
  770. v = yield from f
  771. self.assertEqual(v, 'a')
  772. loop.run_until_complete(asyncio.Task(foo(), loop=loop))
  773. def test_as_completed_reverse_wait(self):
  774. def gen():
  775. yield 0
  776. yield 0.05
  777. yield 0
  778. loop = self.new_test_loop(gen)
  779. a = asyncio.sleep(0.05, 'a', loop=loop)
  780. b = asyncio.sleep(0.10, 'b', loop=loop)
  781. fs = {a, b}
  782. futs = list(asyncio.as_completed(fs, loop=loop))
  783. self.assertEqual(len(futs), 2)
  784. x = loop.run_until_complete(futs[1])
  785. self.assertEqual(x, 'a')
  786. self.assertAlmostEqual(0.05, loop.time())
  787. loop.advance_time(0.05)
  788. y = loop.run_until_complete(futs[0])
  789. self.assertEqual(y, 'b')
  790. self.assertAlmostEqual(0.10, loop.time())
  791. def test_as_completed_concurrent(self):
  792. def gen():
  793. when = yield
  794. self.assertAlmostEqual(0.05, when)
  795. when = yield 0
  796. self.assertAlmostEqual(0.05, when)
  797. yield 0.05
  798. loop = self.new_test_loop(gen)
  799. a = asyncio.sleep(0.05, 'a', loop=loop)
  800. b = asyncio.sleep(0.05, 'b', loop=loop)
  801. fs = {a, b}
  802. futs = list(asyncio.as_completed(fs, loop=loop))
  803. self.assertEqual(len(futs), 2)
  804. waiter = asyncio.wait(futs, loop=loop)
  805. done, pending = loop.run_until_complete(waiter)
  806. self.assertEqual(set(f.result() for f in done), {'a', 'b'})
  807. def test_as_completed_duplicate_coroutines(self):
  808. @asyncio.coroutine
  809. def coro(s):
  810. return s
  811. @asyncio.coroutine
  812. def runner():
  813. result = []
  814. c = coro('ham')
  815. for f in asyncio.as_completed([c, c, coro('spam')],
  816. loop=self.loop):
  817. result.append((yield from f))
  818. return result
  819. fut = asyncio.Task(runner(), loop=self.loop)
  820. self.loop.run_until_complete(fut)
  821. result = fut.result()
  822. self.assertEqual(set(result), {'ham', 'spam'})
  823. self.assertEqual(len(result), 2)
  824. def test_sleep(self):
  825. def gen():
  826. when = yield
  827. self.assertAlmostEqual(0.05, when)
  828. when = yield 0.05
  829. self.assertAlmostEqual(0.1, when)
  830. yield 0.05
  831. loop = self.new_test_loop(gen)
  832. @asyncio.coroutine
  833. def sleeper(dt, arg):
  834. yield from asyncio.sleep(dt/2, loop=loop)
  835. res = yield from asyncio.sleep(dt/2, arg, loop=loop)
  836. return res
  837. t = asyncio.Task(sleeper(0.1, 'yeah'), loop=loop)
  838. loop.run_until_complete(t)
  839. self.assertTrue(t.done())
  840. self.assertEqual(t.result(), 'yeah')
  841. self.assertAlmostEqual(0.1, loop.time())
  842. def test_sleep_cancel(self):
  843. def gen():
  844. when = yield
  845. self.assertAlmostEqual(10.0, when)
  846. yield 0
  847. loop = self.new_test_loop(gen)
  848. t = asyncio.Task(asyncio.sleep(10.0, 'yeah', loop=loop),
  849. loop=loop)
  850. handle = None
  851. orig_call_later = loop.call_later
  852. def call_later(delay, callback, *args):
  853. nonlocal handle
  854. handle = orig_call_later(delay, callback, *args)
  855. return handle
  856. loop.call_later = call_later
  857. test_utils.run_briefly(loop)
  858. self.assertFalse(handle._cancelled)
  859. t.cancel()
  860. test_utils.run_briefly(loop)
  861. self.assertTrue(handle._cancelled)
  862. def test_task_cancel_sleeping_task(self):
  863. def gen():
  864. when = yield
  865. self.assertAlmostEqual(0.1, when)
  866. when = yield 0
  867. self.assertAlmostEqual(5000, when)
  868. yield 0.1
  869. loop = self.new_test_loop(gen)
  870. @asyncio.coroutine
  871. def sleep(dt):
  872. yield from asyncio.sleep(dt, loop=loop)
  873. @asyncio.coroutine
  874. def doit():
  875. sleeper = asyncio.Task(sleep(5000), loop=loop)
  876. loop.call_later(0.1, sleeper.cancel)
  877. try:
  878. yield from sleeper
  879. except asyncio.CancelledError:
  880. return 'cancelled'
  881. else:
  882. return 'slept in'
  883. doer = doit()
  884. self.assertEqual(loop.run_until_complete(doer), 'cancelled')
  885. self.assertAlmostEqual(0.1, loop.time())
  886. def test_task_cancel_waiter_future(self):
  887. fut = asyncio.Future(loop=self.loop)
  888. @asyncio.coroutine
  889. def coro():
  890. yield from fut
  891. task = asyncio.Task(coro(), loop=self.loop)
  892. test_utils.run_briefly(self.loop)
  893. self.assertIs(task._fut_waiter, fut)
  894. task.cancel()
  895. test_utils.run_briefly(self.loop)
  896. self.assertRaises(
  897. asyncio.CancelledError, self.loop.run_until_complete, task)
  898. self.assertIsNone(task._fut_waiter)
  899. self.assertTrue(fut.cancelled())
  900. def test_step_in_completed_task(self):
  901. @asyncio.coroutine
  902. def notmuch():
  903. return 'ko'
  904. gen = notmuch()
  905. task = asyncio.Task(gen, loop=self.loop)
  906. task.set_result('ok')
  907. self.assertRaises(AssertionError, task._step)
  908. gen.close()
  909. def test_step_result(self):
  910. @asyncio.coroutine
  911. def notmuch():
  912. yield None
  913. yield 1
  914. return 'ko'
  915. self.assertRaises(
  916. RuntimeError, self.loop.run_until_complete, notmuch())
  917. def test_step_result_future(self):
  918. # If coroutine returns future, task waits on this future.
  919. class Fut(asyncio.Future):
  920. def __init__(self, *args, **kwds):
  921. self.cb_added = False
  922. super().__init__(*args, **kwds)
  923. def add_done_callback(self, fn):
  924. self.cb_added = True
  925. super().add_done_callback(fn)
  926. fut = Fut(loop=self.loop)
  927. result = None
  928. @asyncio.coroutine
  929. def wait_for_future():
  930. nonlocal result
  931. result = yield from fut
  932. t = asyncio.Task(wait_for_future(), loop=self.loop)
  933. test_utils.run_briefly(self.loop)
  934. self.assertTrue(fut.cb_added)
  935. res = object()
  936. fut.set_result(res)
  937. test_utils.run_briefly(self.loop)
  938. self.assertIs(res, result)
  939. self.assertTrue(t.done())
  940. self.assertIsNone(t.result())
  941. def test_step_with_baseexception(self):
  942. @asyncio.coroutine
  943. def notmutch():
  944. raise BaseException()
  945. task = asyncio.Task(notmutch(), loop=self.loop)
  946. self.assertRaises(BaseException, task._step)
  947. self.assertTrue(task.done())
  948. self.assertIsInstance(task.exception(), BaseException)
  949. def test_baseexception_during_cancel(self):
  950. def gen():
  951. when = yield
  952. self.assertAlmostEqual(10.0, when)
  953. yield 0
  954. loop = self.new_test_loop(gen)
  955. @asyncio.coroutine
  956. def sleeper():
  957. yield from asyncio.sleep(10, loop=loop)
  958. base_exc = BaseException()
  959. @asyncio.coroutine
  960. def notmutch():
  961. try:
  962. yield from sleeper()
  963. except asyncio.CancelledError:
  964. raise base_exc
  965. task = asyncio.Task(notmutch(), loop=loop)
  966. test_utils.run_briefly(loop)
  967. task.cancel()
  968. self.assertFalse(task.done())
  969. self.assertRaises(BaseException, test_utils.run_briefly, loop)
  970. self.assertTrue(task.done())
  971. self.assertFalse(task.cancelled())
  972. self.assertIs(task.exception(), base_exc)
  973. def test_iscoroutinefunction(self):
  974. def fn():
  975. pass
  976. self.assertFalse(asyncio.iscoroutinefunction(fn))
  977. def fn1():
  978. yield
  979. self.assertFalse(asyncio.iscoroutinefunction(fn1))
  980. @asyncio.coroutine
  981. def fn2():
  982. yield
  983. self.assertTrue(asyncio.iscoroutinefunction(fn2))
  984. def test_yield_vs_yield_from(self):
  985. fut = asyncio.Future(loop=self.loop)
  986. @asyncio.coroutine
  987. def wait_for_future():
  988. yield fut
  989. task = wait_for_future()
  990. with self.assertRaises(RuntimeError):
  991. self.loop.run_until_complete(task)
  992. self.assertFalse(fut.done())
  993. def test_yield_vs_yield_from_generator(self):
  994. @asyncio.coroutine
  995. def coro():
  996. yield
  997. @asyncio.coroutine
  998. def wait_for_future():
  999. gen = coro()
  1000. try:
  1001. yield gen
  1002. finally:
  1003. gen.close()
  1004. task = wait_for_future()
  1005. self.assertRaises(
  1006. RuntimeError,
  1007. self.loop.run_until_complete, task)
  1008. def test_coroutine_non_gen_function(self):
  1009. @asyncio.coroutine
  1010. def func():
  1011. return 'test'
  1012. self.assertTrue(asyncio.iscoroutinefunction(func))
  1013. coro = func()
  1014. self.assertTrue(asyncio.iscoroutine(coro))
  1015. res = self.loop.run_until_complete(coro)
  1016. self.assertEqual(res, 'test')
  1017. def test_coroutine_non_gen_function_return_future(self):
  1018. fut = asyncio.Future(loop=self.loop)
  1019. @asyncio.coroutine
  1020. def func():
  1021. return fut
  1022. @asyncio.coroutine
  1023. def coro():
  1024. fut.set_result('test')
  1025. t1 = asyncio.Task(func(), loop=self.loop)
  1026. t2 = asyncio.Task(coro(), loop=self.loop)
  1027. res = self.loop.run_until_complete(t1)
  1028. self.assertEqual(res, 'test')
  1029. self.assertIsNone(t2.result())
  1030. def test_current_task(self):
  1031. self.assertIsNone(asyncio.Task.current_task(loop=self.loop))
  1032. @asyncio.coroutine
  1033. def coro(loop):
  1034. self.assertTrue(asyncio.Task.current_task(loop=loop) is task)
  1035. task = asyncio.Task(coro(self.loop), loop=self.loop)
  1036. self.loop.run_until_complete(task)
  1037. self.assertIsNone(asyncio.Task.current_task(loop=self.loop))
  1038. def test_current_task_with_interleaving_tasks(self):
  1039. self.assertIsNone(asyncio.Task.current_task(loop=self.loop))
  1040. fut1 = asyncio.Future(loop=self.loop)
  1041. fut2 = asyncio.Future(loop=self.loop)
  1042. @asyncio.coroutine
  1043. def coro1(loop):
  1044. self.assertTrue(asyncio.Task.current_task(loop=loop) is task1)
  1045. yield from fut1
  1046. self.assertTrue(asyncio.Task.current_task(loop=loop) is task1)
  1047. fut2.set_result(True)
  1048. @asyncio.coroutine
  1049. def coro2(loop):
  1050. self.assertTrue(asyncio.Task.current_task(loop=loop) is task2)
  1051. fut1.set_result(True)
  1052. yield from fut2
  1053. self.assertTrue(asyncio.Task.current_task(loop=loop) is task2)
  1054. task1 = asyncio.Task(coro1(self.loop), loop=self.loop)
  1055. task2 = asyncio.Task(coro2(self.loop), loop=self.loop)
  1056. self.loop.run_until_complete(asyncio.wait((task1, task2),
  1057. loop=self.loop))
  1058. self.assertIsNone(asyncio.Task.current_task(loop=self.loop))
  1059. # Some thorough tests for cancellation propagation through
  1060. # coroutines, tasks and wait().
  1061. def test_yield_future_passes_cancel(self):
  1062. # Cancelling outer() cancels inner() cancels waiter.
  1063. proof = 0
  1064. waiter = asyncio.Future(loop=self.loop)
  1065. @asyncio.coroutine
  1066. def inner():
  1067. nonlocal proof
  1068. try:
  1069. yield from waiter
  1070. except asyncio.CancelledError:
  1071. proof += 1
  1072. raise
  1073. else:
  1074. self.fail('got past sleep() in inner()')
  1075. @asyncio.coroutine
  1076. def outer():
  1077. nonlocal proof
  1078. try:
  1079. yield from inner()
  1080. except asyncio.CancelledError:
  1081. proof += 100 # Expect this path.
  1082. else:
  1083. proof += 10
  1084. f = asyncio.async(outer(), loop=self.loop)
  1085. test_utils.run_briefly(self.loop)
  1086. f.cancel()
  1087. self.loop.run_until_complete(f)
  1088. self.assertEqual(proof, 101)
  1089. self.assertTrue(waiter.cancelled())
  1090. def test_yield_wait_does_not_shield_cancel(self):
  1091. # Cancelling outer() makes wait() return early, leaves inner()
  1092. # running.
  1093. proof = 0
  1094. waiter = asyncio.Future(loop=self.loop)
  1095. @asyncio.coroutine
  1096. def inner():
  1097. nonlocal proof
  1098. yield from waiter
  1099. proof += 1
  1100. @asyncio.coroutine
  1101. def outer():
  1102. nonlocal proof
  1103. d, p = yield from asyncio.wait([inner()], loop=self.loop)
  1104. proof += 100
  1105. f = asyncio.async(outer(), loop=self.loop)
  1106. test_utils.run_briefly(self.loop)
  1107. f.cancel()
  1108. self.assertRaises(
  1109. asyncio.CancelledError, self.loop.run_until_complete, f)
  1110. waiter.set_result(None)
  1111. test_utils.run_briefly(self.loop)
  1112. self.assertEqual(proof, 1)
  1113. def test_shield_result(self):
  1114. inner = asyncio.Future(loop=self.loop)
  1115. outer = asyncio.shield(inner)
  1116. inner.set_result(42)
  1117. res = self.loop.run_until_complete(outer)
  1118. self.assertEqual(res, 42)
  1119. def test_shield_exception(self):
  1120. inner = asyncio.Future(loop=self.loop)
  1121. outer = asyncio.shield(inner)
  1122. test_utils.run_briefly(self.loop)
  1123. exc = RuntimeError('expected')
  1124. inner.set_exception(exc)
  1125. test_utils.run_briefly(self.loop)
  1126. self.assertIs(outer.exception(), exc)
  1127. def test_shield_cancel(self):
  1128. inner = asyncio.Future(loop=self.loop)
  1129. outer = asyncio.shield(inner)
  1130. test_utils.run_briefly(self.loop)
  1131. inner.cancel()
  1132. test_utils.run_briefly(self.loop)
  1133. self.assertTrue(outer.cancelled())
  1134. def test_shield_shortcut(self):
  1135. fut = asyncio.Future(loop=self.loop)
  1136. fut.set_result(42)
  1137. res = self.loop.run_until_complete(asyncio.shield(fut))
  1138. self.assertEqual(res, 42)
  1139. def test_shield_effect(self):
  1140. # Cancelling outer() does not affect inner().
  1141. proof = 0
  1142. waiter = asyncio.Future(loop=self.loop)
  1143. @asyncio.coroutine
  1144. def inner():
  1145. nonlocal proof
  1146. yield from waiter
  1147. proof += 1
  1148. @asyncio.coroutine
  1149. def outer():
  1150. nonlocal proof
  1151. yield from asyncio.shield(inner(), loop=self.loop)
  1152. proof += 100
  1153. f = asyncio.async(outer(), loop=self.loop)
  1154. test_utils.run_briefly(self.loop)
  1155. f.cancel()
  1156. with self.assertRaises(asyncio.CancelledError):
  1157. self.loop.run_until_complete(f)
  1158. waiter.set_result(None)
  1159. test_utils.run_briefly(self.loop)
  1160. self.assertEqual(proof, 1)
  1161. def test_shield_gather(self):
  1162. child1 = asyncio.Future(loop=self.loop)
  1163. child2 = asyncio.Future(loop=self.loop)
  1164. parent = asyncio.gather(child1, child2, loop=self.loop)
  1165. outer = asyncio.shield(parent, loop=self.loop)
  1166. test_utils.run_briefly(self.loop)
  1167. outer.cancel()
  1168. test_utils.run_briefly(self.loop)
  1169. self.assertTrue(outer.cancelled())
  1170. child1.set_result(1)
  1171. child2.set_result(2)
  1172. test_utils.run_briefly(self.loop)
  1173. self.assertEqual(parent.result(), [1, 2])
  1174. def test_gather_shield(self):
  1175. child1 = asyncio.Future(loop=self.loop)
  1176. child2 = asyncio.Future(loop=self.loop)
  1177. inner1 = asyncio.shield(child1, loop=self.loop)
  1178. inner2 = asyncio.shield(child2, loop=self.loop)
  1179. parent = asyncio.gather(inner1, inner2, loop=self.loop)
  1180. test_utils.run_briefly(self.loop)
  1181. parent.cancel()
  1182. # This should cancel inner1 and inner2 but bot child1 and child2.
  1183. test_utils.run_briefly(self.loop)
  1184. self.assertIsInstance(parent.exception(), asyncio.CancelledError)
  1185. self.assertTrue(inner1.cancelled())
  1186. self.assertTrue(inner2.cancelled())
  1187. child1.set_result(1)
  1188. child2.set_result(2)
  1189. test_utils.run_briefly(self.loop)
  1190. def test_as_completed_invalid_args(self):
  1191. fut = asyncio.Future(loop=self.loop)
  1192. # as_completed() expects a list of futures, not a future instance
  1193. self.assertRaises(TypeError, self.loop.run_until_complete,
  1194. asyncio.as_completed(fut, loop=self.loop))
  1195. coro = coroutine_function()
  1196. self.assertRaises(TypeError, self.loop.run_until_complete,
  1197. asyncio.as_completed(coro, loop=self.loop))
  1198. coro.close()
  1199. def test_wait_invalid_args(self):
  1200. fut = asyncio.Future(loop=self.loop)
  1201. # wait() expects a list of futures, not a future instance
  1202. self.assertRaises(TypeError, self.loop.run_until_complete,
  1203. asyncio.wait(fut, loop=self.loop))
  1204. coro = coroutine_function()
  1205. self.assertRaises(TypeError, self.loop.run_until_complete,
  1206. asyncio.wait(coro, loop=self.loop))
  1207. coro.close()
  1208. # wait() expects at least a future
  1209. self.assertRaises(ValueError, self.loop.run_until_complete,
  1210. asyncio.wait([], loop=self.loop))
  1211. def test_corowrapper_mocks_generator(self):
  1212. def check():
  1213. # A function that asserts various things.
  1214. # Called twice, with different debug flag values.
  1215. @asyncio.coroutine
  1216. def coro():
  1217. # The actual coroutine.
  1218. self.assertTrue(gen.gi_running)
  1219. yield from fut
  1220. # A completed Future used to run the coroutine.
  1221. fut = asyncio.Future(loop=self.loop)
  1222. fut.set_result(None)
  1223. # Call the coroutine.
  1224. gen = coro()
  1225. # Check some properties.
  1226. self.assertTrue(asyncio.iscoroutine(gen))
  1227. self.assertIsInstance(gen.gi_frame, types.FrameType)
  1228. self.assertFalse(gen.gi_running)
  1229. self.assertIsInstance(gen.gi_code, types.CodeType)
  1230. # Run it.
  1231. self.loop.run_until_complete(gen)
  1232. # The frame should have changed.
  1233. self.assertIsNone(gen.gi_frame)
  1234. # Save debug flag.
  1235. old_debug = asyncio.coroutines._DEBUG
  1236. try:
  1237. # Test with debug flag cleared.
  1238. asyncio.coroutines._DEBUG = False
  1239. check()
  1240. # Test with debug flag set.
  1241. asyncio.coroutines._DEBUG = True
  1242. check()
  1243. finally:
  1244. # Restore original debug flag.
  1245. asyncio.coroutines._DEBUG = old_debug
  1246. def test_yield_from_corowrapper(self):
  1247. old_debug = asyncio.coroutines._DEBUG
  1248. asyncio.coroutines._DEBUG = True
  1249. try:
  1250. @asyncio.coroutine
  1251. def t1():
  1252. return (yield from t2())
  1253. @asyncio.coroutine
  1254. def t2():
  1255. f = asyncio.Future(loop=self.loop)
  1256. asyncio.Task(t3(f), loop=self.loop)
  1257. return (yield from f)
  1258. @asyncio.coroutine
  1259. def t3(f):
  1260. f.set_result((1, 2, 3))
  1261. task = asyncio.Task(t1(), loop=self.loop)
  1262. val = self.loop.run_until_complete(task)
  1263. self.assertEqual(val, (1, 2, 3))
  1264. finally:
  1265. asyncio.coroutines._DEBUG = old_debug
  1266. def test_yield_from_corowrapper_send(self):
  1267. def foo():
  1268. a = yield
  1269. return a
  1270. def call(arg):
  1271. cw = asyncio.coroutines.CoroWrapper(foo(), foo)
  1272. cw.send(None)
  1273. try:
  1274. cw.send(arg)
  1275. except StopIteration as ex:
  1276. return ex.args[0]
  1277. else:
  1278. raise AssertionError('StopIteration was expected')
  1279. self.assertEqual(call((1, 2)), (1, 2))
  1280. self.assertEqual(call('spam'), 'spam')
  1281. def test_corowrapper_weakref(self):
  1282. wd = weakref.WeakValueDictionary()

Large files files are truncated, but you can click here to view the full file