Skip to content

Instantly share code, notes, and snippets.

@evanunderscore
Created January 19, 2017 08:50
Show Gist options
  • Save evanunderscore/1971d984fe6cb593a14e5e9c43227753 to your computer and use it in GitHub Desktop.
Save evanunderscore/1971d984fe6cb593a14e5e9c43227753 to your computer and use it in GitHub Desktop.
diff --git a/supervisor/tests/fixtures/hello.sh b/supervisor/tests/fixtures/hello.sh
new file mode 100644
index 0000000..4f3aafd
--- /dev/null
+++ b/supervisor/tests/fixtures/hello.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+n=0
+while :; do
+ let n=n+1
+ echo "The Øresund bridge ends in Malmö - $n"
+ sleep 1;
+done
diff --git a/supervisor/tests/fixtures/issue-565.conf b/supervisor/tests/fixtures/issue-565.conf
new file mode 100644
index 0000000..4ad290a
--- /dev/null
+++ b/supervisor/tests/fixtures/issue-565.conf
@@ -0,0 +1,22 @@
+[supervisord]
+loglevel=info ; log level; default info; others: debug,warn,trace
+logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
+pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
+nodaemon=true ; start in foreground if true; default false
+
+[rpcinterface:supervisor]
+supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
+
+[unix_http_server]
+file=/tmp/supervisor.sock ; the path to the socket file
+
+[supervisorctl]
+serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
+
+[program:hello]
+command=bash supervisor/tests/fixtures/hello.sh
+stdout_events_enabled=true
+
+[eventlistener:listener]
+command=python supervisor/tests/fixtures/listener.py
+events=PROCESS_LOG
diff --git a/supervisor/tests/fixtures/listener.py b/supervisor/tests/fixtures/listener.py
new file mode 100644
index 0000000..f69915c
--- /dev/null
+++ b/supervisor/tests/fixtures/listener.py
@@ -0,0 +1,38 @@
+
+import sys
+
+def write_and_flush(stream, s):
+ stream.write(s)
+ stream.flush()
+
+def write_stdout(s):
+ # only eventlistener protocol messages may be sent to stdout
+ sys.stdout.write(s)
+ sys.stdout.flush()
+
+def write_stderr(s):
+ sys.stderr.write(s)
+ sys.stderr.flush()
+
+def main():
+ stdin = sys.stdin
+ stdout = sys.stdout
+ stderr = sys.stderr
+ while True:
+ # transition from ACKNOWLEDGED to READY
+ write_and_flush(stdout, 'READY\n')
+
+ # read header line and print it to stderr
+ line = stdin.readline()
+ write_and_flush(stderr, line)
+
+ # read event payload and print it to stderr
+ headers = dict([ x.split(':') for x in line.split() ])
+ data = stdin.read(int(headers['len']))
+ write_and_flush(stderr, data)
+
+ # transition from READY to ACKNOWLEDGED
+ write_and_flush(stdout, 'RESULT 2\nOK')
+
+if __name__ == '__main__':
+ main()
diff --git a/supervisor/tests/test_end_to_end.py b/supervisor/tests/test_end_to_end.py
new file mode 100644
index 0000000..9e8f479
--- /dev/null
+++ b/supervisor/tests/test_end_to_end.py
@@ -0,0 +1,25 @@
+# ~*~ coding: utf-8 ~*~
+from __future__ import unicode_literals
+
+import sys
+import unittest
+
+import pexpect
+
+
+class TestEndToEnd(unittest.TestCase):
+ def test_issue_565(self):
+ args = '-m supervisor.supervisord -c supervisor/tests/fixtures/issue-565.conf'.split()
+ supervisord = pexpect.spawn(sys.executable, args, encoding='utf-8')
+ supervisord.expect_exact('success: hello entered RUNNING state')
+
+ args = '-m supervisor.supervisorctl -c supervisor/tests/fixtures/issue-565.conf tail -f hello'.split()
+ supervisorctl = pexpect.spawn(sys.executable, args, encoding='utf-8')
+
+ for i in range(1, 4):
+ line = 'The Øresund bridge ends in Malmö - {}'.format(i)
+ supervisorctl.expect_exact(line, timeout=2)
+
+
+if __name__ == '__main__':
+ unittest.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment