swactor/crates/bindings/python/tests/probe.py

43 lines
1.1 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
"""L3 probe for the bootstrap slice.
Runs under ``swactor.run`` and reports facts observable without any
data-plane primitives: context shape, wake readability, and descriptor
hygiene across an exec boundary.
"""
from __future__ import annotations
import os
import select
import subprocess
import sys
import swactor
_CHILD_CHECK = (
"import os, sys; "
"sys.exit(0 if sys.argv[1] not in os.listdir('/proc/self/fd') else 3)"
)
async def main(ctx: swactor.Context) -> None:
facts = [f"HAS_DATA={int(isinstance(ctx.data, swactor.DataPlane))}"]
wake = int(os.environ["SWACTOR_WAKE_FD"])
readable = bool(select.select([wake], [], [], 0)[0])
facts.append(f"WAKE_READABLE={int(readable)}")
# B5: a close_fds=False child must not see the CLOEXEC-armed wake fd.
child = subprocess.Popen(
[sys.executable, "-c", _CHILD_CHECK, str(wake)],
close_fds=False,
)
child.wait()
facts.append(f"WAKE_LEAKED={int(child.returncode == 3)}")
print(" ".join(facts))
if __name__ == "__main__":
swactor.run(main)