Skip to content

Commit 8176935

Browse files
author
Ubuntu
committed
test(v1.x): fix closed-stream regression CI
1 parent b243f81 commit 8176935

2 files changed

Lines changed: 36 additions & 13 deletions

File tree

tests/server/test_lowlevel_exception_handling.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from unittest.mock import AsyncMock, Mock
22

3+
import anyio
34
import pytest
45

56
import mcp.types as types
@@ -72,3 +73,24 @@ async def test_normal_message_handling_not_affected():
7273

7374
# Verify _handle_request was called
7475
server._handle_request.assert_called_once()
76+
77+
78+
@pytest.mark.anyio
79+
async def test_handle_request_drops_response_when_transport_is_closed():
80+
"""Closed write streams during respond should be treated as expected drops."""
81+
server = Server("test-server")
82+
session = Mock(spec=ServerSession)
83+
84+
responder = Mock(spec=RequestResponder)
85+
responder.request_id = 1
86+
responder.respond = AsyncMock(side_effect=anyio.ClosedResourceError())
87+
88+
await server._handle_request(
89+
responder,
90+
types.PingRequest(method="ping"),
91+
session,
92+
{},
93+
raise_exceptions=False,
94+
)
95+
96+
responder.respond.assert_called_once()

tests/server/test_session.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Any
1+
from typing import Any, cast
22

33
import anyio
44
import pytest
@@ -221,64 +221,65 @@ async def mock_client():
221221

222222

223223
class _ClosedWriteStream:
224-
async def send(self, item):
224+
async def send(self, item: SessionMessage) -> None:
225225
raise anyio.ClosedResourceError
226226

227227

228228
class _OpenWriteStream:
229229
def __init__(self):
230230
self.items: list[SessionMessage] = []
231231

232-
async def send(self, item):
232+
async def send(self, item: SessionMessage) -> None:
233233
self.items.append(item)
234234

235235

236236
class _FakeResult:
237237
def __init__(self, payload: dict[str, Any]):
238238
self._payload = payload
239239

240-
def model_dump(self, **kwargs):
240+
def model_dump(self, **kwargs: Any) -> dict[str, Any]:
241241
return dict(self._payload)
242242

243243

244244
class _FakeNotification:
245245
def __init__(self, payload: dict[str, Any]):
246246
self._payload = payload
247247

248-
def model_dump(self, **kwargs):
248+
def model_dump(self, **kwargs: Any) -> dict[str, Any]:
249249
return dict(self._payload)
250250

251251

252252
@pytest.mark.anyio
253253
async def test_base_session_send_response_ignores_closed_write_stream():
254-
session = object.__new__(BaseSession)
254+
session = cast(Any, object.__new__(BaseSession))
255255
session._write_stream = _ClosedWriteStream()
256256

257-
await BaseSession._send_response(session, 1, _FakeResult({"ok": True}))
257+
await cast(Any, BaseSession)._send_response(session, 1, _FakeResult({"ok": True}))
258258

259259

260260
@pytest.mark.anyio
261261
async def test_base_session_send_notification_ignores_closed_write_stream():
262-
session = object.__new__(BaseSession)
262+
session = cast(Any, object.__new__(BaseSession))
263263
session._write_stream = _ClosedWriteStream()
264264

265-
await BaseSession.send_notification(
265+
await cast(Any, BaseSession).send_notification(
266266
session,
267267
_FakeNotification({"method": "notifications/progress", "params": {"progress": 1}}),
268268
)
269269

270270

271271
@pytest.mark.anyio
272272
async def test_base_session_send_notification_still_writes_when_open():
273-
session = object.__new__(BaseSession)
274-
session._write_stream = _OpenWriteStream()
273+
open_stream = _OpenWriteStream()
274+
session = cast(Any, object.__new__(BaseSession))
275+
session._write_stream = open_stream
275276

276-
await BaseSession.send_notification(
277+
await cast(Any, BaseSession).send_notification(
277278
session,
278279
_FakeNotification({"method": "notifications/progress", "params": {"progress": 1}}),
279280
)
280281

281-
assert len(session._write_stream.items) == 1
282+
assert len(open_stream.items) == 1
282283

283284

284285
@pytest.mark.anyio

0 commit comments

Comments
 (0)