"""Tests for per-engine thread isolation (issue #1248).""" import concurrent.futures from types import SimpleNamespace from unittest.mock import MagicMock, patch import mlx.core as mx import pytest from omlx.engine_core import EngineCore from omlx.request import Request, SamplingParams from omlx.scheduler import Scheduler, SchedulerConfig class TestSchedulerStreamParam: """Scheduler must accept an explicit stream and use it instead of the module-level generation_stream.""" def test_scheduler_stores_explicit_stream(self): mock_model = MagicMock() mock_model.model_type = "test" mock_tokenizer = MagicMock() mock_tokenizer.eos_token_id = 0 stream = mx.new_thread_local_stream(mx.default_device()) scheduler = Scheduler( model=mock_model, tokenizer=mock_tokenizer, stream=stream, ) assert scheduler._stream is stream def test_scheduler_defaults_to_generation_stream(self): from omlx.scheduler import _default_generation_stream mock_model = MagicMock() mock_model.model_type = "test" mock_tokenizer = MagicMock() mock_tokenizer.eos_token_id = 0 scheduler = Scheduler( model=mock_model, tokenizer=mock_tokenizer, ) assert scheduler._stream is _default_generation_stream class TestSchedulerStreamIsolation: """Scheduler must use self._stream in all GPU stream operations, never the module-level generation_stream.""" def test_no_module_level_generation_stream_in_hot_path(self): """After migration, scheduler.py should not reference the module-level generation_stream anywhere in the Scheduler class body except the __init__ default fallback and comments/docstrings.""" import inspect import re import omlx.scheduler as sched_mod source = inspect.getsource(sched_mod.Scheduler) # Find bare generation_stream references that aren't: # - _default_generation_stream (the import alias) # - Part of a larger word bare_refs = re.findall( r'(?