53 lines
1.9 KiB
Python
53 lines
1.9 KiB
Python
"""Upload hashes must describe the bytes received by the remote sandbox."""
|
|
|
|
import hashlib
|
|
import tarfile
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from tools.environments.file_sync import FileSyncManager
|
|
|
|
|
|
@pytest.mark.parametrize("bulk", [False, True])
|
|
@pytest.mark.parametrize("edit_before_read", [False, True])
|
|
def test_host_save_during_upload_survives_unchanged_remote(
|
|
tmp_path, monkeypatch, bulk, edit_before_read,
|
|
):
|
|
monkeypatch.setenv("HERMES_HOME", str(tmp_path / "home"))
|
|
host = tmp_path / "home" / "skills" / "example" / "SKILL.md"
|
|
host.parent.mkdir(parents=True)
|
|
host.write_bytes(b"original skill")
|
|
remote_path = "/root/.hermes/skills/example/SKILL.md"
|
|
remote = tmp_path / "remote.md"
|
|
|
|
def upload(source, destination):
|
|
assert destination == remote_path
|
|
if edit_before_read:
|
|
host.write_bytes(b"saved while upload is starting")
|
|
remote.write_bytes(Path(source).read_bytes())
|
|
host.write_bytes(b"new local version saved before upload acknowledgement")
|
|
|
|
def download(destination):
|
|
with tarfile.open(destination, "w") as archive:
|
|
archive.add(remote, arcname=remote_path.lstrip("/"))
|
|
|
|
manager = FileSyncManager(
|
|
get_files_fn=lambda: [(str(host), remote_path)],
|
|
upload_fn=upload,
|
|
bulk_upload_fn=(lambda files: [upload(*pair) for pair in files]) if bulk else None,
|
|
delete_fn=lambda paths: None,
|
|
bulk_download_fn=download,
|
|
)
|
|
manager.sync(force=True)
|
|
saved = host.read_bytes()
|
|
assert manager._pushed_hashes[remote_path] == hashlib.sha256(remote.read_bytes()).hexdigest()
|
|
manager.sync_back()
|
|
assert host.read_bytes() == saved
|
|
|
|
# A subsequent cycle still detects and uploads the newer local version.
|
|
manager._upload_fn = lambda source, destination: remote.write_bytes(Path(source).read_bytes())
|
|
manager._bulk_upload_fn = None
|
|
manager.sync(force=True)
|
|
assert remote.read_bytes() == saved
|