mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-06-16 22:36:48 -07:00
test(rig): refactor cleanDir to use Atomics.wait for reliable sync sleep and increase retries
This commit is contained in:
@@ -363,37 +363,8 @@ export class TestRig {
|
||||
|
||||
if (!this._initialized) {
|
||||
// Clean up existing directories from previous runs (e.g. retries)
|
||||
const cleanDir = (dir: string) => {
|
||||
if (fs.existsSync(dir)) {
|
||||
for (let i = 0; i < 5; i++) {
|
||||
try {
|
||||
fs.rmSync(dir, { recursive: true, force: true });
|
||||
return;
|
||||
} catch (err) {
|
||||
if (i === 4) {
|
||||
console.error(
|
||||
`Failed to clean directory ${dir} after 5 attempts:`,
|
||||
err,
|
||||
);
|
||||
throw err;
|
||||
}
|
||||
const delay = Math.pow(2, i) * 1000;
|
||||
const sleepCmd =
|
||||
process.platform === 'win32'
|
||||
? `timeout /t ${Math.max(1, Math.floor(delay / 1000))} /nobreak`
|
||||
: `sleep ${delay / 1000}`;
|
||||
try {
|
||||
execSync(sleepCmd, { stdio: 'ignore' });
|
||||
} catch {
|
||||
/* ignore */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
cleanDir(this.testDir);
|
||||
cleanDir(this.homeDir);
|
||||
this._cleanDir(this.testDir);
|
||||
this._cleanDir(this.homeDir);
|
||||
this._initialized = true;
|
||||
}
|
||||
|
||||
@@ -411,6 +382,36 @@ export class TestRig {
|
||||
this._createSettingsFile(options.settings);
|
||||
}
|
||||
|
||||
private _cleanDir(dir: string) {
|
||||
if (fs.existsSync(dir)) {
|
||||
for (let i = 0; i < 10; i++) {
|
||||
try {
|
||||
fs.rmSync(dir, { recursive: true, force: true });
|
||||
return;
|
||||
} catch (err) {
|
||||
if (i === 9) {
|
||||
console.error(
|
||||
`Failed to clean directory ${dir} after 10 attempts:`,
|
||||
err,
|
||||
);
|
||||
throw err;
|
||||
}
|
||||
const delay = Math.min(Math.pow(2, i) * 1000, 10000); // Max 10s delay
|
||||
try {
|
||||
const sharedBuffer = new Int32Array(new SharedArrayBuffer(4));
|
||||
Atomics.wait(sharedBuffer, 0, 0, delay);
|
||||
} catch {
|
||||
// Fallback for environments where SharedArrayBuffer might be restricted
|
||||
const start = Date.now();
|
||||
while (Date.now() - start < delay) {
|
||||
/* busy wait */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private _createSettingsFile(overrideSettings?: Record<string, unknown>) {
|
||||
const projectGeminiDir = join(this.testDir!, GEMINI_DIR);
|
||||
mkdirSync(projectGeminiDir, { recursive: true });
|
||||
@@ -896,21 +897,21 @@ export class TestRig {
|
||||
// Clean up test directory and home directory
|
||||
if (this.testDir && !env['KEEP_OUTPUT']) {
|
||||
try {
|
||||
fs.rmSync(this.testDir, { recursive: true, force: true });
|
||||
this._cleanDir(this.testDir);
|
||||
} catch (error) {
|
||||
// Ignore cleanup errors
|
||||
if (env['VERBOSE'] === 'true' || env['CI'] === 'true') {
|
||||
console.warn('Cleanup warning:', (error as Error).message);
|
||||
console.warn('Cleanup warning (testDir):', (error as Error).message);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.homeDir && !env['KEEP_OUTPUT']) {
|
||||
try {
|
||||
fs.rmSync(this.homeDir, { recursive: true, force: true });
|
||||
this._cleanDir(this.homeDir);
|
||||
} catch (error) {
|
||||
// Ignore cleanup errors
|
||||
if (env['VERBOSE'] === 'true' || env['CI'] === 'true') {
|
||||
console.warn('Cleanup warning:', (error as Error).message);
|
||||
console.warn('Cleanup warning (homeDir):', (error as Error).message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user