def test_constructor_heterogenous_futures(self): fut1 = futures.Future(loop=self.one_loop) fut2 = futures.Future(loop=self.other_loop) with self.assertRaises(ValueError): tasks.gather(fut1, fut2) with self.assertRaises(ValueError): tasks.gather(fut1, loop=self.other_loop)
def test_constructor_homogenous_futures(self): children = [futures.Future(loop=self.other_loop) for i in range(3)] fut = tasks.gather(*children) self.assertIs(fut._loop, self.other_loop) self._run_loop(self.other_loop) self.assertFalse(fut.done()) fut = tasks.gather(*children, loop=self.other_loop) self.assertIs(fut._loop, self.other_loop) self._run_loop(self.other_loop) self.assertFalse(fut.done())
def _check_empty_sequence(self, seq_or_iter): events.set_event_loop(self.one_loop) self.addCleanup(events.set_event_loop, None) fut = tasks.gather(*seq_or_iter) self.assertIsInstance(fut, futures.Future) self.assertIs(fut._loop, self.one_loop) self._run_loop(self.one_loop) self.assertTrue(fut.done()) self.assertEqual(fut.result(), []) fut = tasks.gather(*seq_or_iter, loop=self.other_loop) self.assertIs(fut._loop, self.other_loop)
def test_constructor_loop_selection(self): @tasks.coroutine def coro(): return 'abc' gen1 = coro() gen2 = coro() fut = tasks.gather(gen1, gen2) self.assertIs(fut._loop, self.one_loop) gen1.close() gen2.close() gen3 = coro() gen4 = coro() fut = tasks.gather(gen3, gen4, loop=self.other_loop) self.assertIs(fut._loop, self.other_loop) gen3.close() gen4.close()
def test_shield_gather(self): child1 = futures.Future(loop=self.loop) child2 = futures.Future(loop=self.loop) parent = tasks.gather(child1, child2, loop=self.loop) outer = tasks.shield(parent, loop=self.loop) test_utils.run_briefly(self.loop) outer.cancel() test_utils.run_briefly(self.loop) self.assertTrue(outer.cancelled()) child1.set_result(1) child2.set_result(2) test_utils.run_briefly(self.loop) self.assertEqual(parent.result(), [1, 2])
def _check_success(self, **kwargs): a, b, c = [futures.Future(loop=self.one_loop) for i in range(3)] fut = tasks.gather(*self.wrap_futures(a, b, c), **kwargs) cb = Mock() fut.add_done_callback(cb) b.set_result(1) a.set_result(2) self._run_loop(self.one_loop) self.assertEqual(cb.called, False) self.assertFalse(fut.done()) c.set_result(3) self._run_loop(self.one_loop) cb.assert_called_once_with(fut) self.assertEqual(fut.result(), [2, 1, 3])
def test_one_cancellation(self): a, b, c, d, e = [futures.Future(loop=self.one_loop) for i in range(5)] fut = tasks.gather(a, b, c, d, e) cb = Mock() fut.add_done_callback(cb) a.set_result(1) b.cancel() self._run_loop(self.one_loop) self.assertTrue(fut.done()) cb.assert_called_once_with(fut) self.assertFalse(fut.cancelled()) self.assertIsInstance(fut.exception(), futures.CancelledError) # Does nothing c.set_result(3) d.cancel() e.set_exception(RuntimeError())
def test_one_exception(self): a, b, c, d, e = [futures.Future(loop=self.one_loop) for i in range(5)] fut = tasks.gather(*self.wrap_futures(a, b, c, d, e)) cb = Mock() fut.add_done_callback(cb) exc = ZeroDivisionError() a.set_result(1) b.set_exception(exc) self._run_loop(self.one_loop) self.assertTrue(fut.done()) cb.assert_called_once_with(fut) self.assertIs(fut.exception(), exc) # Does nothing c.set_result(3) d.cancel() e.set_exception(RuntimeError())
def test_gather_shield(self): child1 = futures.Future(loop=self.loop) child2 = futures.Future(loop=self.loop) inner1 = tasks.shield(child1, loop=self.loop) inner2 = tasks.shield(child2, loop=self.loop) parent = tasks.gather(inner1, inner2, loop=self.loop) test_utils.run_briefly(self.loop) parent.cancel() # This should cancel inner1 and inner2 but bot child1 and child2. test_utils.run_briefly(self.loop) self.assertIsInstance(parent.exception(), futures.CancelledError) self.assertTrue(inner1.cancelled()) self.assertTrue(inner2.cancelled()) child1.set_result(1) child2.set_result(2) test_utils.run_briefly(self.loop)
def test_return_exceptions(self): a, b, c, d = [futures.Future(loop=self.one_loop) for i in range(4)] fut = tasks.gather(*self.wrap_futures(a, b, c, d), return_exceptions=True) cb = Mock() fut.add_done_callback(cb) exc = ZeroDivisionError() exc2 = RuntimeError() b.set_result(1) c.set_exception(exc) a.set_result(3) self._run_loop(self.one_loop) self.assertFalse(fut.done()) d.set_exception(exc2) self._run_loop(self.one_loop) self.assertTrue(fut.done()) cb.assert_called_once_with(fut) self.assertEqual(fut.result(), [3, 1, exc, exc2])
def test_result_exception_one_cancellation(self): a, b, c, d, e, f = [futures.Future(loop=self.one_loop) for i in range(6)] fut = tasks.gather(a, b, c, d, e, f, return_exceptions=True) cb = Mock() fut.add_done_callback(cb) a.set_result(1) zde = ZeroDivisionError() b.set_exception(zde) c.cancel() self._run_loop(self.one_loop) self.assertFalse(fut.done()) d.set_result(3) e.cancel() rte = RuntimeError() f.set_exception(rte) res = self.one_loop.run_until_complete(fut) self.assertIsInstance(res[2], futures.CancelledError) self.assertIsInstance(res[4], futures.CancelledError) res[2] = res[4] = None self.assertEqual(res, [1, zde, None, 3, None, rte]) cb.assert_called_once_with(fut)
def test_result_exception_one_cancellation(self): a, b, c, d, e, f = [ futures.Future(loop=self.one_loop) for i in range(6) ] fut = tasks.gather(a, b, c, d, e, f, return_exceptions=True) cb = Mock() fut.add_done_callback(cb) a.set_result(1) zde = ZeroDivisionError() b.set_exception(zde) c.cancel() self._run_loop(self.one_loop) self.assertFalse(fut.done()) d.set_result(3) e.cancel() rte = RuntimeError() f.set_exception(rte) res = self.one_loop.run_until_complete(fut) self.assertIsInstance(res[2], futures.CancelledError) self.assertIsInstance(res[4], futures.CancelledError) res[2] = res[4] = None self.assertEqual(res, [1, zde, None, 3, None, rte]) cb.assert_called_once_with(fut)
def outer(): yield from tasks.gather(inner(a), inner(b), loop=self.one_loop)
def outer(): nonlocal proof, gatherer gatherer = tasks.gather(child1, child2, loop=self.one_loop) yield from gatherer proof += 100