#!/usr/bin/env python3 """Создаёт и проверяет HDD-fixture группового F5.""" from __future__ import annotations import pathlib import sys def payload(size: int, seed: int) -> bytes: return bytes(((index * 37 + seed) & 0xFF) for index in range(size)) def create(root: pathlib.Path) -> None: source = root / "GRSRC" target = root / "GRDST" source.mkdir(parents=True) target.mkdir() (source / "A.BIN").write_bytes(payload(10, 3)) (source / "B.BIN").write_bytes(payload(4097, 11)) (source / "C.BIN").write_bytes(b"") directory = source / "ADIR" directory.mkdir() (directory / "INSIDE.TXT").write_bytes(b"must not be copied\r\n") def verify(root: pathlib.Path) -> None: source = root / "GRSRC" target = root / "GRDST" failures: list[str] = [] expected = { "A.BIN": payload(10, 3), "B.BIN": payload(4097, 11), "C.BIN": b"", } for name, content in expected.items(): source_path = source / name target_path = target / name if not source_path.is_file() or source_path.read_bytes() != content: failures.append(f"source изменён: {name}") if not target_path.is_file() or target_path.read_bytes() != content: failures.append(f"target не совпадает: {name}") target_inside = target / "ADIR" / "INSIDE.TXT" if (not target_inside.is_file() or target_inside.read_bytes() != b"must not be copied\r\n"): failures.append("выбранный каталог не скопирован рекурсивно") temporary = [path.name for path in target.rglob("*") if path.name.upper().endswith(".TMP")] if temporary: failures.append(f"остались temp: {temporary}") inside = source / "ADIR" / "INSIDE.TXT" if not inside.is_file() or inside.read_bytes() != b"must not be copied\r\n": failures.append("исходный выбранный каталог изменён") if failures: for failure in failures: print(f"FAIL: {failure}") raise SystemExit(1) print("PASS: 3 selected files and selected directory copied; no temp.") def main() -> None: if len(sys.argv) != 3 or sys.argv[1] not in {"create", "verify"}: raise SystemExit(f"usage: {sys.argv[0]} create|verify DIR") root = pathlib.Path(sys.argv[2]) if sys.argv[1] == "create": create(root) else: verify(root) if __name__ == "__main__": main()