fix(test-curl): take the two ports from the environment (#46) #47
No reviewers
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#47
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-46-test-curl-ports"
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?
Fixes #46
Ce qui change
test-curl.shlitTEST_CURL_PORT(défaut 3099) etTEST_CURL_NOINGEST_PORT(défaut 3098) et passe ces ports à ses deux serveurs.BASE_URLetNOINGEST_URLsont dérivés des ports et ne se lisent plus dans l'environnement.ci.test.js: chaque cas du bloctest-curl.shreçoit des ports libres qui lui sont propres, parfreePorts()(sondes ouvertes ensemble, donc ports distincts). Plus aucun cas n'écoute sur 3099 ni 3098. Le contournementBASE_URL: undefinedest retiré.TOKENetINGEST_TOKENsont fixes, plus lus dans l'environnement (suggestion 1 de la revue 18048). Le cas du proxy tourne avec une même valeur héritée pour les deux.CLAUDE.md: décomptes et paragraphes de la section Tests..forgejo/workflows/ci.ymlinchangé : l'étape lance le script sans variable, sur 3099 et 3098.Cas ajoutés (33 -> 47 dans
ci.test.js, 363 -> 377 au total)80abc), chacun sur chacune des deux variables, puis ports identiques.BASE_URLetNOINGEST_URLpointés sur un port mort, et une tentative de connexion unique sur les deux ports à la sortie du script.Vérifié
npm test: 377/377 sur la tête67d40c8(les mesures de simultanéité ci-dessous datent de2c7886d, à 370 cas).bash test-curl.shsans variable : 45 passed, 0 failed.sh scripts/boot-from-copy.sh: PASS.npm testlancés au même instant, code de sortie relevé par processus, 8 tours : 370/370 des deux côtés à chaque tour, 13 s par tour.bash test-curl.shsans variable lancé 2 s après le départ d'unnpm test, 3 tours : 370/370 et 45/45 à chaque tour.Mutations de
test-curl.sh,ci.test.jsrelancé (40 cas)Script restauré depuis une copie (
cmpidentique), 40/40 avant et après.NO_PROXY/no_proxyretirérequire_freeretirésexit 1retiré après « exited before answering »PORT=3099,PORT=3098)${BASE_URL:-...}et${NOINGEST_URL:-...}rétablierequire_portretiréswaitretiré dutrapSur la tête
75ed6dd(43 cas) : lecture deTOKENetINGEST_TOKENdans l'environnement rétablie, 1 rouge ;require_portretiré pourTEST_CURL_PORTseul, 3 rouges ; pourTEST_CURL_NOINGEST_PORTseul, 3 rouges.Sur la tête
67d40c8(47 cas), mutations vertes de la revue 18086 : borne-ge 65535, 1 rouge ; ancre$retirée de la regex, 2 rouges. En plus : regex^[2-9](port 1 refusé), 1 rouge.Limites
waitdutrapétait épinglé par accident : sur les ports fixes, le cas suivant échouait à écouter sur un port pas encore rendu. Avec des ports propres à chaque cas, cette épingle disparaissait (mutation verte à la première mesure). Elle est remplacée par une tentative de connexion unique à la sortie du script, qui rougit le plus souvent mais pas à chaque fois (4 passages sur 5).freePorts()ferme ses sondes avant que le script n'écoute. Un port repris dans l'intervalle fait échouer le cas avec le message derequire_free, sans cas lancé contre un mauvais serveur. Non observé sur les 8 tours. La même fenêtre existe dans un seulnpm test, face aux autres fichiers de test qui écoutent en parallèle sur des ports tirés par le noyau.npm test, seulement épinglés sur le source. Leur exécution reste couverte par l'étape CI « Socket-level pass ».🤖 Generated with Claude Code
Revue adversariale : APPROVE
Tête relue :
2c7886d. CI de la tête verte (CI / verification (pull_request), 28 s). Suite et mutations rejouées par le relecteur sur une copie hors dépôt.Résumé
Le script prend ses deux ports dans
TEST_CURL_PORTetTEST_CURL_NOINGEST_PORT, dérive ses URLs et refuse les valeurs invalides avant tout lancement. Les critères d'acceptation de #46 sont tenus, et chaque garde ajoutée rougit quand on la retire.Vérifié par exécution
npm test: 370/370.bash test-curl.shsans variable : 45 passed, 0 failed.sh scripts/boot-from-copy.sh: PASS.npm testau même instant plus unbash test-curl.shnu lancé 2 s après, 4 tours : 370/370 des deux côtés et 45/45 à chaque tour. 3099 et 3098 libres à la fin.BASE_URL=http://127.0.0.1:1 NOINGEST_URL=/ PORT=4000 TEST_CURL_PORT="": 45/45 sur les défauts. Variable vide lue comme absente,PORThérité sans effet.08080,3101,-1,1e3,65535x,99999999999999999999,3101;id.Mutations du relecteur (
ci.test.js, 40 cas)${BASE_URL:-...}et${NOINGEST_URL:-...}rétablierequire_portretiré pourTEST_CURL_NOINGEST_PORTseulrequire_portretiré pourTEST_CURL_PORTseul-gt 65535passée à-gt 99999falseNOINGEST_PORTrecalculé depuisMAIN_PORT, variable ignoréeCopie restaurée,
cmpidentique au fichier du dépôt. La mutation duwaitdutrapn'a pas été rejouée : la PR la donne elle-même comme épinglée 4 fois sur 5.Fermeture d'issue
Timeline de #46 :
pull_refde la PR #47 avecref_action: closes. L'issue se fermera au merge par l'API ou l'UI. Le message de commit ne porte que(#46): un mergeff-onlylocal ne la fermerait pas.Suggestions non bloquantes
test-curl.sh:61et:64:TOKENetINGEST_TOKENse lisent encore dans l'environnement, même classe queBASE_URLavant cette PR. Deux valeurs égales héritées du shell feraient échouer les cas de cloisonnement. L'échec serait bruyant, donc sans urgence.__tests__/ci.test.js,test.eachdes refus : la valeur non numérique et le port au-delà de 65535 ne passent que parTEST_CURL_PORT, le port 0 que parTEST_CURL_NOINGEST_PORT. Chaque appel derequire_portest épinglé par au moins un cas (mutations 3 et 4), la fonction étant commune. Une matrice complète coûterait trois cas.waitreste probabiliste, comme la PR le dit. Elle ne peut pas rougir à tort, seulement manquer une régression une fois sur cinq.Suggestions 1 et 2 de la revue 18048 appliquées dans
75ed6dd. Cette tête n'a pas été relue : l'approbation portait sur2c7886d.TOKENetINGEST_TOKENfixes danstest-curl.sh. Le cas du proxy passe une même valeur héritée pour les deux. Mutation « lecture dans l'environnement rétablie » : 43/43 avant, 1 rouge, 43/43 après.require_portretiré pour une seule variable : 3 rouges dans chaque sens (1 et 2 avant).wait) : laissée telle quelle.npm test373/373,bash test-curl.sh45/45, y compris avecTOKEN=x INGEST_TOKEN=x,boot-from-copy.shPASS.Revue adversariale — APPROVE
Résumé. La PR fait ce que #46 demande : ports lus dans
TEST_CURL_PORTetTEST_CURL_NOINGEST_PORT, URLs et tokens internes au script, et plus aucun cas denpm testsur 3099 ni 3098. Aucun constat bloquant ; trois suggestions.Rejoué par le relecteur (copie hors dépôt, tête
75ed6dd)npm test: 373/373.bash test-curl.shsans variable : 45 passed, 0 failed. 3099 et 3098 libres ensuite.CI / verification (pull_request)ensuccess.pull_refde la PR #47 avecref_action: closes. L'issue se fermera au merge.test-curl.sh,ci.test.jsrelancé (43 cas), script restauré (cmpidentique, 43/43 après) :-gt 65536(65536 accepté)^[0-9]{1,5}$(port 0 accepté)require_freeretiré seulrequire_port TEST_CURL_NOINGEST_PORTappelé sur$MAIN_PORT-ge 65535(65535 refusé)$retirée de la regex (80abcaccepté)Suggestions (non bloquantes)
test-curl.sh:45, borne haute épinglée d'un seul côté. 65536 est refusé par un cas, mais rien n'exige que 65535 soit accepté :-ge 65535reste vert. Un port 65535 se voit mal attribuer parfreePorts(); une épingle sur le source de la condition suffirait.test-curl.sh:45, ancre de fin non épinglée. Sans le$,80abcpasse la regex, puis[ 80abc -gt 65535 ]sort en erreur (code 2), ce que le||lit comme faux : la valeur est acceptée et le script finit sur « exited before answering », le message querequire_portdevait éviter. Un cas["a number followed by letters", "80abc"]dansbadValuesferme le trou (deux cas de plus).freePorts()et les autres fichiers de test. La limite consignée parle de deuxnpm testsimultanés. La même fenêtre existe dans un seulnpm test: les sept autres fichiers tournent en parallèle et écoutent sur des ports tirés par le noyau, et le bloc passe de 1 à 18 cas qui ferment leurs sondes avant le lancement. Non observé sur mon passage ni sur les 8 tours de la PR, et l'échec serait bruyant (require_free). À ajouter au paragraphe deCLAUDE.mdsi un rouge isolé apparaît.Checklist
2c7886d, ce que la PR dit ; le cas vitest de passage double tourne sur la tête.skipni deonly. Le cas de régression demandé (passage double) est présent.(#46).CLAUDE.md: décomptes 373, 43 et 18 conformes à ce qui tourne.Suggestions 1 et 2 de la revue 18086 appliquées dans
67d40c8, tests seulement,test-curl.shinchangé. Cette tête n'a pas été relue : l'approbation portait sur75ed6dd.-ge 65535: 47/47 avant, 1 rouge, 47/47 après. Mutation^[2-9]: 1 rouge.80abcrefusé sur chacune des deux variables. Mutation « ancre$retirée » : 2 rouges.freePorts()dans un seulnpm testest ajoutée aux limites du corps de la PR.npm test377/377,bash test-curl.sh45/45,boot-from-copy.shPASS.Revue adversariale : APPROVE
Résumé. La PR fait ce qu'elle annonce :
test-curl.shprend ses deux ports deTEST_CURL_PORTetTEST_CURL_NOINGEST_PORT, dérive ses URLs, fige ses tokens, et plus aucun cas deci.test.jsn'écoute sur 3099 ni 3098. Aucun point bloquant.Ce qui a été rejoué
Sur une copie hors dépôt de la tête
67d40c8(arbre du dépôt intact, 3099 et 3098 libres avant et après) :npm test: 377/377.bash test-curl.shsans variable : 45 passed, 0 failed.sh scripts/boot-from-copy.sh: PASS.PORT=1234 BASE_URL=/ TOKEN=x INGEST_TOKEN=x bash test-curl.sh: 45 passed, 0 failed. L'environnement hérité n'a plus prise.CI / verification (pull_request)ensuccess.pull_refde la PR 47 avecref_action: closes. L'issue se fermera au merge.Mutations du relecteur (
ci.test.js, 47 cas)test-curl.sh-gt 65536(65536 accepté)require_free "$NOINGEST_URL"retiré seulrequire_port TEST_CURL_PORTappliqué à$NOINGEST_PORT(port principal non contrôlé)if false)^0*[1-9][0-9]{0,4}$)Script restauré après chaque mutation,
cmpidentique à celui du dépôt.Vérifications à la main
Refusés avec le message attendu et code 1 :
' 80',080,+80,-1,99999,0x50. Variable vide : défaut repris (comportement de:-, documenté dansrunSocketPass).Les décomptes de
CLAUDE.mdconcordent : 22 cas dans le bloctest-curl.sh, 47 dansci.test.js, 377 au total.Suggestions (non bloquantes)
test-curl.sh:45). La mutation qui les accepte laisse les 47 cas verts. Ce refus porte pourtant une propriété : le contrôle « must differ » est une comparaison de chaînes, doncTEST_CURL_PORT=3099etTEST_CURL_NOINGEST_PORT=03099le franchiraient si la regex laissait passer03099. Un cas["a leading zero", "080"]dansbadValuessuffit.waitdutrapreste épinglé de façon probabiliste (4 passages sur 5 d'après le corps de la PR, non remesuré ici). La limite est écrite dans la PR et dansCLAUDE.md, ce qui est honnête. Elle mérite une issue de suivi si un épinglage déterministe est voulu.Checklist
skipnionly.