Files
cibuildwheel/unit_test/main_commands_test.py
T
Agriya KhetarpalHenry Schreinerpre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
afe486c21f feat: add a --clean-cache command to clean up locations specified at CIBW_CACHE_PATH (#2489)
* Add `clean_cache` to command-line arguments

* Add `--clean-cache` to parser

* Add logic

* Add test to clean cache when it exists

* Ad test to run cache cleaning when none exists

* Add test to run cache cleaning on unwritable path

* Use `main()` instead

* tests: move command tests

Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>

* Create cibuildwheel cache sentinel file

* Add sentinel to existing tests + add new test

* Add signature and switch to `CACHEDIR.TAG`

Co-authored-by: Henry Schreiner <HenrySchreinerIII@gmail.com>

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Another instance to replace with `CACHEDIR.TAG`

* Verify `CACHEDIR.TAG` signature

* Simplify code branching and control flow

* Add test

* Add link to `CACHEDIR.TAG` specification

* Write with UTF-8 encoding

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
Co-authored-by: Henry Schreiner <henryschreineriii@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-08-19 11:53:27 -04:00

128 lines
4.0 KiB
Python

import errno
import shutil
import sys
import pytest
import cibuildwheel.__main__ as main_module
from cibuildwheel.__main__ import main
def test_clean_cache_when_cache_exists(tmp_path, monkeypatch, capfd):
fake_cache_dir = (tmp_path / "cibw_cache").resolve()
monkeypatch.setattr(main_module, "CIBW_CACHE_PATH", fake_cache_dir)
fake_cache_dir.mkdir(parents=True, exist_ok=True)
assert fake_cache_dir.exists()
cibw_sentinel = fake_cache_dir / "CACHEDIR.TAG"
cibw_sentinel.write_text(
"Signature: 8a477f597d28d172789f06886806bc55\n"
"# This file is a cache directory tag created by cibuildwheel.\n"
"# For information about cache directory tags, see:\n"
"# https://www.brynosaurus.com/cachedir/",
encoding="utf-8",
)
dummy_file = fake_cache_dir / "dummy.txt"
dummy_file.write_text("hello")
monkeypatch.setattr(sys, "argv", ["cibuildwheel", "--clean-cache"])
with pytest.raises(SystemExit) as e:
main()
assert e.value.code == 0
out, err = capfd.readouterr()
assert f"Clearing cache directory: {fake_cache_dir}" in out
assert "Cache cleared successfully." in out
assert not fake_cache_dir.exists()
def test_clean_cache_when_cache_does_not_exist(tmp_path, monkeypatch, capfd):
fake_cache_dir = (tmp_path / "nonexistent_cache").resolve()
monkeypatch.setattr(main_module, "CIBW_CACHE_PATH", fake_cache_dir)
monkeypatch.setattr(sys, "argv", ["cibuildwheel", "--clean-cache"])
with pytest.raises(SystemExit) as e:
main()
assert e.value.code == 0
out, err = capfd.readouterr()
assert f"Cache directory does not exist: {fake_cache_dir}" in out
def test_clean_cache_with_error(tmp_path, monkeypatch, capfd):
fake_cache_dir = (tmp_path / "cibw_cache").resolve()
monkeypatch.setattr(main_module, "CIBW_CACHE_PATH", fake_cache_dir)
fake_cache_dir.mkdir(parents=True, exist_ok=True)
assert fake_cache_dir.exists()
cibw_sentinel = fake_cache_dir / "CACHEDIR.TAG"
cibw_sentinel.write_text(
"Signature: 8a477f597d28d172789f06886806bc55\n"
"# This file is a cache directory tag created by cibuildwheel.\n"
"# For information about cache directory tags, see:\n"
"# https://www.brynosaurus.com/cachedir/",
encoding="utf-8",
)
monkeypatch.setattr(sys, "argv", ["cibuildwheel", "--clean-cache"])
def fake_rmtree(path): # noqa: ARG001
raise OSError(errno.EACCES, "Permission denied")
monkeypatch.setattr(shutil, "rmtree", fake_rmtree)
with pytest.raises(SystemExit) as e:
main()
assert e.value.code == 1
out, err = capfd.readouterr()
assert f"Clearing cache directory: {fake_cache_dir}" in out
assert "Error clearing cache:" in err
def test_clean_cache_without_sentinel(tmp_path, monkeypatch, capfd):
fake_cache_dir = (tmp_path / "not_a_cache").resolve()
monkeypatch.setattr(main_module, "CIBW_CACHE_PATH", fake_cache_dir)
fake_cache_dir.mkdir(parents=True, exist_ok=True)
monkeypatch.setattr(sys, "argv", ["cibuildwheel", "--clean-cache"])
with pytest.raises(SystemExit) as e:
main()
assert e.value.code == 1
out, err = capfd.readouterr()
assert "does not appear to be a cibuildwheel cache directory" in err
assert fake_cache_dir.exists()
def test_clean_cache_with_invalid_signature(tmp_path, monkeypatch, capfd):
fake_cache_dir = (tmp_path / "fake_cache").resolve()
monkeypatch.setattr(main_module, "CIBW_CACHE_PATH", fake_cache_dir)
fake_cache_dir.mkdir(parents=True, exist_ok=True)
cibw_sentinel = fake_cache_dir / "CACHEDIR.TAG"
cibw_sentinel.write_text("Invalid signature\n# This is not a real cache directory tag")
monkeypatch.setattr(sys, "argv", ["cibuildwheel", "--clean-cache"])
with pytest.raises(SystemExit) as e:
main()
assert e.value.code == 1
out, err = capfd.readouterr()
assert "does not contain a valid cache directory signature" in err
assert fake_cache_dir.exists()