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')):
+ 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