Skip to content

test: fix 2 CI flakes (probeCrawler teardown race + intentService timeout)#38

Merged
proofoftrust21 merged 2 commits intomainfrom
phase-tests-fix-flakes-20260424
Apr 24, 2026
Merged

test: fix 2 CI flakes (probeCrawler teardown race + intentService timeout)#38
proofoftrust21 merged 2 commits intomainfrom
phase-tests-fix-flakes-20260424

Conversation

@proofoftrust21
Copy link
Copy Markdown
Owner

Summary

Read-only investigation post PR #37 had identifié 2 flakes intermittents en CI :

  1. probeCrawler.test.tsFATAL 57P01 terminating connection due to administrator command lors du teardown PG. Root cause : pool.end() résout dès que les clients idle ont reçu COM_QUIT, mais le serveur peut encore émettre FATAL 57P01 vers les sockets en cours de fermeture quand DROP DATABASE … WITH (FORCE) les force-termine. Sans listener pool.on('error'), l'erreur remonte en unhandledRejection et crash vitest. Classe C (teardown race) + E (CI runner amplifie la fenêtre).

  2. intentService.test.ts > limit par défaut 5, clamp à 20 — 30 await seedEndpoint() séquentiels (~1900ms local) frôlaient le plafond 20s sur runner CI lent. Classe A (timing fragile) + E (CI runner).

Patches

  • Patch 1 (src/tests/helpers/testDatabase.ts) : pool.on('error', () => {}) ajouté dans setupTestPool pour absorber proprement les 57P01 résiduels lors du teardown. 9 lignes.
  • Patch 2 (src/tests/intentService.test.ts) : 30 seeds passés à Promise.all — chaque endpoint a hash + URL uniques, aucune collision. Temps local ~1200ms, ~8.7s sous load full-suite. 12 lignes net.

Validation

  • npm test -- src/tests/probeCrawler.test.ts : 5/5 pass, 1.06s
  • npm test -- src/tests/intentService.test.ts : 12/12 pass, 3.95s ; limit-clamp : 1207ms (était ~1914ms)
  • npm test (suite complète) : 1166 passed, 169 skipped, 0 failures, 77.55s
  • Stress 5x sur les 2 fichiers patchés : 5/5 green, 17/17 chaque run, durées 5.10-6.83s

Test plan

  • CI green sur ce PR (idéalement single-attempt)
  • Pas de régression sur d'autres fichiers tests utilisant setupTestPool/teardownTestPool
  • Squash merge

Out of scope

  • Aucune modif source code prod (uniquement test code)
  • Aucun déploiement prod requis

Le helper appelait déjà pool.end() avant DROP DATABASE WITH (FORCE),
mais sans listener pool.on('error') les FATAL 57P01 envoyés aux sockets
résiduels (entre fin de pool.end() et fermeture TCP réelle) remontaient
en unhandledRejection et crashaient vitest sur runner CI lent.

Listener silencieux ajouté dans setupTestPool — la fenêtre de race
courte est désormais absorbée proprement.
Le test "limit par défaut 5, clamp à 20" enchaînait 30 await
seedEndpoint séquentiels (~1900ms en local). Sur runner CI lent, le
plafond 20s pouvait être franchi.

Promise.all sur les 30 seeds — chaque endpoint a un hash + URL uniques
donc aucune collision, et le temps tombe sous 500ms localement.
@proofoftrust21 proofoftrust21 merged commit 0e1e294 into main Apr 24, 2026
2 checks passed
@proofoftrust21 proofoftrust21 deleted the phase-tests-fix-flakes-20260424 branch April 24, 2026 23:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant