summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@digital-scurf.org>2020-01-10 22:18:48 +0000
committerDaniel Silverstone <dsilvers@digital-scurf.org>2020-01-10 22:21:17 +0000
commita29ed7c0832bd0c210885d5ec3730bcbc4469259 (patch)
tree97d72f135e6236e296f4583e8201f305850127fd /test
parentccffb95f03f1710ecfa2d1b9a20a28ba94d08290 (diff)
downloadnetsurf-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.py46
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""