diff options
Diffstat (limited to 'tests/isolated')
| -rw-r--r-- | tests/isolated/hub_fork.py | 33 | ||||
| -rw-r--r-- | tests/isolated/hub_fork_simple.py | 58 |
2 files changed, 91 insertions, 0 deletions
diff --git a/tests/isolated/hub_fork.py b/tests/isolated/hub_fork.py new file mode 100644 index 0000000..1872942 --- /dev/null +++ b/tests/isolated/hub_fork.py @@ -0,0 +1,33 @@ +# verify eventlet.listen() accepts in forked children +__test__ = False + +if __name__ == '__main__': + import os + import sys + import eventlet + + server = eventlet.listen(('127.0.0.1', 0)) + result = eventlet.with_timeout(0.01, server.accept, timeout_value=True) + assert result is True, 'Expected timeout' + + pid = os.fork() + if pid < 0: + print('fork error') + sys.exit(1) + elif pid == 0: + with eventlet.Timeout(1): + sock, _ = server.accept() + sock.sendall('ok {0}'.format(os.getpid()).encode()) + sock.close() + sys.exit(0) + elif pid > 0: + with eventlet.Timeout(1): + sock = eventlet.connect(server.getsockname()) + data = sock.recv(20).decode() + assert data.startswith('ok ') + spid = int(data[3:].strip()) + assert spid == pid + kpid, status = os.wait() + assert kpid == pid + assert status == 0 + print('pass') diff --git a/tests/isolated/hub_fork_simple.py b/tests/isolated/hub_fork_simple.py new file mode 100644 index 0000000..96389de --- /dev/null +++ b/tests/isolated/hub_fork_simple.py @@ -0,0 +1,58 @@ +import os +import signal +import sys +import tempfile +__test__ = False + + +def parent(signal_path, pid): + eventlet.Timeout(5) + port = None + while True: + try: + contents = open(signal_path, 'rb').read() + port = int(contents.strip()) + break + except Exception: + eventlet.sleep(0.1) + eventlet.connect(('127.0.0.1', port)) + while True: + try: + contents = open(signal_path, 'rb').read() + result = contents.split()[1] + break + except Exception: + eventlet.sleep(0.1) + assert result == b'done', repr(result) + print('pass') + + +def child(signal_path): + eventlet.Timeout(5) + s = eventlet.listen(('127.0.0.1', 0)) + with open(signal_path, 'wb') as f: + f.write(str(s.getsockname()[1]).encode() + b'\n') + f.flush() + s.accept() + f.write(b'done\n') + f.flush() + + +if __name__ == '__main__': + import eventlet + + with tempfile.NamedTemporaryFile() as signal_file: + signal_path = signal_file.name + + pid = os.fork() + if pid < 0: + sys.stderr.write('fork error\n') + sys.exit(1) + elif pid == 0: + child(signal_path) + sys.exit(0) + elif pid > 0: + try: + parent(signal_path, pid) + except Exception: + os.kill(pid, signal.SIGTERM) |
