From 41da793b5ac91e0118f359c08ad88beea0da756d Mon Sep 17 00:00:00 2001 From: Raphael Deem Date: Sat, 28 Jan 2017 15:26:44 -0800 Subject: [PATCH] fix async run, add tests --- sanic/server.py | 3 ++- tests/test_async_run.py | 25 +++++++++++++++++++++++++ tests/test_loop_policy.py | 18 ++++++++++++++++++ tox.ini | 1 + 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 tests/test_async_run.py create mode 100644 tests/test_loop_policy.py diff --git a/sanic/server.py b/sanic/server.py index 48c3827e..8081cb30 100644 --- a/sanic/server.py +++ b/sanic/server.py @@ -297,7 +297,8 @@ def serve(host, port, request_handler, error_handler, before_start=None, :param protocol: Subclass of asyncio protocol class :return: Nothing """ - loop = async_loop.new_event_loop() + loop = loop or async_loop.new_event_loop() + asyncio.set_event_loop_policy(async_loop.EventLoopPolicy()) asyncio.set_event_loop(loop) if debug: diff --git a/tests/test_async_run.py b/tests/test_async_run.py new file mode 100644 index 00000000..4e7d68cd --- /dev/null +++ b/tests/test_async_run.py @@ -0,0 +1,25 @@ +from sanic import Sanic +from sanic.response import json +import asyncio +import requests +from threading import Thread +import pytest +import sys + +@pytest.mark.skipif(sys.version_info < (3, 6), + reason="fails on python 3.5 with travis") +def test_async_run(): + app = Sanic(__name__) + + @app.route("/") + async def test(request): + return json({"answer": "42"}) + + server = app.create_server(host="0.0.0.0", port=8001) + task = asyncio.ensure_future(server) + loop = asyncio.get_event_loop() + t = Thread(target=loop.run_forever) + t.start() + res = requests.get('http://localhost:8001') + loop.stop() + assert res.json()['answer'] == '42' diff --git a/tests/test_loop_policy.py b/tests/test_loop_policy.py new file mode 100644 index 00000000..7737b6b0 --- /dev/null +++ b/tests/test_loop_policy.py @@ -0,0 +1,18 @@ +from sanic import Sanic +from sanic.response import text +from sanic.utils import sanic_endpoint_test +import asyncio +import uvloop + +def test_loop_policy(): + app = Sanic('test_loop_policy') + + @app.route('/') + def test(request): + return text("OK") + + server = app.create_server() + + request, response = sanic_endpoint_test(app) + assert isinstance(asyncio.get_event_loop_policy(), + uvloop.EventLoopPolicy) diff --git a/tox.ini b/tox.ini index 009d971c..8669e48b 100644 --- a/tox.ini +++ b/tox.ini @@ -14,6 +14,7 @@ deps = aiohttp pytest beautifulsoup4 + requests commands = pytest tests {posargs}