Skip to content

Commit 5037454

Browse files
committed
proof of concept for deterministic close race
1 parent 8137f25 commit 5037454

File tree

2 files changed

+8
-2
lines changed

2 files changed

+8
-2
lines changed

tests/issue_96.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ async def handler(request):
8181
try:
8282
ws = await request.accept()
8383
await ws.send_message('issue96')
84-
await trio.sleep(random()/1000)
84+
await ws._for_testing_peer_closed_connection.wait()
8585
await trio.aclose_forcefully(ws._stream)
8686
except ConnectionClosed:
8787
pass
@@ -93,13 +93,14 @@ async def main():
9393
ssl_context=None)
9494
await nursery.start(serve)
9595

96-
for n in range(1000):
96+
for n in range(1):
9797
logging.info('Connection %d', n)
9898
try:
9999
connection = await connect_websocket(nursery, 'localhost', 8000,
100100
'/', use_ssl=False)
101101
await connection.get_message()
102102
await connection.aclose()
103+
await trio.sleep(.1)
103104
except ConnectionClosed:
104105
pass
105106

trio_websocket/_impl.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,9 @@ def __init__(self, stream, wsproto, *, path=None,
544544
# Set once a WebSocket closed handshake takes place, i.e after a close
545545
# frame has been sent and a close frame has been received.
546546
self._close_handshake = trio.Event()
547+
# Set immediately upon receiving closed event from peer. Used to
548+
# test close race conditions between client and server.
549+
self._for_testing_peer_closed_connection = trio.Event()
547550

548551
@property
549552
def closed(self):
@@ -807,6 +810,8 @@ async def _handle_connection_closed_event(self, event):
807810
808811
:param event:
809812
'''
813+
self._for_testing_peer_closed_connection.set()
814+
await trio.sleep(0)
810815
await self._write_pending()
811816
await self._close_web_socket(event.code, event.reason or None)
812817
self._close_handshake.set()

0 commit comments

Comments
 (0)