Files
OBLITERATUS/tests/test_app_model_lifecycle.py
T

72 lines
2.2 KiB
Python

"""Regression test for unload, cleanup, and lazy chat model lifecycle."""
from __future__ import annotations
import subprocess
import sys
def test_active_checkpoint_survives_cleanup_and_remains_chat_recoverable(tmp_path):
"""Exercise app state in isolation from Gradio's import-time worker sockets."""
script = r'''
import pathlib
import sys
import app
theme = app.THEME.to_dict()["theme"]
assert theme["body_background_fill"] != theme["body_background_fill_dark"]
assert theme["body_text_color"] != theme["body_text_color_dark"]
assert theme["background_fill_secondary"] == "#ffffff"
assert theme["background_fill_secondary_dark"] == "#0d0d14"
assert ".chatbot .message.bot" in app.CSS
assert "color: var(--body-text-color) !important" in app.CSS
root = pathlib.Path(sys.argv[1])
active = root / "obliterated_1"
stale = root / "obliterated_2"
cache = root / "model-cache"
for directory in (active, stale, cache):
directory.mkdir()
(directory / "weights.bin").write_bytes(b"model")
app.dev.free_gpu_memory = lambda: None
app._state.update({
"model": object(), "tokenizer": object(), "model_name": "org/model",
"method": "advanced", "status": "ready", "output_dir": str(active),
})
app._session_models.clear()
app._session_models.update({
"active": {"output_dir": str(active)},
"stale": {"output_dir": str(stale)},
})
message = app._cleanup_disk(cache_roots=[cache], temp_root=root)
assert active.is_dir()
assert not stale.exists()
assert not cache.exists()
assert list(app._session_models) == ["active"]
assert app._state["model"] is None and app._state["tokenizer"] is None
assert app._state["status"] == "ready"
assert "will reload it automatically" in message
header = app.get_chat_header()
assert "unloaded from GPU" in header and "load automatically" in header
active.rename(root / "removed")
header = app.get_chat_header()
assert header.startswith("No model loaded")
assert app._state["status"] == "idle"
assert app._state["model_name"] is None
assert app._state["output_dir"] is None
'''
result = subprocess.run(
[sys.executable, "-c", script, str(tmp_path)],
capture_output=True,
text=True,
timeout=60,
check=False,
)
assert result.returncode == 0, result.stdout + result.stderr