On Sat, Jan 18, 2020 at 8:16 PM Philippe Mathieu-Daudé <f4...@amsat.org> wrote:
> We need a function to interrupt interactive consoles. > > Example: Interrupt U-Boot to set different environment values. > > Signed-off-by: Philippe Mathieu-Daudé <f4...@amsat.org> > Tested-by: Niek Linnenbank <nieklinnenb...@gmail.com> > --- > tests/acceptance/avocado_qemu/__init__.py | 32 +++++++++++++++++++++-- > 1 file changed, 30 insertions(+), 2 deletions(-) > > diff --git a/tests/acceptance/avocado_qemu/__init__.py > b/tests/acceptance/avocado_qemu/__init__.py > index 0a50fcf2be..d4358eb431 100644 > --- a/tests/acceptance/avocado_qemu/__init__.py > +++ b/tests/acceptance/avocado_qemu/__init__.py > @@ -56,13 +56,15 @@ def pick_default_qemu_bin(arch=None): > > > def _console_interaction(test, success_message, failure_message, > - send_string): > + send_string, keep_sending=False): > + assert not keep_sending or send_string > console = test.vm.console_socket.makefile() > console_logger = logging.getLogger('console') > while True: > if send_string: > test.vm.console_socket.sendall(send_string.encode()) > - send_string = None # send only once > + if not keep_sending: > + send_string = None # send only once > msg = console.readline().strip() > if not msg: > continue > @@ -74,6 +76,32 @@ def _console_interaction(test, success_message, > failure_message, > fail = 'Failure message found in console: %s' % > failure_message > test.fail(fail) > > +def interrupt_interactive_console_until_pattern(test, success_message, > + failure_message=None, > + interrupt_string='\r'): > + """ > + Keep sending a string to interrupt a console prompt, while logging the > + console output. Typical use case is to break a boot loader prompt, > such: > + > + Press a key within 5 seconds to interrupt boot process. > + 5 > + 4 > + 3 > + 2 > + 1 > + Booting default image... > + > + :param test: an Avocado test containing a VM that will have its > console > + read and probed for a success or failure message > + :type test: :class:`avocado_qemu.Test` > + :param success_message: if this message appears, test succeeds > + :param failure_message: if this message appears, test fails > + :param interrupt_string: a string to send to the console before trying > + to read a new line > + """ > + _console_interaction(test, success_message, failure_message, > + interrupt_string, True) > + > def wait_for_console_pattern(test, success_message, failure_message=None): > """ > Waits for messages to appear on the console, while logging the content > -- > 2.21.1 > > -- Niek Linnenbank