Expand nested case to include error prop and breakpointing
parent
f39414ce12
commit
c47575997a
|
@ -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()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue