diff options
author | Daniel Silverstone <dsilvers@digital-scurf.org> | 2020-01-10 22:18:48 +0000 |
---|---|---|
committer | Daniel Silverstone <dsilvers@digital-scurf.org> | 2020-01-10 22:21:17 +0000 |
commit | a29ed7c0832bd0c210885d5ec3730bcbc4469259 (patch) | |
tree | 97d72f135e6236e296f4583e8201f305850127fd /test | |
parent | ccffb95f03f1710ecfa2d1b9a20a28ba94d08290 (diff) | |
download | netsurf-a29ed7c0832bd0c210885d5ec3730bcbc4469259.tar.gz netsurf-a29ed7c0832bd0c210885d5ec3730bcbc4469259.tar.bz2 |
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 <dsilvers@digital-scurf.org>
Diffstat (limited to 'test')
-rw-r--r-- | test/monkeyfarmer.py | 46 |
1 files changed, 45 insertions, 1 deletions
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"" |