From 0266b7f0fbc5d5c9ba7ee82182abc4bd23fda30d Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 26 Aug 2026 22:55:52 -0500 Subject: [PATCH] Cover the probe spawn failure and both probe-edge flag branches --- .../unit_tests/build_gen/test_arduino8266.py | 7 ++++ tests/unit_tests/build_gen/test_espidf.py | 34 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/tests/unit_tests/build_gen/test_arduino8266.py b/tests/unit_tests/build_gen/test_arduino8266.py index e220ddd89d..2bdb18c651 100644 --- a/tests/unit_tests/build_gen/test_arduino8266.py +++ b/tests/unit_tests/build_gen/test_arduino8266.py @@ -1871,6 +1871,13 @@ def test_write_project_pch_strict_emits_probe_edge( content = _write_ninja(paths, ccache="/usr/bin/ccache") assert "build esphome_pch.probe: pchprobe esphome_pch.h.gch" in content assert "-Werror=invalid-pch" in content + + # With extra src flags the probe edge carries them like the .gch edge + CORE.platformio_options["build_src_flags"] = ( + "-include esphome/components/esp8266/throw_stubs.h -DSRC_EXTRA" + ) + content = _write_ninja(paths, ccache="/usr/bin/ccache") + assert "pchprobe esphome_pch.h.gch\n flags = " in content for line in content.splitlines(): if line.startswith("build obj/src/main.cpp.o:"): assert line.endswith("| esphome_pch.h.gch esphome_pch.probe") diff --git a/tests/unit_tests/build_gen/test_espidf.py b/tests/unit_tests/build_gen/test_espidf.py index 1c97de14d5..5dfbb561a0 100644 --- a/tests/unit_tests/build_gen/test_espidf.py +++ b/tests/unit_tests/build_gen/test_espidf.py @@ -869,6 +869,40 @@ def test_prepare_pch_signal_kill_is_transient(tmp_path: Path) -> None: assert len(calls) == 2 +def test_prepare_pch_probe_spawn_failure_degrades( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + """A probe that cannot run discards the pch; strict raises.""" + from esphome.build_gen.espidf import prepare_pch + from esphome.core import EsphomeError + + dev = _make_pch_device(tmp_path, "dev_pf") + CORE.build_path = dev + gch = dev / "build" / "esphome_pch.h.gch" + + def probe_dies(cmd, **kwargs): + if "-fsyntax-only" in cmd: + raise OSError("probe spawn failed") + gch.write_bytes(b"gch") + return subprocess.CompletedProcess(cmd, 0, "", "") + + with ( + patch.object(CORE, "name", "test"), + patch("esphome.build_helpers.pch.subprocess.run", side_effect=probe_dies), + ): + prepare_pch() + assert not gch.exists() + assert not (dev / "build" / "esphome_pch.h.gch.sum").exists() + + monkeypatch.setenv("ESPHOME_PCH_STRICT", "1") + with ( + patch.object(CORE, "name", "test"), + patch("esphome.build_helpers.pch.subprocess.run", side_effect=probe_dies), + pytest.raises(EsphomeError, match="probe did not run"), + ): + prepare_pch() + + def test_prepare_pch_signal_kill_strict_raises( tmp_path: Path, monkeypatch: pytest.MonkeyPatch ) -> None: