Expand nested case to include error prop and breakpointing

eg_backup
Tyler Goodlet 2022-10-14 17:42:54 -04:00
parent f39414ce12
commit c47575997a
2 changed files with 44 additions and 14 deletions

View File

@ -12,18 +12,31 @@ async def breakpoint_forever():
while True: while True:
await tractor.breakpoint() await tractor.breakpoint()
# NOTE: if the test never sent 'q'/'quit' commands
# on the pdb repl, without this checkpoint line the
# repl would spin in this actor forever.
# await trio.sleep(0)
async def spawn_until(depth=0): async def spawn_until(depth=0):
""""A nested nursery that triggers another ``NameError``. """"A nested nursery that triggers another ``NameError``.
""" """
async with tractor.open_nursery() as n: async with tractor.open_nursery() as n:
if depth < 1: if depth < 1:
# await n.run_in_actor('breakpoint_forever', breakpoint_forever)
await n.run_in_actor( await n.run_in_actor(breakpoint_forever)
p = await n.run_in_actor(
name_error, name_error,
name='name_error' name='name_error'
) )
await trio.sleep(0.5)
# rx and propagate error from child
await p.result()
else: else:
# recusrive call to spawn another process branching layer of
# the tree
depth -= 1 depth -= 1
await n.run_in_actor( await n.run_in_actor(
spawn_until, spawn_until,
@ -53,6 +66,7 @@ async def main():
""" """
async with tractor.open_nursery( async with tractor.open_nursery(
debug_mode=True, debug_mode=True,
# loglevel='cancel',
) as n: ) as n:
# spawn both actors # spawn both actors
@ -67,8 +81,16 @@ async def main():
name='spawner1', name='spawner1',
) )
# TODO: test this case as well where the parent don't see
# the sub-actor errors by default and instead expect a user
# ctrl-c to kill the root.
with trio.move_on_after(3):
await trio.sleep_forever()
# gah still an issue here. # gah still an issue here.
await portal.result() await portal.result()
# should never get here
await portal1.result() await portal1.result()

View File

@ -10,6 +10,7 @@ TODO:
- wonder if any of it'll work on OS X? - wonder if any of it'll work on OS X?
""" """
import itertools
from os import path from os import path
from typing import Optional from typing import Optional
import platform import platform
@ -783,24 +784,31 @@ def test_multi_nested_subactors_error_through_nurseries(
timed_out_early: bool = False timed_out_early: bool = False
for i in range(12): for send_char in itertools.cycle(['c', 'q']):
try: try:
child.expect(r"\(Pdb\+\+\)") child.expect(r"\(Pdb\+\+\)")
child.sendline('c') child.sendline(send_char)
time.sleep(0.1) time.sleep(0.01)
except EOF: except EOF:
# race conditions on how fast the continue is sent?
print(f"Failed early on {i}?")
timed_out_early = True
break break
else:
child.expect(pexpect.EOF)
if not timed_out_early: assert_before(child, [
before = str(child.before.decode())
assert "NameError" in before # boxed source errors
"NameError: name 'doggypants' is not defined",
"tractor._exceptions.RemoteActorError: ('name_error'",
"bdb.BdbQuit",
# first level subtrees
"tractor._exceptions.RemoteActorError: ('spawner0'",
# "tractor._exceptions.RemoteActorError: ('spawner1'",
# propagation of errors up through nested subtrees
"tractor._exceptions.RemoteActorError: ('spawn_until_0'",
"tractor._exceptions.RemoteActorError: ('spawn_until_1'",
"tractor._exceptions.RemoteActorError: ('spawn_until_2'",
])
@pytest.mark.timeout(15) @pytest.mark.timeout(15)