Files
ComfyUI/tests/isolation/test_init.py
John Pollock c5e7b9cdaf feat(isolation): process isolation for custom nodes via pyisolate
Adds opt-in process isolation for custom nodes using pyisolate's
bwrap sandbox and JSON-RPC bridge. Each isolated node pack runs in
its own child process with zero-copy tensor transfer via shared memory.

Core infrastructure:
- CLI flag --use-process-isolation to enable isolation
- Host/child startup fencing via PYISOLATE_CHILD env var
- Manifest-driven node discovery and extension loading
- JSON-RPC bridge between host and child processes
- Shared memory forensics for leak detection

Proxy layer:
- ModelPatcher, CLIP, VAE, and ModelSampling proxies
- Host service proxies (folder_paths, model_management, progress, etc.)
- Proxy base with automatic method forwarding

Execution integration:
- Extension wrapper with V3 hidden param mapping
- Runtime helpers for isolated node execution
- Host policy for node isolation decisions
- Fenced sampler device handling and model ejection parity

Serializers for cross-process data transfer:
- File3D (GLB), PLY (structured + gaussian), NPZ (streaming frames),
  VIDEO (VideoFromFile + VideoFromComponents) serializers
- data_type flag in SerializerRegistry for type-aware dispatch
- Isolated get_temp_directory() fence

New core save nodes:
- SavePLY and SaveNPZ with comfytype registrations (Ply, Npz)

DynamicVRAM compatibility:
- comfy-aimdo early init gated by isolation fence

Tests:
- Integration and policy tests for isolation lifecycle
- Manifest loader, host policy, proxy, and adapter unit tests

Depends on: pyisolate >= 0.9.2
2026-03-12 01:13:43 -05:00

57 lines
2.1 KiB
Python

"""Unit tests for PyIsolate isolation system initialization."""
def test_log_prefix():
"""Verify LOG_PREFIX constant is correctly defined."""
from comfy.isolation import LOG_PREFIX
assert LOG_PREFIX == "]["
assert isinstance(LOG_PREFIX, str)
def test_module_initialization():
"""Verify module initializes without errors."""
import comfy.isolation
assert hasattr(comfy.isolation, 'LOG_PREFIX')
assert hasattr(comfy.isolation, 'initialize_proxies')
class TestInitializeProxies:
def test_initialize_proxies_runs_without_error(self):
from comfy.isolation import initialize_proxies
initialize_proxies()
def test_initialize_proxies_registers_folder_paths_proxy(self):
from comfy.isolation import initialize_proxies
from comfy.isolation.proxies.folder_paths_proxy import FolderPathsProxy
initialize_proxies()
proxy = FolderPathsProxy()
assert proxy is not None
assert hasattr(proxy, "get_temp_directory")
def test_initialize_proxies_registers_model_management_proxy(self):
from comfy.isolation import initialize_proxies
from comfy.isolation.proxies.model_management_proxy import ModelManagementProxy
initialize_proxies()
proxy = ModelManagementProxy()
assert proxy is not None
assert hasattr(proxy, "get_torch_device")
def test_initialize_proxies_can_be_called_multiple_times(self):
from comfy.isolation import initialize_proxies
initialize_proxies()
initialize_proxies()
initialize_proxies()
def test_dev_proxies_accessible_when_dev_mode(self, monkeypatch):
"""Verify dev mode does not break core proxy initialization."""
monkeypatch.setenv("PYISOLATE_DEV", "1")
from comfy.isolation import initialize_proxies
from comfy.isolation.proxies.folder_paths_proxy import FolderPathsProxy
from comfy.isolation.proxies.utils_proxy import UtilsProxy
initialize_proxies()
folder_proxy = FolderPathsProxy()
utils_proxy = UtilsProxy()
assert folder_proxy is not None
assert utils_proxy is not None