''' That "native" runtime-hackin toolset better be dang useful! Verify the funtion of a variety of "developer-experience" tools we offer from the `.devx` sub-pkg: - use of the lovely `stackscope` for dumping actor `trio`-task trees during operation and hangs. TODO: - demonstration of `CallerInfo` call stack frame filtering such that for logging and REPL purposes a user sees exactly the layers needed when debugging a problem inside the stack vs. in their app. ''' import os import signal import time from .conftest import ( expect, assert_before, # in_prompt_msg, ) def test_shield_pause( spawn, ): ''' Verify the `tractor.pause()/.post_mortem()` API works inside an already cancelled `trio.CancelScope` and that you can step to the next checkpoint wherein the cancelled will get raised. ''' child = spawn( 'shield_hang_in_sub' ) expect( child, 'Yo my child hanging..?', ) assert_before( child, [ 'Entering shield sleep..', 'Enabling trace-trees on `SIGUSR1` since `stackscope` is installed @', ] ) script_pid: int = child.pid print( f'Sending SIGUSR1 to {script_pid}\n' f'(kill -s SIGUSR1 {script_pid})\n' ) os.kill( script_pid, signal.SIGUSR1, ) time.sleep(0.2) expect( child, # end-of-tree delimiter "end-of-\('root'", ) assert_before( child, [ # 'Srying to dump `stackscope` tree..', # 'Dumping `stackscope` tree for actor', "('root'", # uid line # TODO!? this used to show? # -[ ] mk reproducable for @oremanj? # # parent block point (non-shielded) # 'await trio.sleep_forever() # in root', ] ) expect( child, # end-of-tree delimiter "end-of-\('hanger'", ) assert_before( child, [ # relay to the sub should be reported 'Relaying `SIGUSR1`[10] to sub-actor', "('hanger'", # uid line # TODO!? SEE ABOVE # hanger LOC where it's shield-halted # 'await trio.sleep_forever() # in subactor', ] ) # simulate the user sending a ctl-c to the hanging program. # this should result in the terminator kicking in since # the sub is shield blocking and can't respond to SIGINT. os.kill( child.pid, signal.SIGINT, ) expect( child, 'Shutting down actor runtime', timeout=6, ) assert_before( child, [ 'raise KeyboardInterrupt', # 'Shutting down actor runtime', '#T-800 deployed to collect zombie B0', "'--uid', \"('hanger',", ] )