fix: surface cleanup directory read errors

This commit is contained in:
Tam Nhu Tran committed 2026-05-30 15:40:31 -04:00
1 parent 920fba7e13
commit f93cb36da6
2 files changed
+186 -48

No files matched your search

@@ -81,4 +81,94 @@ describe('cleanup command', () => {
fs.rmSync(victimDir, { recursive: true, force: true });
}
});
it('warns instead of reporting no logs when a cleanup directory cannot be read', async () => {
const archiveDir = getLogArchiveDir();
fs.mkdirSync(archiveDir, { recursive: true });
const originalReaddirSync = fs.readdirSync;
const readdirSpy = spyOn(fs, 'readdirSync').mockImplementation((dirPath, options) => {
if (String(dirPath) === archiveDir) {
throw Object.assign(new Error('permission denied'), { code: 'EACCES' });
}
return originalReaddirSync(dirPath, options as never);
});
const logSpy = spyOn(console, 'log').mockImplementation(() => {});
try {
await handleCleanupCommand(['--dry-run']);
const output = logSpy.mock.calls
.flatMap((call) => call.map((value) => String(value)))
.join('\n');
expect(output).toContain('Could not read CCS Log Archives');
expect(output).toContain('permission denied');
expect(output).not.toContain('No CCS or CLIProxy logs found.');
} finally {
readdirSpy.mockRestore();
logSpy.mockRestore();
}
});
it('warns instead of reporting no error logs when CLIProxy logs cannot be read', async () => {
const cliproxyLogsDir = path.join(getCliproxyDir(), 'logs');
fs.mkdirSync(cliproxyLogsDir, { recursive: true });
const originalReaddirSync = fs.readdirSync;
const readdirSpy = spyOn(fs, 'readdirSync').mockImplementation((dirPath, options) => {
if (String(dirPath) === cliproxyLogsDir) {
throw Object.assign(new Error('disk I/O failed'), { code: 'EIO' });
}
return originalReaddirSync(dirPath, options as never);
});
const logSpy = spyOn(console, 'log').mockImplementation(() => {});
try {
await handleCleanupCommand(['--errors']);
const output = logSpy.mock.calls
.flatMap((call) => call.map((value) => String(value)))
.join('\n');
expect(output).toContain('Could not read CLIProxy logs');
expect(output).toContain('disk I/O failed');
expect(output).not.toContain('No error logs found.');
} finally {
readdirSpy.mockRestore();
logSpy.mockRestore();
}
});
it('warns instead of treating CLIProxy log inspection errors as missing directories', async () => {
const cliproxyLogsDir = path.join(getCliproxyDir(), 'logs');
fs.mkdirSync(cliproxyLogsDir, { recursive: true });
const originalLstatSync = fs.lstatSync;
const lstatSpy = spyOn(fs, 'lstatSync').mockImplementation((targetPath, options) => {
if (String(targetPath) === cliproxyLogsDir) {
throw Object.assign(new Error('stat failed'), { code: 'EIO' });
}
return originalLstatSync(targetPath, options as never);
});
const logSpy = spyOn(console, 'log').mockImplementation(() => {});
try {
await handleCleanupCommand(['--errors']);
const output = logSpy.mock.calls
.flatMap((call) => call.map((value) => String(value)))
.join('\n');
expect(output).toContain('Could not inspect CLIProxy logs');
expect(output).toContain('stat failed');
expect(output).not.toContain('No CLIProxy logs directory found.');
} finally {
lstatSpy.mockRestore();
logSpy.mockRestore();
}
});
});