Initializare dupa curatare folder
This commit is contained in:
@@ -0,0 +1,229 @@
|
||||
"""Tests for the vendored wheels and their verification.
|
||||
|
||||
The bundled wheels let a device with no internet set itself up, so the things
|
||||
that matter are: they are actually present and pure-Python (portable), the
|
||||
checksums match, and a tampered wheel is refused rather than installed.
|
||||
"""
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
|
||||
SRC = os.path.join(
|
||||
os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "src"
|
||||
)
|
||||
if SRC not in sys.path:
|
||||
sys.path.insert(0, SRC)
|
||||
|
||||
import pytest # noqa: E402
|
||||
|
||||
from rdm_card_reader import bootstrap # noqa: E402
|
||||
from rdm_card_reader.bootstrap import ( # noqa: E402
|
||||
bundled_wheel_dir,
|
||||
ensure_dependencies,
|
||||
local_wheel_missing,
|
||||
verify_wheels,
|
||||
)
|
||||
|
||||
|
||||
# -- the wheels that ship with the package ---------------------------------
|
||||
|
||||
def test_bundled_wheel_dir_exists():
|
||||
folder = bundled_wheel_dir()
|
||||
assert folder is not None
|
||||
assert os.path.isdir(folder)
|
||||
|
||||
|
||||
def test_both_required_wheels_are_present():
|
||||
folder = bundled_wheel_dir()
|
||||
names = os.listdir(folder)
|
||||
assert any(n.startswith("rdm6300-") and n.endswith(".whl") for n in names)
|
||||
assert any(n.startswith("pyserial-") and n.endswith(".whl") for n in names)
|
||||
|
||||
|
||||
def test_bundled_wheels_are_pure_python():
|
||||
"""A compiled wheel would only work on one architecture; these must not."""
|
||||
folder = bundled_wheel_dir()
|
||||
wheels = [n for n in os.listdir(folder) if n.endswith(".whl")]
|
||||
assert wheels
|
||||
for name in wheels:
|
||||
assert name.endswith("-none-any.whl"), (
|
||||
"{} is architecture-specific and cannot be shipped".format(name)
|
||||
)
|
||||
|
||||
|
||||
def test_bundled_wheels_verify_against_their_checksums():
|
||||
folder = bundled_wheel_dir()
|
||||
assert verify_wheels(folder) == []
|
||||
|
||||
|
||||
def test_checksums_file_is_shipped():
|
||||
folder = bundled_wheel_dir()
|
||||
assert os.path.exists(os.path.join(folder, "SHA256SUMS"))
|
||||
|
||||
|
||||
def test_total_vendored_size_is_reasonable():
|
||||
"""Guard against someone dropping a huge binary into the repo."""
|
||||
folder = bundled_wheel_dir()
|
||||
total = sum(
|
||||
os.path.getsize(os.path.join(folder, name))
|
||||
for name in os.listdir(folder)
|
||||
)
|
||||
assert total < 2 * 1024 * 1024
|
||||
|
||||
|
||||
# -- verification -----------------------------------------------------------
|
||||
|
||||
def test_tampered_wheel_is_detected(tmp_path):
|
||||
folder = tmp_path / "wheels"
|
||||
folder.mkdir()
|
||||
wheel = folder / "rdm6300-0.1.1-py3-none-any.whl"
|
||||
wheel.write_bytes(b"not the real wheel")
|
||||
(folder / "SHA256SUMS").write_text(
|
||||
"afb067da8b8d23a477138ca67d4ff1d198f12d157b64668c9dd3cbd7df54e74e"
|
||||
" rdm6300-0.1.1-py3-none-any.whl\n"
|
||||
)
|
||||
problems = verify_wheels(str(folder))
|
||||
assert problems
|
||||
assert any("checksum mismatch" in p for p in problems)
|
||||
|
||||
|
||||
def test_missing_wheel_is_reported(tmp_path):
|
||||
folder = tmp_path / "wheels"
|
||||
folder.mkdir()
|
||||
(folder / "SHA256SUMS").write_text(
|
||||
"abc123 rdm6300-0.1.1-py3-none-any.whl\n"
|
||||
)
|
||||
problems = verify_wheels(str(folder))
|
||||
assert any("missing" in p for p in problems)
|
||||
|
||||
|
||||
def test_no_sums_file_means_nothing_to_check(tmp_path):
|
||||
folder = tmp_path / "wheels"
|
||||
folder.mkdir()
|
||||
(folder / "x-1.0-py3-none-any.whl").write_bytes(b"x")
|
||||
assert verify_wheels(str(folder)) == []
|
||||
|
||||
|
||||
def test_verification_passes_for_untouched_copy(tmp_path):
|
||||
source = bundled_wheel_dir()
|
||||
dest = tmp_path / "wheels"
|
||||
shutil.copytree(source, dest)
|
||||
assert verify_wheels(str(dest)) == []
|
||||
|
||||
|
||||
# -- coverage check ---------------------------------------------------------
|
||||
|
||||
def test_local_wheel_missing_detects_absent_requirement(tmp_path):
|
||||
folder = tmp_path / "wheels"
|
||||
folder.mkdir()
|
||||
assert local_wheel_missing(["rdm6300>=0.1.1"], str(folder)) == ["rdm6300>=0.1.1"]
|
||||
|
||||
|
||||
def test_local_wheel_missing_accepts_present_requirement():
|
||||
folder = bundled_wheel_dir()
|
||||
assert local_wheel_missing(["rdm6300>=0.1.1", "pyserial>=3.5"], folder) == []
|
||||
|
||||
|
||||
def test_local_wheel_missing_normalises_underscores(tmp_path):
|
||||
folder = tmp_path / "wheels"
|
||||
folder.mkdir()
|
||||
(folder / "charset_normalizer-3.4.1-py3-none-any.whl").write_bytes(b"x")
|
||||
assert local_wheel_missing(["charset-normalizer>=3"], str(folder)) == []
|
||||
|
||||
|
||||
# -- integration into ensure_dependencies -----------------------------------
|
||||
|
||||
def test_bundled_wheels_used_automatically(monkeypatch):
|
||||
"""No --wheel-dir given, so the bundled ones must be picked up."""
|
||||
seen = {}
|
||||
monkeypatch.setattr(
|
||||
bootstrap, "missing_packages",
|
||||
lambda packages=None: [] if seen.get("done") else [("rdm6300", "rdm6300>=0.1.1")],
|
||||
)
|
||||
|
||||
def fake_install(requirements, wheel_dir=None, logger=None, timeout=300, no_deps=False):
|
||||
seen["wheel_dir"] = wheel_dir
|
||||
seen["done"] = True
|
||||
return True
|
||||
|
||||
monkeypatch.setattr(bootstrap, "install", fake_install)
|
||||
lines = []
|
||||
assert ensure_dependencies(logger=lines.append) is True
|
||||
assert seen["wheel_dir"] == bundled_wheel_dir()
|
||||
assert any("bundled" in line for line in lines)
|
||||
|
||||
|
||||
def test_tampered_bundle_falls_back_to_pypi(monkeypatch, tmp_path):
|
||||
"""A bad checksum must not block installation - but must be reported."""
|
||||
folder = tmp_path / "wheels"
|
||||
folder.mkdir()
|
||||
(folder / "rdm6300-0.1.1-py3-none-any.whl").write_bytes(b"tampered")
|
||||
(folder / "SHA256SUMS").write_text("deadbeef rdm6300-0.1.1-py3-none-any.whl\n")
|
||||
|
||||
seen = {}
|
||||
monkeypatch.setattr(bootstrap, "bundled_wheel_dir", lambda: str(folder))
|
||||
monkeypatch.setattr(
|
||||
bootstrap, "missing_packages",
|
||||
lambda packages=None: [] if seen.get("done") else [("rdm6300", "rdm6300>=0.1.1")],
|
||||
)
|
||||
|
||||
def fake_install(requirements, wheel_dir=None, logger=None, timeout=300, no_deps=False):
|
||||
seen["wheel_dir"] = wheel_dir
|
||||
seen["done"] = True
|
||||
return True
|
||||
|
||||
monkeypatch.setattr(bootstrap, "install", fake_install)
|
||||
lines = []
|
||||
assert ensure_dependencies(logger=lines.append) is True
|
||||
assert seen["wheel_dir"] is None # fell back to PyPI
|
||||
assert any("checksum mismatch" in line for line in lines)
|
||||
|
||||
|
||||
def test_explicit_wheel_dir_overrides_bundled(monkeypatch, tmp_path):
|
||||
folder = tmp_path / "wheels"
|
||||
folder.mkdir()
|
||||
(folder / "rdm6300-0.1.1-py3-none-any.whl").write_bytes(b"x")
|
||||
(folder / "pyserial-3.5-py2.py3-none-any.whl").write_bytes(b"x")
|
||||
|
||||
seen = {}
|
||||
monkeypatch.setattr(
|
||||
bootstrap, "missing_packages",
|
||||
lambda packages=None: [] if seen.get("done") else [("rdm6300", "rdm6300>=0.1.1")],
|
||||
)
|
||||
|
||||
def fake_install(requirements, wheel_dir=None, logger=None, timeout=300, no_deps=False):
|
||||
seen["wheel_dir"] = wheel_dir
|
||||
seen["done"] = True
|
||||
return True
|
||||
|
||||
monkeypatch.setattr(bootstrap, "install", fake_install)
|
||||
ensure_dependencies(wheel_dir=str(folder))
|
||||
assert seen["wheel_dir"] == str(folder)
|
||||
|
||||
|
||||
def test_bundle_not_covering_a_requirement_falls_back(monkeypatch, tmp_path):
|
||||
"""A bundle missing one package must not cause a guaranteed pip failure."""
|
||||
folder = tmp_path / "wheels"
|
||||
folder.mkdir()
|
||||
(folder / "rdm6300-0.1.1-py3-none-any.whl").write_bytes(b"x")
|
||||
|
||||
seen = {}
|
||||
monkeypatch.setattr(bootstrap, "bundled_wheel_dir", lambda: str(folder))
|
||||
monkeypatch.setattr(
|
||||
bootstrap, "missing_packages",
|
||||
lambda packages=None: [] if seen.get("done")
|
||||
else [("rdm6300", "rdm6300>=0.1.1"), ("serial", "pyserial>=3.5")],
|
||||
)
|
||||
|
||||
def fake_install(requirements, wheel_dir=None, logger=None, timeout=300, no_deps=False):
|
||||
seen["wheel_dir"] = wheel_dir
|
||||
seen["wheel_dir_at_call"] = wheel_dir
|
||||
seen["done"] = True
|
||||
return True
|
||||
|
||||
monkeypatch.setattr(bootstrap, "install", fake_install)
|
||||
lines = []
|
||||
ensure_dependencies(logger=lines.append)
|
||||
assert seen["wheel_dir"] is None
|
||||
assert any("do not cover" in line for line in lines)
|
||||
Reference in New Issue
Block a user