mirror of
https://github.com/openswarm-ai/openswarm.git
synced 2026-08-17 18:25:42 +02:00
71 lines
2.8 KiB
Python
71 lines
2.8 KiB
Python
"""Regression guard for the oversize-file corruption fix (PR #106).
|
|
|
|
The bug: the workspace poll read substituted any file over the per-file cap with
|
|
a `// [openswarm] file truncated...` marker; the frontend treated that marker as
|
|
real content and round-tripped it back into storage on save/export/snapshot,
|
|
permanently destroying the real source of oversize files. These tests pin the
|
|
three layers of the fix: omit-on-read (no stub), refuse-shrink-on-write (disk
|
|
boundary), and a full read->write round-trip that proves the bytes survive.
|
|
"""
|
|
|
|
from pathlib import Path
|
|
|
|
from backend.apps.outputs.workspace_io import (
|
|
walk_directory,
|
|
would_shrink_oversize_file,
|
|
)
|
|
|
|
MARKER = "// [openswarm] file truncated"
|
|
# Comfortably above the workspace poll cap (currently 2 MB) without importing the
|
|
# module-private constant. If the cap is ever raised past this, bump it here too.
|
|
OVERSIZE = 3 * 1024 * 1024
|
|
|
|
|
|
def test_walk_omits_oversize_and_never_stubs_content(tmp_path: Path) -> None:
|
|
small = tmp_path / "app.py"
|
|
small.write_text("print('hi')\n")
|
|
big = tmp_path / "bundle.js"
|
|
big.write_text("x" * OVERSIZE)
|
|
|
|
files, truncated = walk_directory(str(tmp_path))
|
|
|
|
assert files["app.py"] == "print('hi')\n"
|
|
# Oversize file is reported out-of-band, NOT substituted with a stub.
|
|
assert "bundle.js" not in files
|
|
assert truncated["bundle.js"] >= OVERSIZE
|
|
# The corrupting marker must never appear as content anywhere.
|
|
assert all(MARKER not in c for c in files.values())
|
|
|
|
|
|
def test_would_shrink_guard_refuses_only_a_shrinking_oversize_write(tmp_path: Path) -> None:
|
|
big = tmp_path / "bundle.js"
|
|
big.write_text("y" * OVERSIZE)
|
|
|
|
# A small marker/stub write would shrink a known-oversize file -> refuse.
|
|
assert would_shrink_oversize_file(str(big), MARKER) is True
|
|
# A legitimately larger rewrite is allowed.
|
|
assert would_shrink_oversize_file(str(big), "z" * (OVERSIZE + 4096)) is False
|
|
# A normal under-cap file is never guarded.
|
|
small = tmp_path / "app.py"
|
|
small.write_text("print('hi')")
|
|
assert would_shrink_oversize_file(str(small), "x") is False
|
|
# A nonexistent path is never guarded.
|
|
assert would_shrink_oversize_file(str(tmp_path / "nope.js"), "x") is False
|
|
|
|
|
|
def test_oversize_bytes_survive_read_then_writeback_roundtrip(tmp_path: Path) -> None:
|
|
big = tmp_path / "bundle.js"
|
|
original = "A" * OVERSIZE
|
|
big.write_text(original)
|
|
|
|
# READ leg: the poll omits it, so a client never even holds the bytes.
|
|
files, truncated = walk_directory(str(tmp_path))
|
|
assert "bundle.js" not in files and "bundle.js" in truncated
|
|
|
|
# WRITE leg: a client that round-trips a stub is refused at the disk boundary.
|
|
if not would_shrink_oversize_file(str(big), MARKER):
|
|
big.write_text(MARKER)
|
|
|
|
assert big.read_text() == original
|
|
assert len(big.read_text()) == OVERSIZE
|