Taso uncovered a subtle bug where it'll fail to print keyerror exceptions. Fixed, test written, thanks for the report.

This commit is contained in:
Ryan Williams
2009-11-12 16:01:27 -08:00
parent f449272345
commit d6d71f9bee
3 changed files with 38 additions and 7 deletions

View File

@@ -23,6 +23,7 @@ Linden Lab Contributors
Thanks To
---------
* Taso Du Val, reproing an exception squelching bug, saving children's lives ;-)
* R. Tyler Ballance, bug report on tpool on Windows
* Sergey Shepelev, PEP 8 police :-)
* Luci Stanescu, for reporting twisted hub bug

View File

@@ -67,10 +67,17 @@ class Hub(BaseHub):
for fileno, event in presult:
try:
if event & READ_MASK:
readers[fileno][0](fileno)
if event & WRITE_MASK:
writers[fileno][0](fileno)
listener = None
try:
if event & READ_MASK:
listener = readers[fileno][0]
if event & WRITE_MASK:
listener = writers[fileno][0]
except KeyError:
pass
else:
if listener:
listener(fileno)
if event & select.POLLNVAL:
self.remove_descriptor(fileno)
continue
@@ -79,8 +86,6 @@ class Hub(BaseHub):
writers.get(fileno, [])):
for listener in listeners:
listener(fileno)
except KeyError:
pass
except SYSTEM_EXCEPTIONS:
raise
except:

View File

@@ -5,6 +5,11 @@ import os
import socket
import sys
try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO
def bufsized(sock, size=1):
""" Resize both send and receive buffers on a socket.
Useful for testing trampoline. Returns the socket.
@@ -212,7 +217,6 @@ class TestGreenIo(LimitedTestCase):
client.close()
server_coro.wait()
listener.close()
print len(results1), len(results2)
self.assert_(len(results1) > 0)
self.assert_(len(results2) > 0)
@@ -224,6 +228,27 @@ class TestGreenIo(LimitedTestCase):
else:
sock = api.tcp_listener(('127.0.0.1', 0))
ssl_sock = ssl.wrap_socket(sock)
def test_exception_squelching(self):
server = api.tcp_listener(('0.0.0.0', 0))
client = api.connect_tcp(('127.0.0.1', server.getsockname()[1]))
client_2, addr = server.accept()
def hurl(s):
s.recv(1)
{}[1] # keyerror
fake = StringIO()
orig = sys.stderr
sys.stderr = fake
try:
api.spawn(hurl, client_2)
api.sleep(0)
client.send(' ')
api.sleep(0)
finally:
sys.stderr = orig
self.assert_('Traceback' in fake.getvalue())
class SSLTest(LimitedTestCase):