test(e2e): un échec ne peut plus emporter les suivants, et les bornes sont mesurées
Trois choses, dont une qui explique pourquoi aucun diagnostic n'aboutissait. SIGN_IN_MS valait 180 s alors que la somme de ses propres étapes en faisait 270. La borne englobante se déclenchait donc TOUJOURS avant celle de l'étape en cause, et ne pouvait dire qu'une chose : « bob-… to sign in ». Le message était structurellement condamné à ne rien apprendre — on a cherché des jours une cause que le harnais s'interdisait de nommer. Les bornes englobantes sont maintenant des sommes calculées de leurs étapes. Les parcours sont isolés. La suite déclare ses 7 parcours et leurs 27 vérifications AVANT tout lancement de navigateur, et rend donc toujours 34 lignes — y compris quand le montage meurt, où les parcours non exécutés sont rapportés comme tels. Auparavant le total valait 24, 26 ou 27 selon ce qui mourait : deux exécutions ne mesuraient même pas la même chose. Un échec est contenu, pas absorbé — il reste compté. Et chaque borne est dimensionnée sur une durée MESURÉE, inscrite à côté d'elle dans le code. Le premier rendu d'un acteur prend 4,9 à 7,4 s et vaut 45 s ; la traversée du broker 1,3 à 2,8 s et vaut 75 s. Un nombre nu n'apprend rien et pourrit en silence. Au passage : un walletPage.close() n'avait aucune borne du tout.
This commit is contained in:
@@ -166,8 +166,12 @@ export async function closeQuietly(what: string, close: () => Promise<unknown>):
|
||||
* cost the hours this module exists to stop spending.
|
||||
*
|
||||
* `unref`ed, so a healthy run is never held open by its own watchdog.
|
||||
*
|
||||
* `thenReport` lets a suite print its own summary before the process goes — without it a run
|
||||
* that trips this watchdog reports its waits and then vanishes, so its check count is zero
|
||||
* and comparable with nothing. (`notebook.ts` passes its `finish`.)
|
||||
*/
|
||||
export function armSuiteDeadline(suite: string, ms: number): void {
|
||||
export function armSuiteDeadline(suite: string, ms: number, thenReport?: () => void): void {
|
||||
const startedAt = Date.now();
|
||||
const timer = setTimeout(() => {
|
||||
console.error(
|
||||
@@ -188,6 +192,11 @@ export function armSuiteDeadline(suite: string, ms: number): void {
|
||||
}
|
||||
}
|
||||
console.error(` Total elapsed: ${fmtMs(Date.now() - startedAt)}`);
|
||||
// A suite that can still say what it did and did not verify must be allowed to say it —
|
||||
// otherwise the watchdog, whose whole purpose is to replace a silent kill with a report,
|
||||
// produces its own silent kill. `thenReport` is expected to exit; the line below is the
|
||||
// fallback for a caller that has nothing to report.
|
||||
if (thenReport !== undefined) thenReport();
|
||||
process.exit(1);
|
||||
}, ms);
|
||||
timer.unref?.();
|
||||
|
||||
Reference in New Issue
Block a user