diff --git a/tests/test_debugger.py b/tests/test_debugger.py index 8b9220b..6f8d3a5 100644 --- a/tests/test_debugger.py +++ b/tests/test_debugger.py @@ -317,32 +317,58 @@ def test_multi_daemon_subactors(spawn, loglevel): next_msg = name_error_msg elif name_error_msg in before: - next_msg = None + next_msg = bp_forever_msg else: raise ValueError("Neither log msg was found !?") - child.sendline('c') + # NOTE: previously since we did not have clobber prevention + # in the root actor this final resume could result in the debugger + # tearing down since both child actors would be cancelled and it was + # unlikely that `bp_forever` would re-acquire the tty loack again. + # Now, we should have a final resumption in the root plus a possible + # second entry by `bp_forever`. - # first name_error failure + child.sendline('c') child.expect(r"\(Pdb\+\+\)") before = str(child.before.decode()) - if next_msg: - assert next_msg in before + assert next_msg in before - child.sendline('c') + # XXX: hoorayy the root clobering the child here was fixed! + # IMO, this demonstrates the true power of SC system design. - child.expect(r"\(Pdb\+\+\)") - before = str(child.before.decode()) - assert "tractor._exceptions.RemoteActorError: ('name_error'" in before + # now the root actor won't clobber the bp_forever child + # during it's first access to the debug lock, but will instead + # wait for the lock to release, by the edge triggered + # ``_debug._no_remote_has_tty`` event before sending cancel messages + # (via portals) to its underlings B) + + # at some point here there should have been some warning msg from + # the root announcing it avoided a clobber of the child's lock, but + # it seems unreliable in testing here to gnab it: + # assert "in use by child ('bp_forever'," in before + + # wait for final error in root + while True: + + child.sendline('c') + child.expect(r"\(Pdb\+\+\)") + before = str(child.before.decode()) + try: + + # root error should be packed as remote error + assert "_exceptions.RemoteActorError: ('name_error'" in before + break + + except AssertionError: + assert bp_forever_msg in before try: child.sendline('c') child.expect(pexpect.EOF) except pexpect.exceptions.TIMEOUT: - # Failed to exit using continue..? child.sendline('q') child.expect(pexpect.EOF) @@ -397,7 +423,7 @@ def test_multi_nested_subactors_error_through_nurseries(spawn): child = spawn('multi_nested_subactors_error_up_through_nurseries') # startup time can be iffy - time.sleep(1) + # time.sleep(1) for i in range(12): try: