"""gateway.pool 全局串行槽单测:验证 max_global_concurrency=1 时同一时间只跑1个请求、 排队超时返回 False。 用 asyncio.run 套同步测试,避免引入 pytest-asyncio 依赖。 """ import asyncio from gateway import pool _CFG = {"dispatch": {"max_global_concurrency": 1, "max_queue_wait_seconds": 590}} _CFG_FAST_TIMEOUT = {"dispatch": {"max_global_concurrency": 1, "max_queue_wait_seconds": 0.2}} def test_global_slot_serializes_to_one(): pool.init_global_slot(_CFG) state = {"active": 0, "peak": 0} async def task(): got = await pool.acquire_global_slot(_CFG) assert got is True state["active"] += 1 state["peak"] = max(state["peak"], state["active"]) await asyncio.sleep(0.03) state["active"] -= 1 pool.release_global_slot() async def run(): await asyncio.gather(*(task() for _ in range(4))) asyncio.run(run()) assert state["peak"] == 1, f"期望峰值并发=1,实际={state['peak']}" assert pool.get_pool_status()["global_busy"] == 0 def test_global_slot_timeout_returns_false(): pool.init_global_slot(_CFG_FAST_TIMEOUT) async def run(): first = await pool.acquire_global_slot(_CFG_FAST_TIMEOUT) assert first is True # 槽已被占用,第二个应在 0.2s 内超时 second = await pool.acquire_global_slot(_CFG_FAST_TIMEOUT) assert second is False pool.release_global_slot() asyncio.run(run()) assert pool.get_pool_status()["global_busy"] == 0 def test_get_pool_status_has_global_fields(): pool.init_global_slot(_CFG) status = pool.get_pool_status() assert "global_max" in status assert "global_busy" in status assert "global_waiting" in status assert status["global_max"] == 1