Files
hermes-agent/tests/tools/test_file_sync_upload_snapshot.py
T

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