import eventlet from eventlet.green import subprocess import eventlet.patcher from nose.plugins.skip import SkipTest import sys import time original_subprocess = eventlet.patcher.original('subprocess') def test_subprocess_wait(): # https://bitbucket.org/eventlet/eventlet/issue/89 # In Python 3.3 subprocess.Popen.wait() method acquired `timeout` # argument. # RHEL backported it to their Python 2.6 package. cmd = [sys.executable, "-c", "import time; time.sleep(0.5)"] p = subprocess.Popen(cmd) ok = False t1 = time.time() try: p.wait(timeout=0.1) except subprocess.TimeoutExpired as e: str(e) # make sure it doesnt throw assert e.cmd == cmd assert e.timeout == 0.1 ok = True tdiff = time.time() - t1 assert ok, 'did not raise subprocess.TimeoutExpired' assert 0.1 <= tdiff <= 0.2, 'did not stop within allowed time' def test_communicate_with_poll(): # https://github.com/eventlet/eventlet/pull/24 # `eventlet.green.subprocess.Popen.communicate()` was broken # in Python 2.7 because the usage of the `select` module was moved from # `_communicate` into two other methods `_communicate_with_select` # and `_communicate_with_poll`. Link to 2.7's implementation: # http://hg.python.org/cpython/file/2145593d108d/Lib/subprocess.py#l1255 if getattr(original_subprocess.Popen, '_communicate_with_poll', None) is None: raise SkipTest('original subprocess.Popen does not have _communicate_with_poll') p = subprocess.Popen( [sys.executable, '-c', 'import time; time.sleep(0.5)'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) t1 = time.time() eventlet.with_timeout(0.1, p.communicate, timeout_value=True) tdiff = time.time() - t1 assert 0.1 <= tdiff <= 0.2, 'did not stop within allowed time'