describe('MCP Tools Race Condition Fix', () => { describe('fetchAndSaveTools timeout behavior', () => { it('should demonstrate the race condition with 5000ms timeout', (done) => { const serverDisconnectTime = 1000; const toolsFetchTimeout = 5000; let serverDisconnected = false; setTimeout(() => { serverDisconnected = true; }, serverDisconnectTime); setTimeout(() => { expect(serverDisconnected).toBe(true); done(); }, toolsFetchTimeout); }); it('should fix the race condition with 1000ms timeout', (done) => { const serverDisconnectTime = 2000; const fixedToolsFetchTimeout = 1000; const serverConnected = true; let serverDisconnected = false; let toolsFetchCompleted = false; setTimeout(() => { serverDisconnected = true; }, serverDisconnectTime); setTimeout(() => { if (!serverDisconnected) { toolsFetchCompleted = true; } }, fixedToolsFetchTimeout); setTimeout(() => { expect(toolsFetchCompleted).toBe(true); expect(serverDisconnected).toBe(false); done(); }, fixedToolsFetchTimeout + 100); }); }); describe('connection state checking logic', () => { it('should check connection state before attempting tool fetch', () => { const serversMap = new Map(); const serverId = 'test-server'; const checkConnectionBeforeFetch = (id: string): boolean => { return serversMap.has(id); }; expect(checkConnectionBeforeFetch(serverId)).toBe(false); serversMap.set(serverId, { connected: true }); expect(checkConnectionBeforeFetch(serverId)).toBe(true); serversMap.delete(serverId); expect(checkConnectionBeforeFetch(serverId)).toBe(false); }); it('should implement proper double-check for server connection', () => { const serversMap = new Map(); const serverId = 'test-server'; const logMessages: string[] = []; const mockLogger = { warn: (msg: string) => logMessages.push(msg) }; const fetchAndSaveToolsLogic = (id: string): boolean => { if (!serversMap.has(id)) { mockLogger.warn(`Server ${id} was disconnected before tools could be fetched`); return false; } if (serversMap.has(id)) { return true; } return false; }; const result1 = fetchAndSaveToolsLogic(serverId); expect(result1).toBe(false); expect(logMessages).toContain('Server test-server was disconnected before tools could be fetched'); serversMap.set(serverId, { connected: true }); const result2 = fetchAndSaveToolsLogic(serverId); expect(result2).toBe(true); }); }); describe('timeout value validation', () => { it('should verify that 1000ms is sufficient for tool fetching', () => { const reducedTimeout = 1000; const originalTimeout = 5000; expect(reducedTimeout).toBeLessThan(originalTimeout); expect(reducedTimeout).toBeGreaterThan(0); expect(reducedTimeout).toBe(1000); const timeoutRatio = reducedTimeout / originalTimeout; expect(timeoutRatio).toBe(0.2); }); }); });