Refactor capturing stderr into a context manager

This commit is contained in:
Jakub Stasiak
2014-10-15 23:58:18 +01:00
parent 2758226b9b
commit e7b08cf398
3 changed files with 22 additions and 20 deletions

View File

@@ -1,6 +1,7 @@
import sys import sys
from contextlib import contextmanager
from eventlet.support import greenlets from eventlet.support import greenlets, six
def get_errno(exc): def get_errno(exc):
@@ -41,3 +42,14 @@ else:
return b.decode(encoding) return b.decode(encoding)
PY33 = sys.version_info[:2] == (3, 3) PY33 = sys.version_info[:2] == (3, 3)
@contextmanager
def capture_stderr():
stream = six.StringIO()
original = sys.stderr
try:
sys.stderr = stream
yield stream
finally:
sys.stderr = original
stream.seek(0)

View File

@@ -2,7 +2,7 @@ import sys
from unittest import TestCase from unittest import TestCase
from eventlet import debug from eventlet import debug
from eventlet.support import six from eventlet.support import capture_stderr, six
from tests import LimitedTestCase, main from tests import LimitedTestCase, main
import eventlet import eventlet
@@ -107,10 +107,7 @@ class TestDebug(LimitedTestCase):
s.recv(1) s.recv(1)
{}[1] # keyerror {}[1] # keyerror
fake = six.StringIO() with capture_stderr() as fake:
orig = sys.stderr
sys.stderr = fake
try:
gt = eventlet.spawn(hurl, client_2) gt = eventlet.spawn(hurl, client_2)
eventlet.sleep(0) eventlet.sleep(0)
client.send(b' ') client.send(b' ')
@@ -118,10 +115,8 @@ class TestDebug(LimitedTestCase):
# allow the "hurl" greenlet to trigger the KeyError # allow the "hurl" greenlet to trigger the KeyError
# not sure why the extra context switch is needed # not sure why the extra context switch is needed
eventlet.sleep(0) eventlet.sleep(0)
finally: self.assertRaises(KeyError, gt.wait)
sys.stderr = orig debug.hub_exceptions(False)
self.assertRaises(KeyError, gt.wait)
debug.hub_exceptions(False)
# look for the KeyError exception in the traceback # look for the KeyError exception in the traceback
assert 'KeyError: 1' in fake.getvalue(), "Traceback not in:\n" + fake.getvalue() assert 'KeyError: 1' in fake.getvalue(), "Traceback not in:\n" + fake.getvalue()

View File

@@ -17,7 +17,7 @@ from eventlet.green import subprocess
from eventlet import greenio from eventlet import greenio
from eventlet import greenthread from eventlet import greenthread
from eventlet import support from eventlet import support
from eventlet.support import bytes_to_str, six from eventlet.support import bytes_to_str, capture_stderr, six
from eventlet import tpool from eventlet import tpool
from eventlet import wsgi from eventlet import wsgi
@@ -835,11 +835,8 @@ class TestHttpd(_TestBase):
listener = greensocket.socket() listener = greensocket.socket()
listener.bind(('localhost', 0)) listener.bind(('localhost', 0))
# NOT calling listen, to trigger the error # NOT calling listen, to trigger the error
self.logfile = six.StringIO() with capture_stderr() as log:
self.spawn_server(sock=listener) self.spawn_server(sock=listener)
old_stderr = sys.stderr
try:
sys.stderr = self.logfile
eventlet.sleep(0) # need to enter server loop eventlet.sleep(0) # need to enter server loop
try: try:
eventlet.connect(('localhost', self.port)) eventlet.connect(('localhost', self.port))
@@ -847,10 +844,8 @@ class TestHttpd(_TestBase):
except socket.error as exc: except socket.error as exc:
self.assertEqual(support.get_errno(exc), errno.ECONNREFUSED) self.assertEqual(support.get_errno(exc), errno.ECONNREFUSED)
log_content = self.logfile.getvalue() log_content = log.getvalue()
assert 'Invalid argument' in log_content, log_content assert 'Invalid argument' in log_content, log_content
finally:
sys.stderr = old_stderr
debug.hub_exceptions(False) debug.hub_exceptions(False)
def test_026_log_format(self): def test_026_log_format(self):