Skip to content
Merged
Prev Previous commit
Next Next commit
Add more tests.
  • Loading branch information
serhiy-storchaka committed Dec 6, 2020
commit b6c95466e761b7841fef02587a46fbee904b50e0
8 changes: 4 additions & 4 deletions Lib/asyncio/streams.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ async def open_connection(host=None, port=None, *,
StreamReaderProtocol classes, just copy the code -- there's
really nothing special here except some convenience.)
"""
loop = events._get_event_loop()
loop = events.get_running_loop()
reader = StreamReader(limit=limit, loop=loop)
protocol = StreamReaderProtocol(reader, loop=loop)
transport, _ = await loop.create_connection(
Expand Down Expand Up @@ -73,7 +73,7 @@ async def start_server(client_connected_cb, host=None, port=None, *,
The return value is the same as loop.create_server(), i.e. a
Server object which can be used to stop the service.
"""
loop = events._get_event_loop()
loop = events.get_running_loop()

def factory():
reader = StreamReader(limit=limit, loop=loop)
Expand All @@ -90,7 +90,7 @@ def factory():
async def open_unix_connection(path=None, *,
limit=_DEFAULT_LIMIT, **kwds):
"""Similar to `open_connection` but works with UNIX Domain Sockets."""
loop = events._get_event_loop()
loop = events.get_running_loop()

