| 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 | |