mirror of
https://github.com/esphome/esphome.git
synced 2026-10-02 09:20:22 +00:00
Add ESPHOME_PCH_STRICT and enforce it in the esp8266/esp32/rp2 image compile tests
This commit is contained in:
@@ -1842,3 +1842,17 @@ def test_write_project_pch_no_device_path_poison(tmp_path: Path) -> None:
|
||||
(CORE.relative_pioenvs_path(name) / "esphome_pch.h.gch.sum").read_text()
|
||||
)
|
||||
assert sums[0] == sums[1]
|
||||
|
||||
|
||||
def test_write_project_pch_strict_raises_on_skip(
|
||||
tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
from esphome.core import EsphomeError
|
||||
|
||||
monkeypatch.setenv("ESPHOME_PCH_STRICT", "1")
|
||||
paths = _make_framework(tmp_path)
|
||||
_set_flags(
|
||||
"-DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH", "-include foo.h"
|
||||
)
|
||||
with pytest.raises(EsphomeError, match="precedes the pch"):
|
||||
_write_ninja(paths, ccache="/usr/bin/ccache")
|
||||
|
||||
@@ -1078,3 +1078,22 @@ def test_prepare_pch_transient_compiler_failure_does_not_latch(
|
||||
prepare_pch()
|
||||
assert not (dev / "build" / "esphome_pch.h.gch.failed").exists()
|
||||
assert len(calls) == 2
|
||||
|
||||
|
||||
def test_prepare_pch_strict_raises_on_missing_db(
|
||||
tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
"""ESPHOME_PCH_STRICT turns the silent skip into a failure."""
|
||||
from esphome.build_gen.espidf import prepare_pch
|
||||
from esphome.core import EsphomeError
|
||||
|
||||
monkeypatch.setenv("ESPHOME_PCH_STRICT", "1")
|
||||
dev = _make_pch_device(tmp_path, "dev_st")
|
||||
(dev / "build" / "compile_commands.json").unlink()
|
||||
CORE.build_path = dev
|
||||
with (
|
||||
patch.object(CORE, "name", "test"),
|
||||
patch("esphome.build_helpers.pch.subprocess.run", side_effect=AssertionError),
|
||||
pytest.raises(EsphomeError, match="no usable compile command"),
|
||||
):
|
||||
prepare_pch()
|
||||
|
||||
@@ -216,3 +216,29 @@ def test_ccache_pch_env_warns_on_falsy_extsum(
|
||||
env = pch.ccache_pch_env()
|
||||
assert "CCACHE_PCH_EXTSUM" not in env
|
||||
assert "disables pch caching" in caplog.text
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("value", "expected"),
|
||||
[(None, False), ("0", False), ("1", True), ("true", True)],
|
||||
)
|
||||
def test_pch_strict(
|
||||
value: str | None, expected: bool, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
if value is None:
|
||||
monkeypatch.delenv("ESPHOME_PCH_STRICT", raising=False)
|
||||
else:
|
||||
monkeypatch.setenv("ESPHOME_PCH_STRICT", value)
|
||||
assert pch.pch_strict() is expected
|
||||
|
||||
|
||||
def test_pch_degraded_raises_only_in_strict(
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
) -> None:
|
||||
from esphome.core import EsphomeError
|
||||
|
||||
monkeypatch.delenv("ESPHOME_PCH_STRICT", raising=False)
|
||||
pch.pch_degraded("reason")
|
||||
monkeypatch.setenv("ESPHOME_PCH_STRICT", "1")
|
||||
with pytest.raises(EsphomeError, match="reason"):
|
||||
pch.pch_degraded("reason")
|
||||
|
||||
@@ -458,3 +458,14 @@ def test_pch_script_unreadable_local_header_skips_pch(
|
||||
assert not (proj / "esphome_pch.h.gch.sum").exists()
|
||||
assert scons_env.prepended == []
|
||||
assert "skipping precompiled header" in capsys.readouterr().out
|
||||
|
||||
|
||||
def test_pch_script_strict_raises_when_pch_not_used(tmp_path: Path) -> None:
|
||||
"""ESPHOME_PCH_STRICT fails the build instead of degrading."""
|
||||
with pytest.raises(Exception, match="ESPHOME_PCH_STRICT|boom"):
|
||||
_run_script(tmp_path, fail=True, env_vars={"ESPHOME_PCH_STRICT": "1"})
|
||||
|
||||
|
||||
def test_pch_script_strict_passes_on_success(tmp_path: Path) -> None:
|
||||
scons_env = _run_script(tmp_path, env_vars={"ESPHOME_PCH_STRICT": "1"})
|
||||
assert scons_env.prepended
|
||||
|
||||
Reference in New Issue
Block a user