tractor/tests
Gud Boi 2335a85432 Add trio-parent tests for `_subint_forkserver`
New pytest module `tests/spawn/test_subint_forkserver.py`
drives the forkserver primitives from inside a real
`trio.run()` in the parent — the runtime shape tractor will
actually use when we wire up a `subint_forkserver` spawn
backend proper. Complements the standalone no-trio-in-parent
`ai/conc-anal/subint_fork_from_main_thread_smoketest.py`.

Deats,
- new test pkg `tests/spawn/` (+ empty `__init__.py`)
- two tests, both `@pytest.mark.timeout(30, method='thread')`
  for the GIL-hostage safety reason doc'd in
  `ai/conc-anal/subint_sigint_starvation_issue.md`:
  - `test_fork_from_worker_thread_via_trio` — parent-side
    plumbing baseline. `trio.run()` off-loads forkserver
    prims via `trio.to_thread.run_sync()` + asserts the
    child reaps cleanly
  - `test_fork_and_run_trio_in_child` — end-to-end: forked
    child calls `run_subint_in_worker_thread()` with a
    bootstrap str that does `trio.run()` in a fresh subint
- both tests wrap the inner `trio.run()` in a
  `dump_on_hang()` for post-mortem if the outer
  `pytest-timeout` fires
- intentionally NOT using `--spawn-backend` — the tests
  drive the primitives directly rather than going through
  tractor's spawn-method registry (which the forkserver
  isn't plugged into yet)

Also, rename `run_trio_in_subint()` →
`run_subint_in_worker_thread()` for naming consistency with
the sibling `fork_from_worker_thread()`. The action is really
"host a subint on a worker thread", not specifically "run
trio" — trio just happens to be the typical payload.
Propagate the rename to the smoketest.

Further, add a "TODO — cleanup gated on msgspec PEP 684
support" section to the `_subint_forkserver` module
docstring: flags the dedicated-`threading.Thread` design as
potentially-revisable once isolated-mode subints are viable
in tractor. Cross-refs `msgspec#563` + `tractor#379` and
points at an audit-plan conc-anal doc we'll add next.

(this patch was generated in some part by [`claude-code`][claude-code-gh])
[claude-code-gh]: https://github.com/anthropics/claude-code

(cherry picked from commit 25e400d526)
2026-06-24 23:32:29 -04:00
..
devx Strip ANSI + accept `_create(...)` in devx tests 2026-06-24 18:19:16 -04:00
discovery Add boot-race conc-anal, widen `xfail` to `n_dups=8` 2026-06-17 17:39:44 -04:00
ipc Add `enable_transports`/`registry_addrs` proto guard 2026-06-17 17:39:44 -04:00
msg Add `set_fork_aware_capture`, timeout to msg tests 2026-06-17 17:39:44 -04:00
spawn Add trio-parent tests for `_subint_forkserver` 2026-06-24 23:32:29 -04:00
trionics Skip `test_parent_tty_isolated` off-Linux (`/proc`-only) 2026-06-24 18:19:16 -04:00
__init__.py Add `tests/__init__.py` for `.conftest` imports 2025-03-20 20:53:54 -04:00
conftest.py Give macOS CI extra headroom for cancel-cascade tests 2026-06-18 14:54:07 -04:00
test_2way.py Tidy a typing-typo, add explicit `ids=` for paramed suites 2026-03-09 19:35:47 -04:00
test_advanced_faults.py Revert advanced-fault UDS edge case handling 2026-03-13 21:10:52 -04:00
test_advanced_streaming.py Use trace CM helpers in `test_dynamic_pub_sub` 2026-06-17 17:39:44 -04:00
test_cancellation.py Give macOS CI extra headroom for cancel-cascade tests 2026-06-18 14:54:07 -04:00
test_child_manages_service_nursery.py Swap `open_channel_from()` to yield `(chan, first)` 2026-03-13 19:28:57 -04:00
test_clustering.py Adjust `test_streaming_to_actor_cluster` timeout 2026-06-17 17:39:44 -04:00
test_context_stream_semantics.py Fix `test_simple_context` for `trio>=0.33` groups 2026-06-24 18:19:16 -04:00
test_docs_examples.py Move `get_cpu_state()` to `conftest` as shared latency headroom 2026-04-02 17:59:13 -04:00
test_infected_asyncio.py Bump trio `echoserver` cancel timeout 1→4s 2026-06-17 17:39:44 -04:00
test_inter_peer_cancellation.py Enrich `pytestmark` in `test_inter_peer_cancellation` 2026-06-17 17:39:44 -04:00
test_legacy_one_way_streaming.py Make `cpu_scaling_factor()` CI-aware for timing tests 2026-06-18 12:03:30 -04:00
test_local.py Address Copilot review nits on PR #461 (round 2) 2026-06-17 17:16:36 -04:00
test_log_sys.py Add `add_log_level()` factory + register `IO`=21 2026-06-24 16:20:50 -04:00
test_oob_cancellation.py Woops, fix missing `assert` thanks to copilot 2025-09-11 13:13:18 -04:00
test_pubsub.py Mark `subint`-hanging tests with `skipon_spawn_backend` 2026-06-17 17:39:44 -04:00
test_reg_err_types.py Drop stale `.cancel()`, fix docstring typo in tests 2026-04-02 18:21:19 -04:00
test_remote_exc_relay.py Adjust ep-masking-suite for the real-use-case 2025-07-15 07:23:21 -04:00
test_resource_cache.py Scale `test_open_local_sub_to_stream` timeout by CPU factor 2026-04-16 20:03:32 -04:00
test_ringbuf.py Handle py3.14+ incompats as test skips 2026-06-17 17:39:44 -04:00
test_root_infect_asyncio.py Swap `open_channel_from()` to yield `(chan, first)` 2026-03-13 19:28:57 -04:00
test_root_runtime.py Update tests+examples imports for new subpkgs 2026-04-02 17:59:13 -04:00
test_rpc.py Rename `Arbiter` -> `Registrar`, mv to `discovery._registry` 2026-04-02 17:59:13 -04:00
test_runtime.py Repair lifetime-stack suite's flakiness 2026-03-13 21:10:52 -04:00
test_shm.py Sweep `subint_forkserver` → `main_thread_forkserver` in code 2026-06-17 17:39:44 -04:00
test_spawning.py Scale `test_most_beautiful_word` deadline for CI 2026-06-24 18:19:16 -04:00
test_subint_cancellation.py Wall-cap `subint` audit tests via `pytest-timeout` 2026-06-24 23:32:28 -04:00
test_task_broadcasting.py Tweak timeouts and rm `arbiter_addr` in tests 2026-04-14 19:54:14 -04:00
test_trioisms.py Tweaks from copilot, type fix, typos, language. 2025-09-11 10:01:25 -04:00