Skip to content

Commit

Permalink
Use Application.loop in run_app
Browse files Browse the repository at this point in the history
  • Loading branch information
asvetlov committed Jan 13, 2016
1 parent f418dca commit 0733de2
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 55 deletions.
7 changes: 3 additions & 4 deletions aiohttp/web.py
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,7 @@ def __repr__(self):
return "<Application>"


def run_app(app, *, host='0.0.0.0', port=None, loop=None,
def run_app(app, *, host='0.0.0.0', port=None,
shutdown_timeout=60.0, ssl_context=None):
"""Run an app locally"""
if port is None:
Expand All @@ -298,8 +298,7 @@ def run_app(app, *, host='0.0.0.0', port=None, loop=None,
else:
port = 8443

if loop is None:
loop = asyncio.get_event_loop()
loop = app.loop

handler = app.make_handler()
srv = loop.run_until_complete(loop.create_server(handler, host, port,
Expand All @@ -313,7 +312,7 @@ def run_app(app, *, host='0.0.0.0', port=None, loop=None,

try:
loop.run_forever()
except KeyboardInterrupt:
except KeyboardInterrupt: # pragma: no branch
pass
finally:
srv.close()
Expand Down
8 changes: 2 additions & 6 deletions docs/web_reference.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1522,6 +1522,8 @@ Utilities
Perhaps production config will use more sophisticated runner but it
good enough at least at very beginning stage.

The function uses *app.loop* as event loop to run.

:param app: :class:`Application` instance to run

:param str host: host for HTTP server, ``'0.0.0.0'`` by default
Expand All @@ -1543,12 +1545,6 @@ Utilities
:param ssl_context: :class:`ssl.SSLContext` for HTTPS server,
``None`` for HTTP connection.

:param loop: :ref:`event loop<asyncio-event-loop>` used
for processing HTTP requests.

If param is ``None`` :func:`asyncio.get_event_loop`
used for getting default event loop.


Constants
---------
Expand Down
51 changes: 6 additions & 45 deletions tests/test_run_app.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import asyncio
import pytest
import ssl

from unittest import mock
Expand All @@ -9,35 +8,26 @@
def test_run_app_http(loop):
loop = mock.Mock(spec=asyncio.AbstractEventLoop, wrap=loop)
loop.call_later(0.01, loop.stop)
app = mock.Mock(wrap=web.Application(loop=loop))

web.run_app(app, loop=loop)
app = web.Application(loop=loop)

app.make_handler.assert_called_with()
web.run_app(app)

loop.close.assert_called_with()
app.finish.assert_called_with()
app.shutdown.assert_called_with()

loop.create_server.assert_called_with(mock.ANY, '0.0.0.0', 8080, ssl=None)


def test_run_app_https(loop):
loop = mock.Mock(spec=asyncio.AbstractEventLoop, wrap=loop)
loop.call_later(0.01, loop.stop)

app = mock.Mock(wrap=web.Application(loop=loop))
app = web.Application(loop=loop)

ssl_context = ssl.create_default_context()

web.run_app(app, ssl_context=ssl_context, loop=loop)

app.make_handler.assert_called_with()
web.run_app(app, ssl_context=ssl_context)

loop.close.assert_called_with()
app.finish.assert_called_with()
app.shutdown.assert_called_with()

loop.create_server.assert_called_with(mock.ANY, '0.0.0.0', 8443,
ssl=ssl_context)

Expand All @@ -49,37 +39,8 @@ def test_run_app_nondefault_host_port(loop, unused_port):
loop = mock.Mock(spec=asyncio.AbstractEventLoop, wrap=loop)
loop.call_later(0.01, loop.stop)

app = mock.Mock(wrap=web.Application(loop=loop))
app = web.Application(loop=loop)

web.run_app(app, host=host, port=port, loop=loop)
web.run_app(app, host=host, port=port)

loop.create_server.assert_called_with(mock.ANY, host, port, ssl=None)


def test_run_app_default_eventloop(loop):
# don't perform any assert checks just make sure the run_app was successful
# mocking a default loop produces a failure on Python 3.4
# with PYTHONASYNCIODEBUG enabled

asyncio.set_event_loop(loop)
loop.call_later(0.01, loop.stop)

web.run_app(web.Application())


def test_run_app_exit_with_exception(loop):
loop = mock.Mock(spec=asyncio.AbstractEventLoop, wrap=loop)

loop.run_forever.return_value = None # to disable wrapping
loop.run_forever.side_effect = exc = RuntimeError()

app = mock.Mock(wrap=web.Application(loop=loop))

with pytest.raises(RuntimeError) as ctx:
web.run_app(app, loop=loop)

assert ctx.value is exc

assert not loop.close.called
app.finish.assert_called_with()
app.shutdown.assert_called_with()

0 comments on commit 0733de2

Please sign in to comment.