|
8 | 8 | from .helpers import DummyStreamsContextManager, tee |
9 | 9 |
|
10 | 10 |
|
| 11 | +class CountingStreamsContextManager: |
| 12 | + def __init__(self, counter: dict[str, int]): |
| 13 | + self.counter = counter |
| 14 | + |
| 15 | + async def __aenter__(self): |
| 16 | + self.counter["enter"] += 1 |
| 17 | + return (object(), object()) |
| 18 | + |
| 19 | + async def __aexit__(self, exc_type, exc_val, exc_tb): |
| 20 | + self.counter["exit"] += 1 |
| 21 | + |
| 22 | + |
11 | 23 | @pytest.mark.asyncio |
12 | 24 | @patch("mcp.client.stdio.stdio_client", return_value=DummyStreamsContextManager()) |
13 | 25 | @patch("mcp.client.session.ClientSession.initialize", new_callable=AsyncMock, return_value=None) |
@@ -67,3 +79,33 @@ async def test_manual_connect_disconnect_works( |
67 | 79 |
|
68 | 80 | await server.cleanup() |
69 | 81 | assert server.session is None, "Server should be disconnected" |
| 82 | + |
| 83 | + |
| 84 | +@pytest.mark.asyncio |
| 85 | +@patch("agents.mcp.server.ClientSession.initialize", new_callable=AsyncMock, return_value=None) |
| 86 | +@patch("agents.mcp.server.stdio_client") |
| 87 | +async def test_cleanup_resets_exit_stack_and_reconnects( |
| 88 | + mock_stdio_client: AsyncMock, mock_initialize: AsyncMock |
| 89 | +): |
| 90 | + counter = {"enter": 0, "exit": 0} |
| 91 | + mock_stdio_client.side_effect = lambda params: CountingStreamsContextManager(counter) |
| 92 | + |
| 93 | + server = MCPServerStdio( |
| 94 | + params={ |
| 95 | + "command": tee, |
| 96 | + }, |
| 97 | + cache_tools_list=True, |
| 98 | + ) |
| 99 | + |
| 100 | + await server.connect() |
| 101 | + original_exit_stack = server.exit_stack |
| 102 | + |
| 103 | + await server.cleanup() |
| 104 | + assert server.session is None |
| 105 | + assert server.exit_stack is not original_exit_stack |
| 106 | + assert server.server_initialize_result is None |
| 107 | + assert counter == {"enter": 1, "exit": 1} |
| 108 | + |
| 109 | + await server.connect() |
| 110 | + await server.cleanup() |
| 111 | + assert counter == {"enter": 2, "exit": 2} |
0 commit comments