test: fix Windows CI execution and resolve exposed platform failures (#24476)

This commit is contained in:
Emily Hedlund
2026-04-03 08:50:29 -07:00
committed by GitHub
parent 7a70ab9a5d
commit ca0e6f9bd9
21 changed files with 308 additions and 175 deletions
@@ -22,6 +22,7 @@ import type {
import { spawn, type ChildProcess } from 'node:child_process';
import { EventEmitter } from 'node:events';
import type { Writable } from 'node:stream';
import path from 'node:path';
vi.mock('node:child_process', () => ({
spawn: vi.fn(),
@@ -49,14 +50,14 @@ class MockSandboxManager implements SandboxManager {
}
getWorkspace(): string {
return '/workspace';
return path.resolve('/workspace');
}
}
describe('SandboxedFileSystemService', () => {
let sandboxManager: MockSandboxManager;
let service: SandboxedFileSystemService;
const cwd = '/test/cwd';
const cwd = path.resolve('/test/cwd');
beforeEach(() => {
sandboxManager = new MockSandboxManager();
@@ -77,7 +78,8 @@ describe('SandboxedFileSystemService', () => {
vi.mocked(spawn).mockReturnValue(mockChild);
const readPromise = service.readTextFile('/test/cwd/file.txt');
const testFile = path.resolve('/test/cwd/file.txt');
const readPromise = service.readTextFile(testFile);
// Use setImmediate to ensure events are emitted after the promise starts executing
setImmediate(() => {
@@ -90,15 +92,15 @@ describe('SandboxedFileSystemService', () => {
expect(vi.mocked(sandboxManager.prepareCommand)).toHaveBeenCalledWith(
expect.objectContaining({
command: '__read',
args: ['/test/cwd/file.txt'],
args: [testFile],
policy: {
allowedPaths: ['/test/cwd/file.txt'],
allowedPaths: [testFile],
},
}),
);
expect(spawn).toHaveBeenCalledWith(
'sandbox.exe',
['0', cwd, '__read', '/test/cwd/file.txt'],
['0', cwd, '__read', testFile],
expect.any(Object),
);
});
@@ -117,10 +119,8 @@ describe('SandboxedFileSystemService', () => {
vi.mocked(spawn).mockReturnValue(mockChild);
const writePromise = service.writeTextFile(
'/test/cwd/file.txt',
'new content',
);
const testFile = path.resolve('/test/cwd/file.txt');
const writePromise = service.writeTextFile(testFile, 'new content');
setImmediate(() => {
mockChild.emit('close', 0);
@@ -134,12 +134,12 @@ describe('SandboxedFileSystemService', () => {
expect(vi.mocked(sandboxManager.prepareCommand)).toHaveBeenCalledWith(
expect.objectContaining({
command: '__write',
args: ['/test/cwd/file.txt'],
args: [testFile],
policy: {
allowedPaths: ['/test/cwd/file.txt'],
allowedPaths: [testFile],
additionalPermissions: {
fileSystem: {
write: ['/test/cwd/file.txt'],
write: [testFile],
},
},
},
@@ -147,7 +147,7 @@ describe('SandboxedFileSystemService', () => {
);
expect(spawn).toHaveBeenCalledWith(
'sandbox.exe',
['0', cwd, '__write', '/test/cwd/file.txt'],
['0', cwd, '__write', testFile],
expect.any(Object),
);
});
@@ -161,7 +161,8 @@ describe('SandboxedFileSystemService', () => {
vi.mocked(spawn).mockReturnValue(mockChild);
const readPromise = service.readTextFile('/test/cwd/file.txt');
const testFile = path.resolve('/test/cwd/file.txt');
const readPromise = service.readTextFile(testFile);
setImmediate(() => {
mockChild.stderr!.emit('data', Buffer.from('access denied'));
@@ -169,7 +170,7 @@ describe('SandboxedFileSystemService', () => {
});
await expect(readPromise).rejects.toThrow(
"Sandbox Error: read_file failed for '/test/cwd/file.txt'. Exit code 1. Details: access denied",
`Sandbox Error: read_file failed for '${testFile}'. Exit code 1. Details: access denied`,
);
});
@@ -182,7 +183,8 @@ describe('SandboxedFileSystemService', () => {
vi.mocked(spawn).mockReturnValue(mockChild);
const readPromise = service.readTextFile('/test/cwd/missing.txt');
const testFile = path.resolve('/test/cwd/missing.txt');
const readPromise = service.readTextFile(testFile);
setImmediate(() => {
mockChild.stderr!.emit('data', Buffer.from('No such file or directory'));
@@ -209,7 +211,8 @@ describe('SandboxedFileSystemService', () => {
vi.mocked(spawn).mockReturnValue(mockChild);
const readPromise = service.readTextFile('/test/cwd/missing.txt');
const testFile = path.resolve('/test/cwd/missing.txt');
const readPromise = service.readTextFile(testFile);
setImmediate(() => {
mockChild.stderr!.emit(