summaryrefslogtreecommitdiffstatshomepage
path: root/tests/net_hosted/uasyncio_start_server.py
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2021-06-25 16:53:20 +1000
committerDamien George <damien@micropython.org>2021-06-26 22:30:22 +1000
commit7ec95c2768793c28351d13a9c471991bb2d6dcff (patch)
treecc65bc817cca1c6c9455316c1a588068d26e5b4b /tests/net_hosted/uasyncio_start_server.py
parentcbc9a591a437177ac978302c16b56dd6cb46104f (diff)
downloadmicropython-7ec95c2768793c28351d13a9c471991bb2d6dcff.tar.gz
micropython-7ec95c2768793c28351d13a9c471991bb2d6dcff.zip
extmod/uasyncio: Get addr and bind server socket before creating task.
Currently when using uasyncio.start_server() the socket configuration is done inside a uasyncio.create_task() background function. If the address and port are already in use however this throws an OSError which cannot be cleanly caught behind the create_task(). This commit moves the getaddrinfo and socket binding to the start_server() function, and only creates the task if that succeeds. This means that any OSError from the initial socket configuration is propagated directly up the call stack, compatible with CPython behaviour. See #7444. Signed-off-by: Damien George <damien@micropython.org>
Diffstat (limited to 'tests/net_hosted/uasyncio_start_server.py')
-rw-r--r--tests/net_hosted/uasyncio_start_server.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/tests/net_hosted/uasyncio_start_server.py b/tests/net_hosted/uasyncio_start_server.py
new file mode 100644
index 0000000000..f13402979f
--- /dev/null
+++ b/tests/net_hosted/uasyncio_start_server.py
@@ -0,0 +1,31 @@
+# Test basic behaviour of uasyncio.start_server()
+
+try:
+ import uasyncio as asyncio
+except ImportError:
+ try:
+ import asyncio
+ except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+
+async def test():
+ # Test creating 2 servers using the same address
+ print("create server1")
+ server1 = await asyncio.start_server(None, "0.0.0.0", 8000)
+ try:
+ print("create server2")
+ await asyncio.start_server(None, "0.0.0.0", 8000)
+ except OSError as er:
+ print("OSError")
+
+ # Wait for server to close.
+ async with server1:
+ print("sleep")
+ await asyncio.sleep(0)
+
+ print("done")
+
+
+asyncio.run(test())