qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Philippe Mathieu-Daudé" <philmd@linaro.org>
To: "Alex Bennée" <alex.bennee@linaro.org>,
	qemu-devel@nongnu.org, "John Snow" <jsnow@redhat.com>
Cc: fam@euphon.net, berrange@redhat.com, f4bug@amsat.org,
	aurelien@aurel32.net, pbonzini@redhat.com, stefanha@redhat.com,
	crosa@redhat.com,
	Wainer dos Santos Moschetta <wainersm@redhat.com>,
	Beraldo Leal <bleal@redhat.com>
Subject: Re: [PATCH v1 2/9] tests/avocado: improve behaviour waiting for login prompts
Date: Tue, 8 Nov 2022 12:23:01 +0100	[thread overview]
Message-ID: <327206ba-d7da-dacf-4f52-dcb5cee3cfc7@linaro.org> (raw)
In-Reply-To: <20221108092308.1717426-3-alex.bennee@linaro.org>

On 8/11/22 10:23, Alex Bennée wrote:
> This attempts to deal with the problem of login prompts not being
> guaranteed to be terminated with a newline. The solution to this is to
> peek at the incoming data looking to see if we see an up-coming match
> before we fall back to the old readline() logic. The reason to mostly
> rely on readline is because I am occasionally seeing the peek stalling
> despite data being there.
> 
> This seems kinda hacky and gross so I'm open to alternative approaches
> and cleaner python code.

I'd have done it the same way...

> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
>   tests/avocado/avocado_qemu/__init__.py | 89 +++++++++++++++++++++++++-
>   1 file changed, 88 insertions(+), 1 deletion(-)
> 
> diff --git a/tests/avocado/avocado_qemu/__init__.py b/tests/avocado/avocado_qemu/__init__.py
> index 910f3ba1ea..d6ff68e171 100644
> --- a/tests/avocado/avocado_qemu/__init__.py
> +++ b/tests/avocado/avocado_qemu/__init__.py
> @@ -131,6 +131,58 @@ def pick_default_qemu_bin(bin_prefix='qemu-system-', arch=None):
>               return path
>       return None
>   
> +def _peek_ahead(console, min_match, success_message):
> +    """
> +    peek ahead in the console stream keeping an eye out for the
> +    success message.
> +
> +    Returns some message to process or None, indicating the normal
> +    readline should occur.
> +    """
> +    console_logger = logging.getLogger('console')
> +    peek_len = 0
> +    retries = 0
> +
> +    while True:
> +        try:
> +            old_peek_len = peek_len
> +            peek_ahead = console.peek(min_match).decode()
> +            peek_len = len(peek_ahead)
> +
> +            # if we get stuck too long lets just fallback to readline
> +            if peek_len <= old_peek_len:
> +                retries += 1
> +                if retries > 10:
> +                    return None
> +
> +            # if we see a newline in the peek we can let safely bail
> +            # and let the normal readline() deal with it
> +            if peek_ahead.endswith(('\n', '\r', '\r\n')):

'\r\n' superfluous.

> +                return None
> +
> +            # if we haven't seen enough for the whole message but the
> +            # first part matches lets just loop again
> +            if len(peek_ahead) < min_match and \
> +               success_message[:peek_len] in peek_ahead:
> +                continue
> +
> +            # if we see the whole success_message we are done, consume
> +            # it and pass back so we can exit to the user
> +            if success_message in peek_ahead:
> +                return console.read(peek_len).decode()
> +
> +            # of course if we've seen enough then this line probably
> +            # doesn't contain what we are looking for, fallback
> +            if peek_len > min_match:
> +                return None
> +
> +        except UnicodeDecodeError:
> +            console_logger.log("error in decode of peek")
> +            return None
> +
> +    # we should never get here
> +    return None

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



  reply	other threads:[~2022-11-08 11:23 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-08  9:22 [PATCH v1 for 7.2 0/9] test and doc updates Alex Bennée
2022-11-08  9:23 ` [PATCH v1 1/9] Run docker probe only if docker or podman are available Alex Bennée
2022-11-08  9:23 ` [PATCH v1 2/9] tests/avocado: improve behaviour waiting for login prompts Alex Bennée
2022-11-08 11:23   ` Philippe Mathieu-Daudé [this message]
2022-11-08 21:19   ` John Snow
2022-11-08  9:23 ` [PATCH v1 3/9] tests/avocado/machine_aspeed.py: Reduce noise on the console for SDK tests Alex Bennée
2022-11-08  9:23 ` [PATCH v1 4/9] tests/docker: allow user to override check target Alex Bennée
2022-11-08 11:12   ` Philippe Mathieu-Daudé
2022-11-08  9:23 ` [PATCH v1 5/9] hw/virtio: introduce virtio_device_should_start Alex Bennée
2022-11-08  9:32   ` Michael S. Tsirkin
2022-11-08 10:23     ` Alex Bennée
2022-11-08 10:26       ` Michael S. Tsirkin
2022-11-08 11:21         ` Alex Bennée
2022-11-08 15:24           ` Michael S. Tsirkin
2022-11-08 16:41             ` Alex Bennée
2022-11-08  9:33   ` Michael S. Tsirkin
2022-11-14 16:18   ` Christian Borntraeger
2022-11-14 16:37     ` Michael S. Tsirkin
2022-11-14 16:55       ` Christian Borntraeger
2022-11-14 17:10         ` Michael S. Tsirkin
2022-11-14 17:15           ` Christian Borntraeger
2022-11-14 17:20             ` Michael S. Tsirkin
2022-11-15  7:44               ` Christian Borntraeger
2022-11-15  8:18               ` Christian Borntraeger
2022-11-15  9:05                 ` Michael S. Tsirkin
2022-11-15 11:25                 ` Michael S. Tsirkin
2022-11-15 13:25                   ` Christian Borntraeger
2022-11-15 14:31               ` Alex Bennée
2022-11-15 15:09                 ` Christian Borntraeger
2022-11-15 16:05                   ` Alex Bennée
2022-11-15 16:40                     ` Christian Borntraeger
2022-11-15 16:46                       ` Christian Borntraeger
2022-11-21 22:37                         ` Michael S. Tsirkin
2022-11-23  6:27                           ` Christian Borntraeger
2022-11-14 16:43     ` Alex Bennée
2022-11-08  9:23 ` [PATCH v1 6/9] docs/devel: add a maintainers section to development process Alex Bennée
2022-11-08  9:23 ` [PATCH v1 7/9] docs/devel: make language a little less code centric Alex Bennée
2022-11-08  9:23 ` [PATCH v1 8/9] docs/devel: simplify the minimal checklist Alex Bennée
2022-11-08  9:23 ` [PATCH v1 9/9] docs/devel: try and improve the language around patch review Alex Bennée

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=327206ba-d7da-dacf-4f52-dcb5cee3cfc7@linaro.org \
    --to=philmd@linaro.org \
    --cc=alex.bennee@linaro.org \
    --cc=aurelien@aurel32.net \
    --cc=berrange@redhat.com \
    --cc=bleal@redhat.com \
    --cc=crosa@redhat.com \
    --cc=f4bug@amsat.org \
    --cc=fam@euphon.net \
    --cc=jsnow@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    --cc=wainersm@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).