Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions tests/test_tcp.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,8 @@ async def start_server():

srv_socks = srv.sockets
self.assertTrue(srv_socks)
if self.has_start_serving():
self.assertTrue(srv.is_serving())

addr = srv_socks[0].getsockname()

Expand All @@ -147,6 +149,9 @@ async def start_server():
for srv_sock in srv_socks:
self.assertEqual(srv_sock.fileno(), -1)

if self.has_start_serving():
self.assertFalse(srv.is_serving())

async def start_server_sock():
nonlocal CNT
CNT = 0
Expand All @@ -167,6 +172,8 @@ async def start_server_sock():

srv_socks = srv.sockets
self.assertTrue(srv_socks)
if self.has_start_serving():
self.assertTrue(srv.is_serving())

tasks = []
for _ in range(TOTAL_CNT):
Expand All @@ -183,6 +190,9 @@ async def start_server_sock():
for srv_sock in srv_socks:
self.assertEqual(srv_sock.fileno(), -1)

if self.has_start_serving():
self.assertFalse(srv.is_serving())

self.loop.run_until_complete(start_server())
self.assertEqual(CNT, TOTAL_CNT)

Expand All @@ -206,6 +216,8 @@ async def start_server_ephemeral_ports():

srv_socks = srv.sockets
self.assertTrue(srv_socks)
if self.has_start_serving():
self.assertTrue(srv.is_serving())

host, port = srv_socks[0].getsockname()
self.assertNotEqual(0, port)
Expand All @@ -217,6 +229,9 @@ async def start_server_ephemeral_ports():
for srv_sock in srv_socks:
self.assertEqual(srv_sock.fileno(), -1)

if self.has_start_serving():
self.assertFalse(srv.is_serving())

self.loop.run_until_complete(start_server_ephemeral_ports())

def test_create_server_4(self):
Expand Down Expand Up @@ -335,6 +350,60 @@ def test_create_server_8(self):
self.loop.create_server(
lambda: None, host='::', port=0, ssl_handshake_timeout=10))

def test_create_server_9(self):
if not self.has_start_serving():
raise unittest.SkipTest()

async def handle_client(reader, writer):
pass

async def start_server():
srv = await asyncio.start_server(
handle_client,
'127.0.0.1', 0,
family=socket.AF_INET,
loop=self.loop,
start_serving=False)

await srv.start_serving()
self.assertTrue(srv.is_serving())

# call start_serving again
await srv.start_serving()
self.assertTrue(srv.is_serving())

srv.close()
await srv.wait_closed()
self.assertFalse(srv.is_serving())

self.loop.run_until_complete(start_server())

def test_create_server_10(self):
if not self.has_start_serving():
raise unittest.SkipTest()

async def handle_client(reader, writer):
pass

async def start_server():
srv = await asyncio.start_server(
handle_client,
'127.0.0.1', 0,
family=socket.AF_INET,
loop=self.loop,
start_serving=False)

fut = asyncio.ensure_future(srv.serve_forever(), loop=self.loop)
await asyncio.sleep(0, loop=self.loop)
self.assertTrue(srv.is_serving())

fut.cancel()
with self.assertRaises(asyncio.CancelledError):
await fut
self.assertFalse(srv.is_serving())

self.loop.run_until_complete(start_server())

