test: fixup flaky visibility test (#43064)
This commit is contained in:
parent
d09a2e513c
commit
1a6e651844
2 changed files with 39 additions and 32 deletions
|
@ -9,6 +9,7 @@ import * as url from 'node:url';
|
|||
import { SuiteFunction, TestFunction } from 'mocha';
|
||||
import { BrowserWindow } from 'electron/main';
|
||||
import { AssertionError } from 'chai';
|
||||
import { setTimeout } from 'node:timers/promises';
|
||||
|
||||
const addOnly = <T>(fn: Function): T => {
|
||||
const wrapped = (...args: any[]) => {
|
||||
|
@ -92,49 +93,50 @@ export async function startRemoteControlApp (extraArgs: string[] = [], options?:
|
|||
}
|
||||
|
||||
export function waitUntil (
|
||||
callback: () => boolean,
|
||||
callback: () => boolean|Promise<boolean>,
|
||||
opts: { rate?: number, timeout?: number } = {}
|
||||
) {
|
||||
const { rate = 10, timeout = 10000 } = opts;
|
||||
return new Promise<void>((resolve, reject) => {
|
||||
let intervalId: NodeJS.Timeout | undefined; // eslint-disable-line prefer-const
|
||||
let timeoutId: NodeJS.Timeout | undefined;
|
||||
return (async () => {
|
||||
const ac = new AbortController();
|
||||
const signal = ac.signal;
|
||||
let checkCompleted = false;
|
||||
let timedOut = false;
|
||||
|
||||
const cleanup = () => {
|
||||
if (intervalId) clearInterval(intervalId);
|
||||
if (timeoutId) clearTimeout(timeoutId);
|
||||
};
|
||||
|
||||
const check = () => {
|
||||
const check = async () => {
|
||||
let result;
|
||||
|
||||
try {
|
||||
result = callback();
|
||||
result = await callback();
|
||||
} catch (e) {
|
||||
cleanup();
|
||||
reject(e);
|
||||
return;
|
||||
ac.abort();
|
||||
throw e;
|
||||
}
|
||||
|
||||
if (result === true) {
|
||||
cleanup();
|
||||
resolve();
|
||||
return true;
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
if (check()) {
|
||||
return;
|
||||
setTimeout(timeout, { signal })
|
||||
.then(() => {
|
||||
timedOut = true;
|
||||
checkCompleted = true;
|
||||
});
|
||||
|
||||
while (checkCompleted === false) {
|
||||
const checkSatisfied = await check();
|
||||
if (checkSatisfied === true) {
|
||||
ac.abort();
|
||||
checkCompleted = true;
|
||||
return;
|
||||
} else {
|
||||
await setTimeout(rate);
|
||||
}
|
||||
}
|
||||
|
||||
intervalId = setInterval(check, rate);
|
||||
|
||||
timeoutId = setTimeout(() => {
|
||||
timeoutId = undefined;
|
||||
cleanup();
|
||||
reject(new Error(`waitUntil timed out after ${timeout}ms`));
|
||||
}, timeout);
|
||||
});
|
||||
if (timedOut) {
|
||||
throw new Error(`waitUntil timed out after ${timeout}ms`);
|
||||
}
|
||||
})();
|
||||
}
|
||||
|
||||
export async function repeatedly<T> (
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue