Add basic ctl-c testing cases to suite
parent
18c525d2f1
commit
439d320a25
|
@ -1,5 +1,5 @@
|
||||||
"""
|
"""
|
||||||
That native debug better work!
|
That "native" debug mode better work!
|
||||||
|
|
||||||
All these tests can be understood (somewhat) by running the equivalent
|
All these tests can be understood (somewhat) by running the equivalent
|
||||||
`examples/debugging/` scripts manually.
|
`examples/debugging/` scripts manually.
|
||||||
|
@ -13,6 +13,7 @@ TODO:
|
||||||
import time
|
import time
|
||||||
from os import path
|
from os import path
|
||||||
import platform
|
import platform
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
import pexpect
|
import pexpect
|
||||||
|
@ -73,6 +74,14 @@ def spawn(
|
||||||
return _spawn
|
return _spawn
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(
|
||||||
|
params=[False, True],
|
||||||
|
ids='ctl-c={}'.format,
|
||||||
|
)
|
||||||
|
def ctlc(request) -> bool:
|
||||||
|
yield request.param
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
'user_in_out',
|
'user_in_out',
|
||||||
[
|
[
|
||||||
|
@ -137,20 +146,50 @@ def test_root_actor_bp(spawn, user_in_out):
|
||||||
assert expect_err_str in str(child.before)
|
assert expect_err_str in str(child.before)
|
||||||
|
|
||||||
|
|
||||||
def test_root_actor_bp_forever(spawn):
|
def do_ctlc(
|
||||||
|
child,
|
||||||
|
count: int = 3,
|
||||||
|
patt: Optional[str] = None,
|
||||||
|
|
||||||
|
) -> None:
|
||||||
|
|
||||||
|
# make sure ctl-c sends don't do anything but repeat output
|
||||||
|
for _ in range(count):
|
||||||
|
child.sendcontrol('c')
|
||||||
|
child.expect(r"\(Pdb\+\+\)")
|
||||||
|
|
||||||
|
if patt:
|
||||||
|
# should see the last line on console
|
||||||
|
before = str(child.before.decode())
|
||||||
|
assert patt in before
|
||||||
|
|
||||||
|
|
||||||
|
def test_root_actor_bp_forever(
|
||||||
|
spawn,
|
||||||
|
ctlc: bool,
|
||||||
|
):
|
||||||
"Re-enter a breakpoint from the root actor-task."
|
"Re-enter a breakpoint from the root actor-task."
|
||||||
child = spawn('root_actor_breakpoint_forever')
|
child = spawn('root_actor_breakpoint_forever')
|
||||||
|
|
||||||
# do some "next" commands to demonstrate recurrent breakpoint
|
# do some "next" commands to demonstrate recurrent breakpoint
|
||||||
# entries
|
# entries
|
||||||
for _ in range(10):
|
for _ in range(10):
|
||||||
child.sendline('next')
|
|
||||||
child.expect(r"\(Pdb\+\+\)")
|
child.expect(r"\(Pdb\+\+\)")
|
||||||
|
|
||||||
# do one continue which should trigger a new task to lock the tty
|
if ctlc:
|
||||||
|
do_ctlc(child)
|
||||||
|
|
||||||
|
child.sendline('next')
|
||||||
|
|
||||||
|
# do one continue which should trigger a
|
||||||
|
# new task to lock the tty
|
||||||
child.sendline('continue')
|
child.sendline('continue')
|
||||||
child.expect(r"\(Pdb\+\+\)")
|
child.expect(r"\(Pdb\+\+\)")
|
||||||
|
|
||||||
|
if ctlc:
|
||||||
|
do_ctlc(child)
|
||||||
|
|
||||||
# XXX: this previously caused a bug!
|
# XXX: this previously caused a bug!
|
||||||
child.sendline('n')
|
child.sendline('n')
|
||||||
child.expect(r"\(Pdb\+\+\)")
|
child.expect(r"\(Pdb\+\+\)")
|
||||||
|
@ -158,8 +197,15 @@ def test_root_actor_bp_forever(spawn):
|
||||||
child.sendline('n')
|
child.sendline('n')
|
||||||
child.expect(r"\(Pdb\+\+\)")
|
child.expect(r"\(Pdb\+\+\)")
|
||||||
|
|
||||||
|
# quit out of the loop
|
||||||
|
child.sendline('q')
|
||||||
|
child.expect(pexpect.EOF)
|
||||||
|
|
||||||
def test_subactor_error(spawn):
|
|
||||||
|
def test_subactor_error(
|
||||||
|
spawn,
|
||||||
|
ctlc: bool,
|
||||||
|
):
|
||||||
"Single subactor raising an error"
|
"Single subactor raising an error"
|
||||||
|
|
||||||
child = spawn('subactor_error')
|
child = spawn('subactor_error')
|
||||||
|
@ -170,23 +216,29 @@ def test_subactor_error(spawn):
|
||||||
before = str(child.before.decode())
|
before = str(child.before.decode())
|
||||||
assert "Attaching to pdb in crashed actor: ('name_error'" in before
|
assert "Attaching to pdb in crashed actor: ('name_error'" in before
|
||||||
|
|
||||||
# send user command
|
# make sure ctl-c sends don't do anything but repeat output
|
||||||
# (in this case it's the same for 'continue' vs. 'quit')
|
if ctlc:
|
||||||
child.sendline('continue')
|
do_ctlc(
|
||||||
|
child,
|
||||||
|
patt='(doggypants)',
|
||||||
|
)
|
||||||
|
|
||||||
# the debugger should enter a second time in the nursery
|
# send user command and (in this case it's the same for 'continue'
|
||||||
|
# vs. 'quit') the debugger should enter a second time in the nursery
|
||||||
# creating actor
|
# creating actor
|
||||||
|
child.sendline('continue')
|
||||||
child.expect(r"\(Pdb\+\+\)")
|
child.expect(r"\(Pdb\+\+\)")
|
||||||
|
|
||||||
before = str(child.before.decode())
|
before = str(child.before.decode())
|
||||||
|
|
||||||
# root actor gets debugger engaged
|
# root actor gets debugger engaged
|
||||||
assert "Attaching to pdb in crashed actor: ('root'" in before
|
assert "Attaching to pdb in crashed actor: ('root'" in before
|
||||||
|
|
||||||
# error is a remote error propagated from the subactor
|
# error is a remote error propagated from the subactor
|
||||||
assert "RemoteActorError: ('name_error'" in before
|
assert "RemoteActorError: ('name_error'" in before
|
||||||
|
|
||||||
|
# another round
|
||||||
|
if ctlc:
|
||||||
|
do_ctlc(child)
|
||||||
|
|
||||||
child.sendline('c')
|
child.sendline('c')
|
||||||
child.expect('\r\n')
|
child.expect('\r\n')
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue