From 6ecf4c86ce2f19045dcf9f9e0e6a4b5300e51dcf Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Mon, 14 Sep 2026 14:41:19 -0400 Subject: [PATCH] =?UTF-8?q?[FIX]=20test=20proxmox=20:=20sauter=20quand=20l?= =?UTF-8?q?'h=C3=B4te=20n'a=20pas=20les=20outils=20Debian?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Proxmox install script calls Debian's own tools — dpkg, apt-get, hostname, debconf-set-selections. A host without them cannot PLAY it: the shell returns 127 at the first call, and the truncated output that follows made nine tests fail on an Arch host. A report carrying nine failures nobody can act on makes its reader stop looking for what matters. They skip now, naming the missing tool, judged on what happened rather than on an inventory — a host may have dpkg without debconf-set-selections. --- FR --- Le script d'installation Proxmox appelle les outils de Debian — dpkg, apt-get, hostname, debconf-set-selections. Une machine qui ne les a pas ne peut pas le JOUER : le shell rend 127 au premier appel, et la sortie tronquée faisait échouer neuf tests sur un hôte Arch. Un rapport qui porte neuf échecs sur lesquels personne ne peut agir fait cesser d'y chercher ce qui compte. Ils sautent désormais en nommant l'outil absent, jugés sur ce qui s'est passé et non sur un inventaire — une machine peut porter dpkg sans debconf-set-selections. Assisted-by: Claude Opus 5 --- test/test_qemu_proxmox.py | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/test/test_qemu_proxmox.py b/test/test_qemu_proxmox.py index d3b5e25..604ca15 100644 --- a/test/test_qemu_proxmox.py +++ b/test/test_qemu_proxmox.py @@ -167,6 +167,37 @@ class TestLeProfil(unittest.TestCase): self.assertIn("install_odoo_18", cmd) +# Le script s'installe SUR Debian et appelle les outils de Debian. Une +# machine qui ne les a pas ne peut pas le JOUER : le shell rend 127 au +# premier appel, et tout ce qui suit — une sortie tronquée, une chaîne +# introuvable — est l'effet de cette absence, jamais un défaut du script. +# +# Un tel test SAUTE, et dit pourquoi. Un échec appellerait une correction qui +# n'existe pas, et un rapport qui en porte neuf fait douter de tout le reste : +# celui qui le lit — humain ou machine — cesse d'y chercher ce qui compte. +_OUTILS_DEBIAN = ("dpkg", "apt-get", "hostname", "debconf-set-selections") + + +def _sauter_si_outil_debian_manquant(res): + """Saute le test quand le script a buté sur un outil absent de l'hôte. + + Jugé sur ce qui S'EST PASSÉ — le code 127 et le nom de l'outil dans la + sortie — et non sur un inventaire préalable : une machine peut porter + « dpkg » sans « debconf-set-selections », et l'inventaire dirait alors le + contraire de l'exécution. Les tests qui attendent un REFUS du script + n'atteignent jamais ces outils : ils continuent de tourner partout. + """ + if res.returncode != 127: + return + sortie = (res.stdout or "") + (res.stderr or "") + for outil in _OUTILS_DEBIAN: + if outil in sortie: + raise unittest.SkipTest( + f"« {outil} » absent de cet hôte : le script d'installation" + " Proxmox ne se joue que sur une base Debian" + ) + + class TestLeScript(unittest.TestCase): def test_it_is_executable_and_valid_shell(self): self.assertTrue(os.access(SCRIPT, os.X_OK), "pas exécutable") @@ -197,7 +228,7 @@ class TestLeScript(unittest.TestCase): (bin_dir / nom).chmod(0o755) osrel = pathlib.Path(tmp) / "os-release" osrel.write_text("ID=debian\nVERSION_CODENAME=trixie\n") - return subprocess.run( + res = subprocess.run( ["bash", str(SCRIPT), *args], capture_output=True, text=True, @@ -209,6 +240,10 @@ class TestLeScript(unittest.TestCase): ), timeout=120, ) + # HORS du « with » : le répertoire des doublures est rendu avant que + # le saut ne remonte, et aucun test ne laisse le sien derrière lui. + _sauter_si_outil_debian_manquant(res) + return res def test_an_unpublished_architecture_is_refused_by_name(self): res = self._lance(stubs={"uname": "echo s390x"})