From a29ed7c0832bd0c210885d5ec3730bcbc4469259 Mon Sep 17 00:00:00 2001 From: Daniel Silverstone Date: Fri, 10 Jan 2020 22:18:48 +0000 Subject: monkeyfarmer.py: Ensure that we capture and repeat stderr In order that we can process stderr in monkey-see-monkey-do we need to capture it in the farmer and re-echo it through Python's stderr object Signed-off-by: Daniel Silverstone --- test/monkeyfarmer.py | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) (limited to 'test') diff --git a/test/monkeyfarmer.py b/test/monkeyfarmer.py index 4dfc41a30..e5e639780 100644 --- a/test/monkeyfarmer.py +++ b/test/monkeyfarmer.py @@ -32,6 +32,44 @@ import socket import subprocess import time import errno +import sys + +class StderrEcho(asyncore.dispatcher): + def __init__(self, sockend): + asyncore.dispatcher.__init__(self, sock=sockend) + self.incoming = b"" + + def handle_connect(self): + pass + + def handle_close(self): + # the pipe to the monkey process has closed + self.close() + + def handle_read(self): + try: + got = self.recv(8192) + if not got: + return + except socket.error as error: + if error.errno == errno.EAGAIN or error.errno == errno.EWOULDBLOCK: + return + else: + raise + + self.incoming += got + if b"\n" in self.incoming: + lines = self.incoming.split(b"\n") + self.incoming = lines.pop() + for line in lines: + try: + line = line.decode('utf-8') + except UnicodeDecodeError: + print("WARNING: Unicode decode error") + line = line.decode('utf-8', 'replace') + + sys.stderr.write("{}\n".format(line)) + class MonkeyFarmer(asyncore.dispatcher): @@ -42,6 +80,10 @@ class MonkeyFarmer(asyncore.dispatcher): asyncore.dispatcher.__init__(self, sock=mine) + (mine2, monkeyserr) = socket.socketpair() + + self._errwrapper = StderrEcho(mine2) + if wrapper is not None: new_cmd = list(wrapper) new_cmd.extend(monkey_cmd) @@ -51,9 +93,11 @@ class MonkeyFarmer(asyncore.dispatcher): monkey_cmd, stdin=monkeys, stdout=monkeys, - close_fds=[mine]) + stderr=monkeyserr, + close_fds=[mine, mine2]) monkeys.close() + monkeyserr.close() self.buffer = b"" self.incoming = b"" -- cgit v1.2.3