reader = StreamReader(limit=limit, loop=loop)
protocol = StreamReaderProtocol(reader, loop=loop)
Expand All @@ -102,7 +102,7 @@ async def open_unix_connection(path=None, *,
async def start_unix_server(client_connected_cb, path=None, *,
limit=_DEFAULT_LIMIT, **kwds):
"""Similar to `start_server` but works with UNIX Domain Sockets."""
loop = events._get_event_loop()
loop = events.get_running_loop()

def factory():
reader = StreamReader(limit=limit, loop=loop)
Expand Down
4 changes: 2 additions & 2 deletions Lib/asyncio/subprocess.py
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ async def communicate(self, input=None):

async def create_subprocess_shell(cmd, stdin=None, stdout=None, stderr=None,
limit=streams._DEFAULT_LIMIT, **kwds):
loop = events._get_event_loop()
loop = events.get_running_loop()
protocol_factory = lambda: SubprocessStreamProtocol(limit=limit,
loop=loop)
transport, protocol = await loop.subprocess_shell(
Expand All @@ -212,7 +212,7 @@ async def create_subprocess_shell(cmd, stdin=None, stdout=None, stderr=None,
async def create_subprocess_exec(program, *args, stdin=None, stdout=None,
stderr=None, limit=streams._DEFAULT_LIMIT,
**kwds):
loop = events._get_event_loop()
loop = events.get_running_loop()
protocol_factory = lambda: SubprocessStreamProtocol(limit=limit,
loop=loop)
transport, protocol = await loop.subprocess_exec(
Expand Down
3 changes: 2 additions & 1 deletion Lib/asyncio/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -681,7 +681,8 @@ class _GatheringFuture(futures.Future):
cancelled.
"""

def __init__(self, children, *, loop=None):
def __init__(self, children, *, loop):
assert loop is not None
super().__init__(loop=loop)
self._children = children
self._cancel_requested = False
Expand Down
48 changes: 35 additions & 13 deletions Lib/test/test_asyncio/test_futures.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,22 +140,20 @@ def test_initial_state(self):
self.assertTrue(f.cancelled())

def test_constructor_without_loop(self):
asyncio.set_event_loop(self.loop)
asyncio.set_event_loop(None)
with self.assertWarns(DeprecationWarning) as cm:
with self.assertRaisesRegex(RuntimeError, 'There is no current event loop'):
self._new_future()
self.assertEqual(cm.warnings[0].filename, __file__)

def test_constructor_with_running_loop(self):
asyncio.set_event_loop(None)
async def test():
return self._new_future()
f = self.loop.run_until_complete(test())
self.assertIs(f._loop, self.loop)
self.assertIs(f.get_loop(), self.loop)

def test_constructor_with_global_loop(self):
# Deprecated in 3.10
asyncio.set_event_loop(self.loop)
self.addCleanup(asyncio.set_event_loop, None)
with self.assertWarns(DeprecationWarning) as cm:
Expand Down Expand Up @@ -491,17 +489,41 @@ def test_wrap_future_future(self):
f2 = asyncio.wrap_future(f1)
self.assertIs(f1, f2)

def test_wrap_future_use_global_loop(self):
with mock.patch('asyncio.futures.events') as events:
events.get_event_loop = lambda: self.loop
events._get_event_loop = lambda: self.loop
def run(arg):
return (arg, threading.get_ident())
ex = concurrent.futures.ThreadPoolExecutor(1)
f1 = ex.submit(run, 'oi')
def test_wrap_future_without_loop(self):
def run(arg):
return (arg, threading.get_ident())
ex = concurrent.futures.ThreadPoolExecutor(1)
f1 = ex.submit(run, 'oi')
with self.assertWarns(DeprecationWarning) as cm:
with self.assertRaises(RuntimeError):
asyncio.wrap_future(f1)
self.assertEqual(cm.warnings[0].filename, __file__)
ex.shutdown(wait=True)

def test_wrap_future_with_running_loop(self):
def run(arg):
return (arg, threading.get_ident())
ex = concurrent.futures.ThreadPoolExecutor(1)
f1 = ex.submit(run, 'oi')
async def test():
return asyncio.wrap_future(f1)
f2 = self.loop.run_until_complete(test())
self.assertIs(self.loop, f2._loop)
ex.shutdown(wait=True)

def test_wrap_future_with_global_loop(self):
# Deprecated in 3.10
asyncio.set_event_loop(self.loop)
self.addCleanup(asyncio.set_event_loop, None)
def run(arg):
return (arg, threading.get_ident())
ex = concurrent.futures.ThreadPoolExecutor(1)
f1 = ex.submit(run, 'oi')
with self.assertWarns(DeprecationWarning) as cm:
f2 = asyncio.wrap_future(f1)
self.assertIs(self.loop, f2._loop)
ex.shutdown(wait=True)
self.assertEqual(cm.warnings[0].filename, __file__)
self.assertIs(self.loop, f2._loop)
ex.shutdown(wait=True)

def test_wrap_future_cancel(self):
f1 = concurrent.futures.Future()
Expand Down
2 changes: 2 additions & 0 deletions Lib/test/test_asyncio/test_streams.py
Original file line number Diff line number Diff line change
Expand Up @@ -762,6 +762,7 @@ async def test():
def test_streamreader_constructor_with_global_loop(self):
# asyncio issue #184: Ensure that StreamReaderProtocol constructor
# retrieves the current loop if the loop parameter is not set
# Deprecated in 3.10
self.addCleanup(asyncio.set_event_loop, None)
asyncio.set_event_loop(self.loop)
with self.assertWarns(DeprecationWarning) as cm:
Expand Down Expand Up @@ -789,6 +790,7 @@ async def test():
def test_streamreaderprotocol_constructor_with_global_loop(self):
# asyncio issue #184: Ensure that StreamReaderProtocol constructor
# retrieves the current loop if the loop parameter is not set
# Deprecated in 3.10
self.addCleanup(asyncio.set_event_loop, None)
asyncio.set_event_loop(self.loop)
reader = mock.Mock()
Expand Down
160 changes: 146 additions & 14 deletions Lib/test/test_asyncio/test_tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,22 +200,76 @@ async def notmuch():
loop.close()

def test_ensure_future_coroutine(self):
async def notmuch():
return 'ok'
t = asyncio.ensure_future(notmuch(), loop=self.loop)
self.assertIs(t._loop, self.loop)
self.loop.run_until_complete(t)
self.assertTrue(t.done())
self.assertEqual(t.result(), 'ok')

a = notmuch()
self.addCleanup(a.close)
with self.assertWarns(DeprecationWarning) as cm:
with self.assertRaisesRegex(RuntimeError, 'There is no current event loop'):
asyncio.ensure_future(a)
self.assertEqual(cm.warnings[0].filename, __file__)

async def test():
return asyncio.ensure_future(notmuch())
t = self.loop.run_until_complete(test())
self.assertIs(t._loop, self.loop)
self.loop.run_until_complete(t)
self.assertTrue(t.done())
self.assertEqual(t.result(), 'ok')

# Deprecated in 3.10
asyncio.set_event_loop(self.loop)
self.addCleanup(asyncio.set_event_loop, None)
with self.assertWarns(DeprecationWarning) as cm:
t = asyncio.ensure_future(notmuch())
self.assertEqual(cm.warnings[0].filename, __file__)
self.assertIs(t._loop, self.loop)
self.loop.run_until_complete(t)
self.assertTrue(t.done())
self.assertEqual(t.result(), 'ok')

def test_ensure_future_coroutine_2(self):
with self.assertWarns(DeprecationWarning):
@asyncio.coroutine
def notmuch():
return 'ok'
t = asyncio.ensure_future(notmuch(), loop=self.loop)
self.assertIs(t._loop, self.loop)
self.loop.run_until_complete(t)
self.assertTrue(t.done())
self.assertEqual(t.result(), 'ok')

a = notmuch()
self.addCleanup(a.close)
with self.assertWarns(DeprecationWarning) as cm:
with self.assertRaisesRegex(RuntimeError, 'There is no current event loop'):
asyncio.ensure_future(a)
self.assertEqual(cm.warnings[0].filename, __file__)

async def test():
return asyncio.ensure_future(notmuch())
t = self.loop.run_until_complete(test())
self.assertIs(t._loop, self.loop)
self.loop.run_until_complete(t)
self.assertTrue(t.done())
self.assertEqual(t.result(), 'ok')

loop = asyncio.new_event_loop()
self.set_event_loop(loop)
t = asyncio.ensure_future(notmuch(), loop=loop)
self.assertIs(t._loop, loop)
loop.run_until_complete(t)
loop.close()
# Deprecated in 3.10
asyncio.set_event_loop(self.loop)
self.addCleanup(asyncio.set_event_loop, None)
with self.assertWarns(DeprecationWarning) as cm:
t = asyncio.ensure_future(notmuch())
self.assertEqual(cm.warnings[0].filename, __file__)
self.assertIs(t._loop, self.loop)
self.loop.run_until_complete(t)
self.assertTrue(t.done())
self.assertEqual(t.result(), 'ok')

def test_ensure_future_future(self):
f_orig = self.new_future(self.loop)
Expand Down Expand Up @@ -1693,6 +1747,47 @@ def runner():
self.assertEqual(set(result), {'ham', 'spam'})
self.assertEqual(len(result), 2)

def test_as_completed_nontask_without_loop(self):
async def coro():
return 42

a = coro()
self.addCleanup(a.close)

futs = asyncio.as_completed([a])
with self.assertWarns(DeprecationWarning) as cm:
with self.assertRaisesRegex(RuntimeError, 'There is no current event loop'):
list(futs)
self.assertEqual(cm.warnings[0].filename, __file__)

def test_as_completed_nontask_with_running_loop(self):
loop = self.new_test_loop()

async def coro():
return 42

async def test():
futs = list(asyncio.as_completed([coro()]))
self.assertEqual(len(futs), 1)
self.assertEqual(await futs[0], 42)

loop.run_until_complete(test())

def test_as_completed_nontask_with_global_loop(self):
# Deprecated in 3.10
async def coro():
return 42

loop = self.new_test_loop()
asyncio.set_event_loop(loop)
self.addCleanup(asyncio.set_event_loop, None)
futs = asyncio.as_completed([coro()])
with self.assertWarns(DeprecationWarning) as cm:
futs = list(futs)
self.assertEqual(cm.warnings[0].filename, __file__)
self.assertEqual(len(futs), 1)
self.assertEqual(loop.run_until_complete(futs[0]), 42)

def test_sleep(self):

def gen():
Expand Down Expand Up @@ -2152,6 +2247,42 @@ def test_gather_shield(self):
child2.set_result(2)
test_utils.run_briefly(self.loop)

def test_shield_coroutine_without_loop(self):
async def coro():
return 42

inner = coro()
self.addCleanup(inner.close)
with self.assertWarns(DeprecationWarning) as cm:
with self.assertRaisesRegex(RuntimeError, 'There is no current event loop'):
asyncio.shield(inner)
self.assertEqual(cm.warnings[0].filename, __file__)

def test_shield_coroutine_with_running_loop(self):
async def coro():
return 42

async def test():
return asyncio.shield(coro())
outer = self.loop.run_until_complete(test())
self.assertEqual(outer._loop, self.loop)
res = self.loop.run_until_complete(outer)
self.assertEqual(res, 42)

def test_shield_coroutine_with_global_loop(self):
# Deprecated in 3.10
async def coro():
return 42

asyncio.set_event_loop(self.loop)
self.addCleanup(asyncio.set_event_loop, None)
with self.assertWarns(DeprecationWarning) as cm:
outer = asyncio.shield(coro())
self.assertEqual(cm.warnings[0].filename, __file__)
self.assertEqual(outer._loop, self.loop)
res = self.loop.run_until_complete(outer)
self.assertEqual(res, 42)

def test_as_completed_invalid_args(self):
fut = self.new_future(self.loop)

Expand Down Expand Up @@ -3309,14 +3440,13 @@ def _check_empty_sequence_with_global_loop(self, seq_or_iter):
self.assertEqual(fut.result(), [])

def test_constructor_empty_sequence_with_global_loop(self):
try:
asyncio.set_event_loop(self.one_loop)
self._check_empty_sequence_with_global_loop([])
self._check_empty_sequence_with_global_loop(())
self._check_empty_sequence_with_global_loop(set())
self._check_empty_sequence_with_global_loop(iter(""))
finally:
asyncio.set_event_loop(None)
# Deprecated in 3.10
asyncio.set_event_loop(self.one_loop)
self.addCleanup(asyncio.set_event_loop, None)
self._check_empty_sequence_with_global_loop([])
self._check_empty_sequence_with_global_loop(())
self._check_empty_sequence_with_global_loop(set())
self._check_empty_sequence_with_global_loop(iter(""))

def test_constructor_heterogenous_futures(self):
fut1 = self.one_loop.create_future()
Expand Down Expand Up @@ -3416,9 +3546,11 @@ async def gather():
self.one_loop.run_until_complete(fut)

def test_constructor_with_global_loop(self):
# Deprecated in 3.10
async def coro():
return 'abc'
asyncio.set_event_loop(self.other_loop)
self.addCleanup(asyncio.set_event_loop, None)
gen1 = coro()
gen2 = coro()
with self.assertWarns(DeprecationWarning) as cm:
Expand Down