33
44import json
55import subprocess
6+ from functools import partial
67from pathlib import Path
78
89import pytest
9- from pycrdt_websocket import WebsocketServer
10- from websockets import serve # type: ignore
10+ from anyio import Event , create_task_group
11+ from hypercorn import Config
12+ from hypercorn .asyncio import serve
13+ from pycrdt_websocket import ASGIServer , WebsocketServer
14+ from utils import ensure_server_running
1115
1216# workaround until these PRs are merged:
1317# - https://github.com/yjs/y-websocket/pull/104
@@ -27,22 +31,33 @@ def update_json_file(path: Path, d: dict):
2731
2832
2933@pytest .fixture
30- async def yws_server (request ):
34+ async def yws_server (request , unused_tcp_port ):
3135 try :
32- kwargs = request .param
33- except Exception :
34- kwargs = {}
35- websocket_server = WebsocketServer (** kwargs )
36- try :
37- async with websocket_server , serve (websocket_server .serve , "localhost" , 1234 ):
38- yield websocket_server
36+ async with create_task_group () as tg :
37+ try :
38+ kwargs = request .param
39+ except Exception :
40+ kwargs = {}
41+ websocket_server = WebsocketServer (** kwargs )
42+ app = ASGIServer (websocket_server )
43+ config = Config ()
44+ config .bind = [f"localhost:{ unused_tcp_port } " ]
45+ shutdown_event = Event ()
46+ async with websocket_server as websocket_server :
47+ tg .start_soon (
48+ partial (serve , app , config , shutdown_trigger = shutdown_event .wait , mode = "asgi" )
49+ )
50+ await ensure_server_running ("localhost" , unused_tcp_port )
51+ pytest .port = unused_tcp_port
52+ yield unused_tcp_port , websocket_server
53+ shutdown_event .set ()
3954 except Exception :
4055 pass
4156
4257
4358@pytest .fixture
4459def yjs_client (request ):
4560 client_id = request .param
46- p = subprocess .Popen (f"yarn node { here / 'yjs_client_' } { client_id } .js" , shell = True )
61+ p = subprocess .Popen ([ " node" , f" { here / 'yjs_client_' } { client_id } .js" , str ( pytest . port )] )
4762 yield p
4863 p .kill ()
0 commit comments