fix(test-curl): take the two ports from the environment (#46) #47

Merged
maximus merged 3 commits from issue-46-test-curl-ports into main 2026-10-02 18:21:04 +00:00
Owner

Fixes #46

Ce qui change

  • test-curl.sh lit TEST_CURL_PORT (défaut 3099) et TEST_CURL_NOINGEST_PORT (défaut 3098) et passe ces ports à ses deux serveurs.
  • BASE_URL et NOINGEST_URL sont dérivés des ports et ne se lisent plus dans l'environnement.
  • Une valeur hors 1-65535 (non numérique, 0, 65536) et deux ports identiques sont refusés avant tout lancement, avec un message qui nomme la variable.
  • ci.test.js : chaque cas du bloc test-curl.sh reçoit des ports libres qui lui sont propres, par freePorts() (sondes ouvertes ensemble, donc ports distincts). Plus aucun cas n'écoute sur 3099 ni 3098. Le contournement BASE_URL: undefined est retiré.
  • TOKEN et INGEST_TOKEN sont 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.yml inchangé : l'étape lance le script sans variable, sur 3099 et 3098.

Cas ajoutés (33 -> 47 dans ci.test.js, 363 -> 377 au total)

  • Deux passages au même instant sur quatre ports libres, 45 cas chacun.
  • Neuf refus : valeur non numérique, port 0, port au-delà de 65535 et nombre suivi de lettres (80abc), chacun sur chacune des deux variables, puis ports identiques.
  • Deux bornes acceptées, 1 et 65535, données aux deux variables à la fois : le refus « must differ » vient après le contrôle de plage, et rien n'écoute sur un port fixe.
  • Deux épingles sur le source : les défauts 3099 et 3098 comme seules occurrences de ces nombres hors commentaires, et les deux URLs dérivées des ports.
  • Dans le cas du proxy : BASE_URL et NOINGEST_URL pointé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ête 67d40c8 (les mesures de simultanéité ci-dessous datent de 2c7886d, à 370 cas). bash test-curl.sh sans variable : 45 passed, 0 failed. sh scripts/boot-from-copy.sh : PASS.
  • Deux npm test lancé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.sh sans variable lancé 2 s après le départ d'un npm test, 3 tours : 370/370 et 45/45 à chaque tour.
  • 3099 et 3098 libres après les mesures, aucun serveur restant.

Mutations de test-curl.sh, ci.test.js relancé (40 cas)

Script restauré depuis une copie (cmp identique), 40/40 avant et après.

Mutation Rouges
export NO_PROXY/no_proxy retiré 1
les deux require_free retirés 4
exit 1 retiré après « exited before answering » 2
ports remis en dur sur les lancements (PORT=3099, PORT=3098) 5
lecture ${BASE_URL:-...} et ${NOINGEST_URL:-...} rétablie 10
les deux require_port retirés 3
contrôle des ports identiques neutralisé 1
borne 65535 retirée 1
port 0 accepté 1
défaut 3099 changé 1
wait retiré du trap 1 sur 4 passages, 0 sur le cinquième

Sur la tête 75ed6dd (43 cas) : lecture de TOKEN et INGEST_TOKEN dans l'environnement rétablie, 1 rouge ; require_port retiré pour TEST_CURL_PORT seul, 3 rouges ; pour TEST_CURL_NOINGEST_PORT seul, 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

  • Le wait du trap é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 de require_free, sans cas lancé contre un mauvais serveur. Non observé sur les 8 tours. La même fenêtre existe dans un seul npm test, face aux autres fichiers de test qui écoutent en parallèle sur des ports tirés par le noyau.
  • Les défauts 3099 et 3098 ne sont plus exercés par npm test, seulement épinglés sur le source. Leur exécution reste couverte par l'étape CI « Socket-level pass ».

🤖 Generated with Claude Code

Fixes #46 ## Ce qui change - `test-curl.sh` lit `TEST_CURL_PORT` (défaut 3099) et `TEST_CURL_NOINGEST_PORT` (défaut 3098) et passe ces ports à ses deux serveurs. - `BASE_URL` et `NOINGEST_URL` sont dérivés des ports et ne se lisent plus dans l'environnement. - Une valeur hors 1-65535 (non numérique, 0, 65536) et deux ports identiques sont refusés avant tout lancement, avec un message qui nomme la variable. - `ci.test.js` : chaque cas du bloc `test-curl.sh` reçoit des ports libres qui lui sont propres, par `freePorts()` (sondes ouvertes ensemble, donc ports distincts). Plus aucun cas n'écoute sur 3099 ni 3098. Le contournement `BASE_URL: undefined` est retiré. - `TOKEN` et `INGEST_TOKEN` sont 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.yml` inchangé : l'étape lance le script sans variable, sur 3099 et 3098. ## Cas ajoutés (33 -> 47 dans `ci.test.js`, 363 -> 377 au total) - Deux passages au même instant sur quatre ports libres, 45 cas chacun. - Neuf refus : valeur non numérique, port 0, port au-delà de 65535 et nombre suivi de lettres (`80abc`), chacun sur chacune des deux variables, puis ports identiques. - Deux bornes acceptées, 1 et 65535, données aux deux variables à la fois : le refus « must differ » vient après le contrôle de plage, et rien n'écoute sur un port fixe. - Deux épingles sur le source : les défauts 3099 et 3098 comme seules occurrences de ces nombres hors commentaires, et les deux URLs dérivées des ports. - Dans le cas du proxy : `BASE_URL` et `NOINGEST_URL` pointé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ête `67d40c8` (les mesures de simultanéité ci-dessous datent de `2c7886d`, à 370 cas). `bash test-curl.sh` sans variable : 45 passed, 0 failed. `sh scripts/boot-from-copy.sh` : PASS. - Deux `npm test` lancé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.sh` sans variable lancé 2 s après le départ d'un `npm test`, 3 tours : 370/370 et 45/45 à chaque tour. - 3099 et 3098 libres après les mesures, aucun serveur restant. ## Mutations de `test-curl.sh`, `ci.test.js` relancé (40 cas) Script restauré depuis une copie (`cmp` identique), 40/40 avant et après. | Mutation | Rouges | |---|---| | export `NO_PROXY`/`no_proxy` retiré | 1 | | les deux `require_free` retirés | 4 | | `exit 1` retiré après « exited before answering » | 2 | | ports remis en dur sur les lancements (`PORT=3099`, `PORT=3098`) | 5 | | lecture `${BASE_URL:-...}` et `${NOINGEST_URL:-...}` rétablie | 10 | | les deux `require_port` retirés | 3 | | contrôle des ports identiques neutralisé | 1 | | borne 65535 retirée | 1 | | port 0 accepté | 1 | | défaut 3099 changé | 1 | | `wait` retiré du `trap` | 1 sur 4 passages, 0 sur le cinquième | Sur la tête `75ed6dd` (43 cas) : lecture de `TOKEN` et `INGEST_TOKEN` dans l'environnement rétablie, 1 rouge ; `require_port` retiré pour `TEST_CURL_PORT` seul, 3 rouges ; pour `TEST_CURL_NOINGEST_PORT` seul, 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 - Le `wait` du `trap` é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 de `require_free`, sans cas lancé contre un mauvais serveur. Non observé sur les 8 tours. La même fenêtre existe dans un seul `npm test`, face aux autres fichiers de test qui écoutent en parallèle sur des ports tirés par le noyau. - Les défauts 3099 et 3098 ne sont plus exercés par `npm test`, seulement épinglés sur le source. Leur exécution reste couverte par l'étape CI « Socket-level pass ». 🤖 Generated with [Claude Code](https://claude.com/claude-code)
maximus added 1 commit 2026-10-02 01:41:55 +00:00
fix(test-curl): take the two ports from the environment (#46)
All checks were successful
CI / verification (pull_request) Successful in 28s
2c7886dbfe
test-curl.sh booted its servers on 3099 and 3098, hardcoded, and
ci.test.js runs it whole on every `npm test`: two runs side by side got
in each other's way, at least one of them failing every time.

- TEST_CURL_PORT and TEST_CURL_NOINGEST_PORT choose the ports, 3099 and
  3098 staying the defaults. Names of their own rather than PORT, which
  a dev shell often exports already.
- BASE_URL and NOINGEST_URL are derived from the ports and no longer
  read from the environment: overridden alone, they sent every curl away
  from the servers the script had started.
- A value outside 1-65535 and two identical ports are refused up front,
  with the variable named.
- ci.test.js gives every case free ports of its own (freePorts() keeps
  its probes open together so they are distinct), and no case listens on
  3099 or 3098 any more. New cases: two passes at once, the four
  refusals, source pins on the defaults and on the derived URLs, and a
  first-try connection check that pins the `wait` of the trap, which the
  fixed ports used to pin by accident.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Owner

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_PORT et TEST_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.sh sans variable : 45 passed, 0 failed. sh scripts/boot-from-copy.sh : PASS.
  • Deux npm test au même instant plus un bash test-curl.sh nu 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, PORT hérité sans effet.
  • Bornes : 65535 et 65534 acceptés (45/45). Refusés avec le message nommé et code 1 : 08080, 3101, -1, 1e3, 65535x, 99999999999999999999, 3101;id.

Mutations du relecteur (ci.test.js, 40 cas)

Mutation Rouges
ports remis en dur sur les deux lancements 5
lecture ${BASE_URL:-...} et ${NOINGEST_URL:-...} rétablie 10
require_port retiré pour TEST_CURL_NOINGEST_PORT seul 1
require_port retiré pour TEST_CURL_PORT seul 2
borne -gt 65535 passée à -gt 99999 1
contrôle des ports identiques remplacé par false 1
NOINGEST_PORT recalculé depuis MAIN_PORT, variable ignorée 5

Copie restaurée, cmp identique au fichier du dépôt. La mutation du wait du trap n'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_ref de la PR #47 avec ref_action: closes. L'issue se fermera au merge par l'API ou l'UI. Le message de commit ne porte que (#46) : un merge ff-only local ne la fermerait pas.

Suggestions non bloquantes

  1. test-curl.sh:61 et :64 : TOKEN et INGEST_TOKEN se lisent encore dans l'environnement, même classe que BASE_URL avant cette PR. Deux valeurs égales héritées du shell feraient échouer les cas de cloisonnement. L'échec serait bruyant, donc sans urgence.
  2. __tests__/ci.test.js, test.each des refus : la valeur non numérique et le port au-delà de 65535 ne passent que par TEST_CURL_PORT, le port 0 que par TEST_CURL_NOINGEST_PORT. Chaque appel de require_port est épinglé par au moins un cas (mutations 3 et 4), la fonction étant commune. Une matrice complète coûterait trois cas.
  3. L'épingle du wait reste probabiliste, comme la PR le dit. Elle ne peut pas rougir à tort, seulement manquer une régression une fois sur cinq.
## 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_PORT` et `TEST_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.sh` sans variable : 45 passed, 0 failed. `sh scripts/boot-from-copy.sh` : PASS. - Deux `npm test` au même instant plus un `bash test-curl.sh` nu 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, `PORT` hérité sans effet. - Bornes : 65535 et 65534 acceptés (45/45). Refusés avec le message nommé et code 1 : `08080`, ` 3101`, `-1`, `1e3`, `65535x`, `99999999999999999999`, `3101;id`. ### Mutations du relecteur (`ci.test.js`, 40 cas) | Mutation | Rouges | |---|---| | ports remis en dur sur les deux lancements | 5 | | lecture `${BASE_URL:-...}` et `${NOINGEST_URL:-...}` rétablie | 10 | | `require_port` retiré pour `TEST_CURL_NOINGEST_PORT` seul | 1 | | `require_port` retiré pour `TEST_CURL_PORT` seul | 2 | | borne `-gt 65535` passée à `-gt 99999` | 1 | | contrôle des ports identiques remplacé par `false` | 1 | | `NOINGEST_PORT` recalculé depuis `MAIN_PORT`, variable ignorée | 5 | Copie restaurée, `cmp` identique au fichier du dépôt. La mutation du `wait` du `trap` n'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_ref` de la PR #47 avec `ref_action: closes`. L'issue se fermera au merge par l'API ou l'UI. Le message de commit ne porte que `(#46)` : un merge `ff-only` local ne la fermerait pas. ### Suggestions non bloquantes 1. `test-curl.sh:61` et `:64` : `TOKEN` et `INGEST_TOKEN` se lisent encore dans l'environnement, même classe que `BASE_URL` avant cette PR. Deux valeurs égales héritées du shell feraient échouer les cas de cloisonnement. L'échec serait bruyant, donc sans urgence. 2. `__tests__/ci.test.js`, `test.each` des refus : la valeur non numérique et le port au-delà de 65535 ne passent que par `TEST_CURL_PORT`, le port 0 que par `TEST_CURL_NOINGEST_PORT`. Chaque appel de `require_port` est épinglé par au moins un cas (mutations 3 et 4), la fonction étant commune. Une matrice complète coûterait trois cas. 3. L'épingle du `wait` reste probabiliste, comme la PR le dit. Elle ne peut pas rougir à tort, seulement manquer une régression une fois sur cinq.
maximus added 1 commit 2026-10-02 18:06:04 +00:00
fix(test-curl): fix the two tokens, refuse bad ports on both variables (#46)
All checks were successful
CI / verification (pull_request) Successful in 27s
75ed6dd324
Non-blocking points of the review of PR #47.

- TOKEN and INGEST_TOKEN are no longer read from the environment, like
  the URLs: two inherited values that happened to be equal broke the
  compartmentalisation cases. Pinned in the proxy case, which now runs
  with one inherited value for both.
- The refusal cases run each bad value (not a number, 0, above 65535)
  on each of the two variables.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Owner

Suggestions 1 et 2 de la revue 18048 appliquées dans 75ed6dd. Cette tête n'a pas été relue : l'approbation portait sur 2c7886d.

  • Suggestion 1 : TOKEN et INGEST_TOKEN fixes dans test-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.
  • Suggestion 2 : chaque valeur refusée est testée sur chacune des deux variables (4 -> 7 cas de refus). require_port retiré pour une seule variable : 3 rouges dans chaque sens (1 et 2 avant).
  • Suggestion 3 (épingle probabiliste du wait) : laissée telle quelle.

npm test 373/373, bash test-curl.sh 45/45, y compris avec TOKEN=x INGEST_TOKEN=x, boot-from-copy.sh PASS.

Suggestions 1 et 2 de la revue 18048 appliquées dans `75ed6dd`. Cette tête n'a pas été relue : l'approbation portait sur `2c7886d`. - Suggestion 1 : `TOKEN` et `INGEST_TOKEN` fixes dans `test-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. - Suggestion 2 : chaque valeur refusée est testée sur chacune des deux variables (4 -> 7 cas de refus). `require_port` retiré pour une seule variable : 3 rouges dans chaque sens (1 et 2 avant). - Suggestion 3 (épingle probabiliste du `wait`) : laissée telle quelle. `npm test` 373/373, `bash test-curl.sh` 45/45, y compris avec `TOKEN=x INGEST_TOKEN=x`, `boot-from-copy.sh` PASS.
Author
Owner

Revue adversariale — APPROVE

Résumé. La PR fait ce que #46 demande : ports lus dans TEST_CURL_PORT et TEST_CURL_NOINGEST_PORT, URLs et tokens internes au script, et plus aucun cas de npm test sur 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.sh sans variable : 45 passed, 0 failed. 3099 et 3098 libres ensuite.
  • CI de la tête : CI / verification (pull_request) en success.
  • Timeline de #46 : pull_ref de la PR #47 avec ref_action: closes. L'issue se fermera au merge.
  • Mutations de test-curl.sh, ci.test.js relancé (43 cas), script restauré (cmp identique, 43/43 après) :
Mutation Rouges
borne -gt 65536 (65536 accepté) 2
regex ^[0-9]{1,5}$ (port 0 accepté) 2
second require_free retiré seul 1
require_port TEST_CURL_NOINGEST_PORT appelé sur $MAIN_PORT 3
borne -ge 65535 (65535 refusé) 0
ancre $ retirée de la regex (80abc accepté) 0

Suggestions (non bloquantes)

  1. 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 65535 reste vert. Un port 65535 se voit mal attribuer par freePorts() ; une épingle sur le source de la condition suffirait.
  2. test-curl.sh:45, ancre de fin non épinglée. Sans le $, 80abc passe 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 que require_port devait éviter. Un cas ["a number followed by letters", "80abc"] dans badValues ferme le trou (deux cas de plus).
  3. freePorts() et les autres fichiers de test. La limite consignée parle de deux npm test simultanés. La même fenêtre existe dans un seul npm 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 de CLAUDE.md si un rouge isolé apparaît.

Checklist

  • Sécurité : les deux tokens du script sont des valeurs de test fixes, déjà présentes avant la PR. Les ports sont validés avant tout usage, puis cités dans des URLs et des variables d'environnement entre guillemets.
  • Critères de #46 : les six sont tenus. La mesure de simultanéité (8 tours) date de 2c7886d, ce que la PR dit ; le cas vitest de passage double tourne sur la tête.
  • Tests : pas de skip ni de only. Le cas de régression demandé (passage double) est présent.
  • Commits : deux, au format conventionnel, avec (#46).
  • CLAUDE.md : décomptes 373, 43 et 18 conformes à ce qui tourne.
## Revue adversariale — APPROVE **Résumé.** La PR fait ce que #46 demande : ports lus dans `TEST_CURL_PORT` et `TEST_CURL_NOINGEST_PORT`, URLs et tokens internes au script, et plus aucun cas de `npm test` sur 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.sh` sans variable : 45 passed, 0 failed. 3099 et 3098 libres ensuite. - CI de la tête : `CI / verification (pull_request)` en `success`. - Timeline de #46 : `pull_ref` de la PR #47 avec `ref_action: closes`. L'issue se fermera au merge. - Mutations de `test-curl.sh`, `ci.test.js` relancé (43 cas), script restauré (`cmp` identique, 43/43 après) : | Mutation | Rouges | |---|---| | borne `-gt 65536` (65536 accepté) | 2 | | regex `^[0-9]{1,5}$` (port 0 accepté) | 2 | | second `require_free` retiré seul | 1 | | `require_port TEST_CURL_NOINGEST_PORT` appelé sur `$MAIN_PORT` | 3 | | borne `-ge 65535` (65535 refusé) | **0** | | ancre `$` retirée de la regex (`80abc` accepté) | **0** | ### Suggestions (non bloquantes) 1. **`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 65535` reste vert. Un port 65535 se voit mal attribuer par `freePorts()` ; une épingle sur le source de la condition suffirait. 2. **`test-curl.sh:45`, ancre de fin non épinglée.** Sans le `$`, `80abc` passe 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 que `require_port` devait éviter. Un cas `["a number followed by letters", "80abc"]` dans `badValues` ferme le trou (deux cas de plus). 3. **`freePorts()` et les autres fichiers de test.** La limite consignée parle de deux `npm test` simultanés. La même fenêtre existe dans un seul `npm 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 de `CLAUDE.md` si un rouge isolé apparaît. ### Checklist - Sécurité : les deux tokens du script sont des valeurs de test fixes, déjà présentes avant la PR. Les ports sont validés avant tout usage, puis cités dans des URLs et des variables d'environnement entre guillemets. - Critères de #46 : les six sont tenus. La mesure de simultanéité (8 tours) date de `2c7886d`, ce que la PR dit ; le cas vitest de passage double tourne sur la tête. - Tests : pas de `skip` ni de `only`. Le cas de régression demandé (passage double) est présent. - Commits : deux, au format conventionnel, avec `(#46)`. - `CLAUDE.md` : décomptes 373, 43 et 18 conformes à ce qui tourne.
Author
Owner

Suggestions 1 et 2 de la revue 18086 appliquées dans 67d40c8, tests seulement, test-curl.sh inchangé. Cette tête n'a pas été relue : l'approbation portait sur 75ed6dd.

  • Suggestion 1 : les bornes 1 et 65535 doivent être acceptées. Mutation -ge 65535 : 47/47 avant, 1 rouge, 47/47 après. Mutation ^[2-9] : 1 rouge.
  • Suggestion 2 : 80abc refusé sur chacune des deux variables. Mutation « ancre $ retirée » : 2 rouges.
  • Suggestion 3 : la fenêtre de freePorts() dans un seul npm test est ajoutée aux limites du corps de la PR.

npm test 377/377, bash test-curl.sh 45/45, boot-from-copy.sh PASS.

Suggestions 1 et 2 de la revue 18086 appliquées dans `67d40c8`, tests seulement, `test-curl.sh` inchangé. Cette tête n'a pas été relue : l'approbation portait sur `75ed6dd`. - Suggestion 1 : les bornes 1 et 65535 doivent être acceptées. Mutation `-ge 65535` : 47/47 avant, 1 rouge, 47/47 après. Mutation `^[2-9]` : 1 rouge. - Suggestion 2 : `80abc` refusé sur chacune des deux variables. Mutation « ancre `$` retirée » : 2 rouges. - Suggestion 3 : la fenêtre de `freePorts()` dans un seul `npm test` est ajoutée aux limites du corps de la PR. `npm test` 377/377, `bash test-curl.sh` 45/45, `boot-from-copy.sh` PASS.
maximus added 1 commit 2026-10-02 18:15:06 +00:00
test(ci): pin the two ends of the port range and the end anchor (#46)
All checks were successful
CI / verification (pull_request) Successful in 27s
CI / verification (push) Successful in 28s
67d40c83c3
Non-blocking points of the second review of PR #47: refusing 65535, and
dropping the end anchor of the pattern, both left the suite green.

- Ports 1 and 65535 must be accepted. Given to both variables at once,
  so the run stops on the "must differ" refusal, which comes after the
  range check, and nothing listens on a port fixed in advance.
- "80abc" must be refused, on each variable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Owner

Revue adversariale : APPROVE

Résumé. La PR fait ce qu'elle annonce : test-curl.sh prend ses deux ports de TEST_CURL_PORT et TEST_CURL_NOINGEST_PORT, dérive ses URLs, fige ses tokens, et plus aucun cas de ci.test.js n'é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.sh sans 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.
  • Statut de commit de la tête : CI / verification (pull_request) en success.
  • Timeline de #46 : pull_ref de la PR 47 avec ref_action: closes. L'issue se fermera au merge.

Mutations du relecteur (ci.test.js, 47 cas)

Mutation de test-curl.sh Rouges
borne -gt 65536 (65536 accepté) 2
require_free "$NOINGEST_URL" retiré seul 1
require_port TEST_CURL_PORT appliqué à $NOINGEST_PORT (port principal non contrôlé) 8
contrôle des ports identiques neutralisé (if false) 3
zéros de tête acceptés (^0*[1-9][0-9]{0,4}$) 0

Script restauré après chaque mutation, cmp identique à 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é dans runSocketPass).

Les décomptes de CLAUDE.md concordent : 22 cas dans le bloc test-curl.sh, 47 dans ci.test.js, 377 au total.

Suggestions (non bloquantes)

  1. Le refus des zéros de tête n'est pas épinglé (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, donc TEST_CURL_PORT=3099 et TEST_CURL_NOINGEST_PORT=03099 le franchiraient si la regex laissait passer 03099. Un cas ["a leading zero", "080"] dans badValues suffit.
  2. Le wait du trap reste é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 dans CLAUDE.md, ce qui est honnête. Elle mérite une issue de suivi si un épinglage déterministe est voulu.
  3. Les défauts 3099 et 3098 ne sont exécutés que par l'étape CI « Socket-level pass ». Limite annoncée, et l'épingle sur le source couvre le reste.

Checklist

  • Sécurité : aucun secret (tokens de test fixes, déjà présents), aucune entrée d'environnement interpolée sans contrôle.
  • Tests : régression présente (deux passages simultanés), aucun skip ni only.
  • Commits au format conventionnel, tous rattachés à #46.
## Revue adversariale : APPROVE **Résumé.** La PR fait ce qu'elle annonce : `test-curl.sh` prend ses deux ports de `TEST_CURL_PORT` et `TEST_CURL_NOINGEST_PORT`, dérive ses URLs, fige ses tokens, et plus aucun cas de `ci.test.js` n'é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.sh` sans 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. - Statut de commit de la tête : `CI / verification (pull_request)` en `success`. - Timeline de #46 : `pull_ref` de la PR 47 avec `ref_action: closes`. L'issue se fermera au merge. ### Mutations du relecteur (`ci.test.js`, 47 cas) | Mutation de `test-curl.sh` | Rouges | |---|---| | borne `-gt 65536` (65536 accepté) | 2 | | `require_free "$NOINGEST_URL"` retiré seul | 1 | | `require_port TEST_CURL_PORT` appliqué à `$NOINGEST_PORT` (port principal non contrôlé) | 8 | | contrôle des ports identiques neutralisé (`if false`) | 3 | | zéros de tête acceptés (`^0*[1-9][0-9]{0,4}$`) | **0** | Script restauré après chaque mutation, `cmp` identique à 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é dans `runSocketPass`). Les décomptes de `CLAUDE.md` concordent : 22 cas dans le bloc `test-curl.sh`, 47 dans `ci.test.js`, 377 au total. ### Suggestions (non bloquantes) 1. **Le refus des zéros de tête n'est pas épinglé** (`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, donc `TEST_CURL_PORT=3099` et `TEST_CURL_NOINGEST_PORT=03099` le franchiraient si la regex laissait passer `03099`. Un cas `["a leading zero", "080"]` dans `badValues` suffit. 2. **Le `wait` du `trap` reste é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 dans `CLAUDE.md`, ce qui est honnête. Elle mérite une issue de suivi si un épinglage déterministe est voulu. 3. Les défauts 3099 et 3098 ne sont exécutés que par l'étape CI « Socket-level pass ». Limite annoncée, et l'épingle sur le source couvre le reste. ### Checklist - Sécurité : aucun secret (tokens de test fixes, déjà présents), aucune entrée d'environnement interpolée sans contrôle. - Tests : régression présente (deux passages simultanés), aucun `skip` ni `only`. - Commits au format conventionnel, tous rattachés à #46.
maximus merged commit 67d40c83c3 into main 2026-10-02 18:21:04 +00:00
maximus deleted branch issue-46-test-curl-ports 2026-10-02 18:21:04 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: maximus/vps-health-api#47
No description provided.