You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.3 KiB
50 lines
1.3 KiB
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING
|
|
|
|
import trio
|
|
|
|
if TYPE_CHECKING:
|
|
import pytest
|
|
|
|
|
|
async def scheduler_trace() -> tuple[tuple[str, int], ...]:
|
|
"""Returns a scheduler-dependent value we can use to check determinism."""
|
|
trace = []
|
|
|
|
async def tracer(name: str) -> None:
|
|
for i in range(50):
|
|
trace.append((name, i))
|
|
await trio.sleep(0)
|
|
|
|
async with trio.open_nursery() as nursery:
|
|
for i in range(5):
|
|
nursery.start_soon(tracer, str(i))
|
|
|
|
return tuple(trace)
|
|
|
|
|
|
def test_the_trio_scheduler_is_not_deterministic() -> None:
|
|
# At least, not yet. See https://github.com/python-trio/trio/issues/32
|
|
traces = []
|
|
for _ in range(10):
|
|
traces.append(trio.run(scheduler_trace))
|
|
assert len(set(traces)) == len(traces)
|
|
|
|
|
|
def test_the_trio_scheduler_is_deterministic_if_seeded(
|
|
monkeypatch: pytest.MonkeyPatch,
|
|
) -> None:
|
|
monkeypatch.setattr(trio._core._run, "_ALLOW_DETERMINISTIC_SCHEDULING", True)
|
|
traces = []
|
|
for _ in range(10):
|
|
state = trio._core._run._r.getstate()
|
|
try:
|
|
trio._core._run._r.seed(0)
|
|
traces.append(trio.run(scheduler_trace))
|
|
finally:
|
|
trio._core._run._r.setstate(state)
|
|
|
|
assert len(traces) == 10
|
|
assert len(set(traces)) == 1
|