def test_create_connection_open_con_addr(self):
async def client(addr):
reader, writer = await asyncio.open_connection(
Expand Down
10 changes: 10 additions & 0 deletions tests/test_unix.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ async def start_server():
try:
srv_socks = srv.sockets
self.assertTrue(srv_socks)
if self.has_start_serving():
self.assertTrue(srv.is_serving())

tasks = []
for _ in range(TOTAL_CNT):
Expand All @@ -83,6 +85,9 @@ async def start_server():
for srv_sock in srv_socks:
self.assertEqual(srv_sock.fileno(), -1)

if self.has_start_serving():
self.assertFalse(srv.is_serving())

# asyncio doesn't cleanup the sock file
self.assertTrue(os.path.exists(sock_name))

Expand All @@ -100,6 +105,8 @@ async def start_server_sock(start_server):
try:
srv_socks = srv.sockets
self.assertTrue(srv_socks)
if self.has_start_serving():
self.assertTrue(srv.is_serving())

tasks = []
for _ in range(TOTAL_CNT):
Expand All @@ -117,6 +124,9 @@ async def start_server_sock(start_server):
for srv_sock in srv_socks:
self.assertEqual(srv_sock.fileno(), -1)

if self.has_start_serving():
self.assertFalse(srv.is_serving())

# asyncio doesn't cleanup the sock file
self.assertTrue(os.path.exists(sock_name))

Expand Down
4 changes: 4 additions & 0 deletions uvloop/_testbase.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ def new_loop(self):
def mock_pattern(self, str):
return MockPattern(str)

def has_start_serving(self):
return not (self.is_asyncio_loop() and
sys.version_info[:2] in [(3, 5), (3, 6)])

def is_asyncio_loop(self):
return type(self.loop).__module__.startswith('asyncio.')

Expand Down
1 change: 1 addition & 0 deletions uvloop/handles/pipe.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ cdef class UnixServer(UVStreamServer):

@staticmethod
cdef UnixServer new(Loop loop, object protocol_factory, Server server,
object backlog,
object ssl,
object ssl_handshake_timeout,
object ssl_shutdown_timeout)
Expand Down
3 changes: 2 additions & 1 deletion uvloop/handles/pipe.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,14 @@ cdef class UnixServer(UVStreamServer):

@staticmethod
cdef UnixServer new(Loop loop, object protocol_factory, Server server,
object backlog,
object ssl,
object ssl_handshake_timeout,
object ssl_shutdown_timeout):

cdef UnixServer handle
handle = UnixServer.__new__(UnixServer)
handle._init(loop, protocol_factory, server,
handle._init(loop, protocol_factory, server, backlog,
ssl, ssl_handshake_timeout, ssl_shutdown_timeout)
__pipe_init_uv_handle(<UVStream>handle, loop)
return handle
Expand Down
7 changes: 5 additions & 2 deletions uvloop/handles/streamserver.pxd
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
cdef class UVStreamServer(UVSocketHandle):
cdef:
int backlog
object ssl
object ssl_handshake_timeout
object ssl_shutdown_timeout
Expand All @@ -10,13 +11,15 @@ cdef class UVStreamServer(UVSocketHandle):
# All "inline" methods are final

cdef inline _init(self, Loop loop, object protocol_factory,
Server server, object ssl,
Server server,
object backlog,
object ssl,
object ssl_handshake_timeout,
object ssl_shutdown_timeout)

cdef inline _mark_as_open(self)

cdef inline listen(self, backlog)
cdef inline listen(self)
cdef inline _on_listen(self)

cdef UVStream _make_new_transport(self, object protocol, object waiter)
19 changes: 11 additions & 8 deletions uvloop/handles/streamserver.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,17 @@ cdef class UVStreamServer(UVSocketHandle):
self.protocol_factory = None

cdef inline _init(self, Loop loop, object protocol_factory,
Server server, object ssl,
Server server,
object backlog,
object ssl,
object ssl_handshake_timeout,
object ssl_shutdown_timeout):

if not isinstance(backlog, int):
# Don't allow floats
raise TypeError('integer argument expected, got {}'.format(
type(backlog).__name__))

if ssl is not None:
if not isinstance(ssl, ssl_SSLContext):
raise TypeError(
Expand All @@ -27,6 +34,7 @@ cdef class UVStreamServer(UVSocketHandle):
raise ValueError(
'ssl_shutdown_timeout is only meaningful with ssl')

self.backlog = backlog
self.ssl = ssl
self.ssl_handshake_timeout = ssl_handshake_timeout
self.ssl_shutdown_timeout = ssl_shutdown_timeout
Expand All @@ -35,23 +43,18 @@ cdef class UVStreamServer(UVSocketHandle):
self.protocol_factory = protocol_factory
self._server = server

cdef inline listen(self, backlog):
cdef inline listen(self):
cdef int err
self._ensure_alive()

if not isinstance(backlog, int):
# Don't allow floats
raise TypeError('integer argument expected, got {}'.format(
type(backlog).__name__))

if self.protocol_factory is None:
raise RuntimeError('unable to listen(); no protocol_factory')

if self.opened != 1:
raise RuntimeError('unopened TCPServer')

err = uv.uv_listen(<uv.uv_stream_t*> self._handle,
backlog,
self.backlog,
__uv_streamserver_on_listen)
if err < 0:
exc = convert_error(err)
Expand Down
4 changes: 3 additions & 1 deletion uvloop/handles/tcp.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ cdef class TCPServer(UVStreamServer):

@staticmethod
cdef TCPServer new(Loop loop, object protocol_factory, Server server,
object ssl, unsigned int flags,
unsigned int flags,
object backlog,
object ssl,
object ssl_handshake_timeout,
object ssl_shutdown_timeout)

Expand Down
6 changes: 4 additions & 2 deletions uvloop/handles/tcp.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,15 @@ cdef class TCPServer(UVStreamServer):

@staticmethod
cdef TCPServer new(Loop loop, object protocol_factory, Server server,
object ssl, unsigned int flags,
unsigned int flags,
object backlog,
object ssl,
object ssl_handshake_timeout,
object ssl_shutdown_timeout):

cdef TCPServer handle
handle = TCPServer.__new__(TCPServer)
handle._init(loop, protocol_factory, server,
handle._init(loop, protocol_factory, server, backlog,
ssl, ssl_handshake_timeout, ssl_shutdown_timeout)
__tcp_init_uv_handle(<UVStream>handle, loop, flags)
return handle
Expand Down
3 changes: 3 additions & 0 deletions uvloop/includes/stdlib.pxi
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ cdef gc_disable = gc.disable
cdef iter_chain = itertools.chain
cdef inspect_isgenerator = inspect.isgenerator

cdef int has_IPV6_V6ONLY = hasattr(socket, 'IPV6_V6ONLY')
cdef int IPV6_V6ONLY = getattr(socket, 'IPV6_V6ONLY', -1)
cdef int has_SO_REUSEPORT = hasattr(socket, 'SO_REUSEPORT')
cdef int SO_REUSEPORT = getattr(socket, 'SO_REUSEPORT', 0)
cdef int SO_BROADCAST = getattr(socket, 'SO_BROADCAST')
Expand Down Expand Up @@ -118,6 +120,7 @@ cdef sys_set_coroutine_wrapper = sys.set_coroutine_wrapper
cdef sys_get_coroutine_wrapper = sys.get_coroutine_wrapper
cdef sys_getframe = sys._getframe
cdef sys_version_info = sys.version_info
cdef str sys_platform = sys.platform

cdef ssl_SSLContext = ssl.SSLContext
cdef ssl_MemoryBIO = ssl.MemoryBIO
Expand Down
9 changes: 0 additions & 9 deletions uvloop/loop.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -161,15 +161,6 @@ cdef class Loop:

cdef _getnameinfo(self, system.sockaddr *addr, int flags)

cdef _create_server(self, system.sockaddr *addr,
object protocol_factory,
Server server,
object ssl,
bint reuse_port,
object backlog,
object ssl_handshake_timeout,
object ssl_shutdown_timeout)

cdef _track_transport(self, UVBaseTransport transport)
cdef _fileobj_to_fd(self, fileobj)
cdef _ensure_fd_no_transport(self, fd)
Expand Down
Loading