PageRenderTime 59ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 1ms

/Lib/test/test_asyncio/test_tasks.py

https://bitbucket.org/tpn/pyparallel
Python | 2086 lines | 1626 code | 385 blank | 75 comment | 91 complexity | fb01735e9f0c009b565c736b66cc1ab7 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, 0BSD, BSD-3-Clause, Unlicense

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

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

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