import time from arena.sandbox_lease import SandboxLeaseManager, sandbox_ttl_seconds_from_env def test_sandbox_lease_closes_resource_after_idle_ttl() -> None: closed: list[str] = [] expired: list[str] = [] leases = SandboxLeaseManager(ttl_seconds=0.01) leases.start("lease-1", lambda: closed.append("lease-1"), on_expire=lambda: expired.append("lease-1")) deadline = time.time() + 1 while time.time() < deadline and not closed: time.sleep(0.01) assert closed == ["lease-1"] assert expired == ["lease-1"] def test_sandbox_lease_touch_resets_idle_ttl() -> None: closed: list[str] = [] leases = SandboxLeaseManager(ttl_seconds=0.06) leases.start("lease-1", lambda: closed.append("lease-1")) time.sleep(0.03) assert leases.touch("lease-1") is True time.sleep(0.04) assert closed == [] deadline = time.time() + 1 while time.time() < deadline and not closed: time.sleep(0.01) assert closed == ["lease-1"] def test_sandbox_lease_close_is_idempotent() -> None: closed: list[str] = [] leases = SandboxLeaseManager(ttl_seconds=60) leases.start("lease-1", lambda: closed.append("lease-1")) assert leases.close("lease-1") is True assert leases.close("lease-1") is False assert closed == ["lease-1"] def test_sandbox_ttl_env_falls_back_on_invalid_value(monkeypatch) -> None: monkeypatch.setenv("DEEPAGENT_SANDBOX_TTL_SECONDS", "bad") assert sandbox_ttl_seconds_from_env() == 30 * 60