forked from goodboy/tractor
				
			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