From da739427b7e2f0689fcb5a77ffd3ee32fe6fedd7 Mon Sep 17 00:00:00 2001 From: jsboige Date: Sun, 27 Sep 2026 12:30:23 +0200 Subject: [PATCH] fix(test,#18027): le test du plafond d'admission attend la decision du 3e demandeur, pas 4 s Sous Windows natif, une admission lean_exec coute ~6,2 s (tasklist ~3,6 s), plus que les 4 s de SLEEP_CMD : les deux premiers runs etaient morts quand le 3e comptait les runs vivants, qui etait donc admis ([0, 0, 0]). Les deux premiers attendent desormais un fichier de liberation pose apres la decision du 3e. Assertions inchangees ; temoin negatif verifie (cap desactive -> FAIL). Co-Authored-By: Claude Opus 5 (1M context) --- scripts/lean/tests/test_lean_exec.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/scripts/lean/tests/test_lean_exec.py b/scripts/lean/tests/test_lean_exec.py index b48cedbaff..48f014e3d7 100644 --- a/scripts/lean/tests/test_lean_exec.py +++ b/scripts/lean/tests/test_lean_exec.py @@ -156,9 +156,25 @@ def test_admission_cap_machine_wide_two_worktrees(): for w in (w1, w2, w3): w.mkdir() cap = dict(LEAN_EXEC_CAP=2, LEAN_EXEC_BUDGET=1) + # Les deux premiers runs tiennent leur part du cap jusqu'a ce que le + # 3e demandeur ait rendu sa decision, pas pendant une duree fixe + # (#18027) : sous Windows natif, une admission coute ~6 s (tasklist + # seul ~3,6 s, mesure sur myia-ai-01), plus que les 4 s de SLEEP_CMD. + # Les deux premiers etaient donc morts quand le 3e comptait les runs + # vivants (live_registered_budgets), et il etait admis : [0, 0, 0]. + release = Path(td) / "release" + hold = Path(td) / "hold.py" + hold.write_text( + "import os, sys, time\n" + "deadline = time.monotonic() + 90\n" + "while not os.path.exists(sys.argv[1]) and time.monotonic() < deadline:\n" + " time.sleep(0.05)\n", + encoding="utf-8", + ) + hold_cmd = [PY, str(hold), str(release)] procs = [ subprocess.Popen( - [PY, LEAN_EXEC, "run", "--json", "--", *SLEEP_CMD], + [PY, LEAN_EXEC, "run", "--json", "--", *hold_cmd], env=_env(state, **cap), cwd=str(w), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, ) @@ -181,8 +197,11 @@ def _registered() -> int: "les deux premiers runs devaient s'enregistrer sous 30 s, " f"vu {_registered()}") - third = _run(state, ["run", "--json", "--", *SLEEP_CMD], + # Commande immediate pour le 3e : admis a tort, il rend 0 tout de + # suite au lieu d'attendre une liberation qui ne viendra qu'apres lui. + third = _run(state, ["run", "--json", "--", PY, "-c", "pass"], cwd=w3, **cap) + release.write_text("", encoding="utf-8") for p in procs: p.wait(timeout=60) codes = [p.returncode for p in procs] + [third.returncode]