ifcurl/tests/test_sandbox.py

51 lines
1.1 KiB
Python
Raw Normal View History

"""Tests for ifcurl.sandbox — subprocess isolation for ifcopenshell calls."""
from __future__ import annotations
import ctypes
import os
import sys
import pytest
from ifcurl.sandbox import (
SandboxCrashError,
SandboxTimeoutError,
run_sandboxed,
)
def _return_value(x):
return x
def _raise_value_error(msg):
raise ValueError(msg)
def _segfault():
ctypes.string_at(0) # dereference NULL → SIGSEGV
def _sleep_forever():
import time
time.sleep(9999)
class TestRunSandboxed:
def test_returns_value(self):
assert run_sandboxed(_return_value, 42) == 42
def test_propagates_exception(self):
with pytest.raises(ValueError, match="bad input"):
run_sandboxed(_raise_value_error, "bad input")
@pytest.mark.skipif(sys.platform == "win32", reason="SIGSEGV test requires Unix")
def test_crash_raises_sandbox_crash_error(self):
with pytest.raises(SandboxCrashError):
run_sandboxed(_segfault)
def test_timeout_raises_sandbox_timeout_error(self):
with pytest.raises(SandboxTimeoutError):
run_sandboxed(_sleep_forever, timeout=1)