Lex every build_flags entry with re-quoted emission and lock the shared cache install

This commit is contained in:
J. Nick Koston
2026-08-20 09:33:49 -05:00
parent 47564d3a74
commit a90dd88aa8
4 changed files with 108 additions and 20 deletions
@@ -607,3 +607,29 @@ def test_flag_defines_lexes_multi_token_entries() -> None:
assert defines["FOO"] == "FOO=1"
config = _resolve_build_config(defines)
assert config.lwip_lib == "lwip2-1460"
def test_project_flags_lexes_every_entry() -> None:
"""A linker flag anywhere in an entry reaches the link line (PIO parity)."""
_set_flags("-DFOO=1 -lbar")
compile_flags, _link, _dirs, libs = arduino8266._project_flags()
assert libs == ["bar"]
assert "-DFOO=1" in compile_flags
def test_project_flags_unflags_match_tokens() -> None:
"""build_unflags removes a token embedded in a multi-token entry."""
_set_flags("-Os -g3")
CORE.build_unflags = {"-Os"}
compile_flags, _link, _dirs, _libs = arduino8266._project_flags()
assert "-g3" in compile_flags
assert "-Os" not in compile_flags
def test_project_flags_requotes_lexed_defines() -> None:
"""A quoted spaced value stays one compiler argument after lex/emit."""
_set_flags('-DGREETING="hello world"')
compile_flags, _link, _dirs, _libs = arduino8266._project_flags()
# shlex folds the quotes (as PIO's ParseFlags does); _shell_token
# re-quotes the spaced token so the shell passes one argv element
assert compile_flags == ['"-DGREETING=hello world"']
@@ -402,3 +402,30 @@ def test_install_package_unexpected_layout_raises(tmp_path: Path) -> None:
mock_extract.side_effect = lambda *_a, **_kw: dest.mkdir()
framework._install_package("pkg", "1.0.0", dest, ["http://m"], expect=("bin",))
assert not (dest / ".esphome_extracted").exists()
def test_install_package_marker_rechecked_under_lock(tmp_path: Path) -> None:
"""A concurrent install finishing while we wait for the lock is detected."""
dest = tmp_path / "pkg"
marker = dest / ".esphome_extracted"
class _FakeLock:
def __init__(self, *_a, **_kw) -> None:
pass
def __enter__(self):
dest.mkdir(parents=True, exist_ok=True)
marker.touch()
return self
def __exit__(self, *args) -> None:
pass
with (
patch("filelock.FileLock", _FakeLock),
patch.object(framework, "download_from_mirrors") as mock_download,
patch.object(framework, "rmdir") as mock_rmdir,
):
framework._install_package("pkg", "1.0.0", dest, ["http://m"])
mock_download.assert_not_called()
mock_rmdir.assert_not_called()