fix(processes): fix multiple clawx processes running concurently (#589)
Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Haze <hazeone@users.noreply.github.com> Co-authored-by: paisley <8197966+su8su@users.noreply.github.com> Co-authored-by: Felix <24791380+vcfgv@users.noreply.github.com>
This commit is contained in:
78
tests/unit/agents-routes.test.ts
Normal file
78
tests/unit/agents-routes.test.ts
Normal file
@@ -0,0 +1,78 @@
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
|
||||
const originalPlatform = process.platform;
|
||||
|
||||
const { mockExec } = vi.hoisted(() => ({
|
||||
mockExec: vi.fn(),
|
||||
}));
|
||||
|
||||
vi.mock('child_process', () => ({
|
||||
exec: mockExec,
|
||||
default: {
|
||||
exec: mockExec,
|
||||
},
|
||||
}));
|
||||
|
||||
vi.mock('@electron/utils/agent-config', () => ({
|
||||
assignChannelToAgent: vi.fn(),
|
||||
clearChannelBinding: vi.fn(),
|
||||
createAgent: vi.fn(),
|
||||
deleteAgentConfig: vi.fn(),
|
||||
listAgentsSnapshot: vi.fn(),
|
||||
removeAgentWorkspaceDirectory: vi.fn(),
|
||||
resolveAccountIdForAgent: vi.fn(),
|
||||
updateAgentName: vi.fn(),
|
||||
}));
|
||||
|
||||
vi.mock('@electron/utils/channel-config', () => ({
|
||||
deleteChannelAccountConfig: vi.fn(),
|
||||
}));
|
||||
|
||||
vi.mock('@electron/services/providers/provider-runtime-sync', () => ({
|
||||
syncAllProviderAuthToRuntime: vi.fn(),
|
||||
}));
|
||||
|
||||
vi.mock('@electron/api/route-utils', () => ({
|
||||
parseJsonBody: vi.fn(),
|
||||
sendJson: vi.fn(),
|
||||
}));
|
||||
|
||||
function setPlatform(platform: string): void {
|
||||
Object.defineProperty(process, 'platform', { value: platform, writable: true });
|
||||
}
|
||||
|
||||
describe('restartGatewayForAgentDeletion', () => {
|
||||
beforeEach(() => {
|
||||
vi.resetAllMocks();
|
||||
vi.resetModules();
|
||||
mockExec.mockImplementation((_cmd: string, _opts: object, cb: (err: Error | null, stdout: string) => void) => {
|
||||
cb(null, '');
|
||||
return {} as never;
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
Object.defineProperty(process, 'platform', { value: originalPlatform, writable: true });
|
||||
});
|
||||
|
||||
it('uses taskkill tree strategy on Windows when gateway pid is known', async () => {
|
||||
setPlatform('win32');
|
||||
const { restartGatewayForAgentDeletion } = await import('@electron/api/routes/agents');
|
||||
|
||||
const restart = vi.fn().mockResolvedValue(undefined);
|
||||
const getStatus = vi.fn(() => ({ pid: 4321, port: 18789 }));
|
||||
|
||||
await restartGatewayForAgentDeletion({
|
||||
gatewayManager: {
|
||||
getStatus,
|
||||
restart,
|
||||
},
|
||||
} as never);
|
||||
|
||||
expect(mockExec).toHaveBeenCalledWith(
|
||||
'taskkill /F /PID 4321 /T',
|
||||
expect.any(Function),
|
||||
);
|
||||
expect(restart).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user