test-curl.sh : rendre les ports des serveurs paramétrables #46
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/vps-health-api#46
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Constat non bloquant des deux revues de la PR #45 (commentaires 17831 et 17881). Analyse du 2026-10-01 : prémisse relue dans le code et confirmée.
Contexte
test-curl.shdémarre ses deux serveurs sur 3099 et 3098, en dur (PORT=3099l. 168 etPORT=3098l. 183, devantnode index.js).BASE_URLetNOINGEST_URLse surchargent (l. 31 et 33), mais pas le port d'écoute : les surcharger seuls fait pointerrequire_free,wait_foret tous lescurlailleurs que sur les serveurs démarrés. Cette surcharge n'a donc aucun usage cohérent aujourd'hui.Depuis #41,
__tests__/ci.test.jslance le script en entier 8 fois (blocdescribe("test-curl.sh"), l. 224 à 402), et cinq de ces cas posent en plus un voisin ou un fauxnodesur 3099 ou 3098. Les deux ports sont occupés à chaquenpm test, et plus seulement dans l'étape CI « Socket-level pass ».Conséquence : deux
npm testsimultanés, ou unbash test-curl.shlancé pendant unnpm test, se gênent. Mesure du relecteur (commentaire 17881), 6 tours de deux passages simultanés : jamais un cas lancé contre le serveur de l'autre (require_freetient), mais au moins un des deux échoue, et les deux dans 2 tours sur 6.Aucun autre port fixe dans la suite : les cas de
boot-from-copy.shpassent déjàBOOT_PORTavec un port defreePort(), et les autres fichiers de test n'ouvrent pas de port fixe.Décisions
BASE_URLetNOINGEST_URLdeviennent internes (http://localhost:<port>) et ne se lisent plus dans l'environnement. Effet de bord voulu : le contournementBASE_URL: undefinedderunSocketPass(vite poseBASE_URL=/dans le processus de test) n'a plus lieu d'être.TEST_CURL_PORTetTEST_CURL_NOINGEST_PORT, défauts 3099 et 3098. PasPORT: unPORThérité du shell déplacerait les serveurs en silence, et le critère « sans variable, comportement inchangé » dépendrait de l'environnement.Travail à faire
test-curl.sh: lireTEST_CURL_PORT(défaut 3099) etTEST_CURL_NOINGEST_PORT(défaut 3098), en dériverBASE_URLetNOINGEST_URLsans lecture de l'environnement, et passer ces ports aux deux lancements denode.test-curl.sh: refuser avec un message sur stderr et le code 1, avantrequire_free, une valeur non numérique et deux ports identiques (sans ce contrôle, deux ports identiques passentrequire_freepuis échouent sur un « exited before answering » qui ne nomme pas la cause).test-curl.sh: mettre à jour l'en-têteUsageavec les deux variables.ci.test.js:runSocketPasspasse deux ports libres distincts au script. Les réserver ensemble (deux sondes ouvertes en même temps, puis fermées) : deux appels successifs àfreePort()peuvent rendre le même port.ci.test.js: les cas à voisin, à occupant non HTTP et à fauxnodeécoutent ou filtrent sur le port passé au script ;released()vérifie ces mêmes ports ; les messages attendus sont construits depuis le port. RetirerBASE_URL: undefinedet réécrire le commentaire de tête du bloc.ci.test.js: nouveau cas, deuxtest-curl.shlancés en même temps sur quatre ports libres,45 passed, 0 faileddes deux côtés.ci.test.js: épingles sur le source pour les défauts 3099 et 3098 et pour l'absence de lecture deBASE_URLetNOINGEST_URLdans l'environnement. Par lecture du source et non par lancement, pour quenpm testne touche plus 3099 ni 3098. Le lancement sans variable reste couvert par l'étape CI « Socket-level pass ».ci.test.js: cas pour les deux refus (valeur non numérique, ports identiques).CLAUDE.md, section Tests : décomptes (363 cas, 33 pourci.test.js, 8 pour le bloctest-curl.sh), phrase « Ces cas occupent 3099 et 3098 pendantnpm test, et retirentBASE_URL» à retirer, paragraphebash test-curl.shà compléter avec les deux variables.Fichiers concernés
test-curl.sh: l. 31 à 33 (URLs), l. 62 et 63 (require_free), l. 168 et 183 (lancements), en-tête.__tests__/ci.test.js:freePort()l. 157, blocdescribe("test-curl.sh")l. 224 à 402.CLAUDE.md: section Tests..forgejo/workflows/ci.yml: inchangé. L'étape lancebash test-curl.shsans variable, et son commentaire (« on 3099 and 3098 ») reste exact.Surface de test
test-curl.shdeci.test.js, tous à adapter. Mutations à rejouer après adaptation (table de la revue 17881) : export retiré,require_freeretirés,exit 1retirés,trapancien.Risques et limites
freePort()ferme sa sonde avant que le script n'écoute : entre deuxnpm testsimultanés, un port libéré par l'un peut être rendu à l'autre.require_freeouwait_forrefusent alors avec un message, sans cas lancé contre un mauvais serveur. Fenêtre étroite (ports éphémères tirés par le noyau), à quantifier par la mesure en PR et à consigner comme limite si elle se montre.127.0.0.1, le serveur sur toutes les interfaces, lescurlvisentlocalhost: garder les voisins des tests sur la même forme d'écoute qu'aujourd'hui (listen(port)sans hôte).Critères d'acceptation
test-curl.shse choisissent parTEST_CURL_PORTetTEST_CURL_NOINGEST_PORT, 3099 et 3098 restant les défauts.BASE_URLetNOINGEST_URLde l'environnement n'ont plus d'effet sur le script.ci.test.jspasse des ports libres au script : plus aucun cas denpm testn'écoute sur 3099 ni 3098.npm testsimultanés passent tous les deux : mesure sur au moins 6 tours rapportée dans la PR, et cas vitest de passage double vert.bash test-curl.shsans variable garde son comportement (45 cas sur 3099 et 3098), étape CI inchangée et verte.CLAUDE.mdà jour (décomptes et paragraphes cités).Complexité estimée
Medium. Le changement du script tient en une dizaine de lignes ; l'essentiel est la reprise des 8 cas de
ci.test.jset leurs mutations.