summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--extmod/uasyncio/stream.py27
-rw-r--r--tests/net_hosted/uasyncio_start_server.py31
-rw-r--r--tests/net_hosted/uasyncio_start_server.py.exp5
3 files changed, 51 insertions, 12 deletions
diff --git a/extmod/uasyncio/stream.py b/extmod/uasyncio/stream.py
index 3a68881da..8de2d2599 100644
--- a/extmod/uasyncio/stream.py
+++ b/extmod/uasyncio/stream.py
@@ -107,15 +107,7 @@ class Server:
async def wait_closed(self):
await self.task
- async def _serve(self, cb, host, port, backlog):
- import usocket as socket
-
- ai = socket.getaddrinfo(host, port)[0] # TODO this is blocking!
- s = socket.socket()
- s.setblocking(False)
- s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- s.bind(ai[-1])
- s.listen(backlog)
+ async def _serve(self, s, cb):
# Accept incoming connections
while True:
try:
@@ -137,9 +129,20 @@ class Server:
# Helper function to start a TCP stream server, running as a new task
# TODO could use an accept-callback on socket read activity instead of creating a task
async def start_server(cb, host, port, backlog=5):
- s = Server()
- s.task = core.create_task(s._serve(cb, host, port, backlog))
- return s
+ import usocket as socket
+
+ # Create and bind server socket.
+ host = socket.getaddrinfo(host, port)[0] # TODO this is blocking!
+ s = socket.socket()
+ s.setblocking(False)
+ s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ s.bind(host[-1])
+ s.listen(backlog)
+
+ # Create and return server object and task.
+ srv = Server()
+ srv.task = core.create_task(srv._serve(s, cb))
+ return srv
################################################################################
diff --git a/tests/net_hosted/uasyncio_start_server.py b/tests/net_hosted/uasyncio_start_server.py
new file mode 100644
index 000000000..f13402979
--- /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())
diff --git a/tests/net_hosted/uasyncio_start_server.py.exp b/tests/net_hosted/uasyncio_start_server.py.exp
new file mode 100644
index 000000000..0fb8e6a63
--- /dev/null
+++ b/tests/net_hosted/uasyncio_start_server.py.exp
@@ -0,0 +1,5 @@
+create server1
+create server2
+OSError
+sleep
+done