summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2018-07-22 22:16:16 -0400
committerChris McDonough <chrism@plope.com>2018-07-22 22:16:16 -0400
commite7ace389b2292db3cffd00e5cf40a0dac1676988 (patch)
tree31a4739cb08cdf73339f16678e1f69b58b809c77
parentff94a9f38fe8d0057b79c432f2de34fe652e14a3 (diff)
downloadwaitress-e7ace389b2292db3cffd00e5cf40a0dac1676988.tar.gz
improve coverage
-rw-r--r--waitress/tests/test_wasyncore.py90
-rw-r--r--waitress/wasyncore.py18
2 files changed, 91 insertions, 17 deletions
diff --git a/waitress/tests/test_wasyncore.py b/waitress/tests/test_wasyncore.py
index 78f7a04..af54627 100644
--- a/waitress/tests/test_wasyncore.py
+++ b/waitress/tests/test_wasyncore.py
@@ -682,13 +682,23 @@ class FileWrapperTest(unittest.TestCase):
def test_resource_warning(self):
# Issue #11453
- fd = os.open(TESTFN, os.O_RDONLY)
- f = asyncore.file_wrapper(fd)
+ got_warning = False
+ while got_warning is False:
+ # we try until we get the outcome we want because this
+ # test is not deterministic (gc_collect() may not
+ fd = os.open(TESTFN, os.O_RDONLY)
+ f = asyncore.file_wrapper(fd)
- os.close(fd)
- with check_warnings(('', compat.ResourceWarning)):
- f = None
- gc_collect()
+ os.close(fd)
+
+ try:
+ with check_warnings(('', compat.ResourceWarning)):
+ f = None
+ gc_collect()
+ except AssertionError: # pragma: no cover
+ pass
+ else:
+ got_warning = True
def test_close_twice(self):
fd = os.open(TESTFN, os.O_RDONLY)
@@ -1184,6 +1194,70 @@ class Test__exception(unittest.TestCase):
self._callFUT(inst)
self.assertTrue(inst.expt_event_handled)
self.assertTrue(inst.error_handled)
+
+class Test_readwrite(unittest.TestCase):
+ def _callFUT(self, obj, flags):
+ from waitress.wasyncore import readwrite
+ return readwrite(obj, flags)
+
+ def test_handle_read_event(self):
+ flags = 0
+ flags |= select.POLLIN
+ inst = DummyDispatcher()
+ self._callFUT(inst, flags)
+ self.assertTrue(inst.read_event_handled)
+
+ def test_handle_write_event(self):
+ flags = 0
+ flags |= select.POLLOUT
+ inst = DummyDispatcher()
+ self._callFUT(inst, flags)
+ self.assertTrue(inst.write_event_handled)
+
+ def test_handle_expt_event(self):
+ flags = 0
+ flags |= select.POLLPRI
+ inst = DummyDispatcher()
+ self._callFUT(inst, flags)
+ self.assertTrue(inst.expt_event_handled)
+
+ def test_handle_close(self):
+ flags = 0
+ flags |= select.POLLHUP
+ inst = DummyDispatcher()
+ self._callFUT(inst, flags)
+ self.assertTrue(inst.close_handled)
+
+ def test_socketerror_not_in_disconnected(self):
+ flags = 0
+ flags |= select.POLLIN
+ inst = DummyDispatcher(socket.error(errno.EALREADY, 'EALREADY'))
+ self._callFUT(inst, flags)
+ self.assertTrue(inst.read_event_handled)
+ self.assertTrue(inst.error_handled)
+
+ def test_socketerror_in_disconnected(self):
+ flags = 0
+ flags |= select.POLLIN
+ inst = DummyDispatcher(socket.error(errno.ECONNRESET, 'ECONNRESET'))
+ self._callFUT(inst, flags)
+ self.assertTrue(inst.read_event_handled)
+ self.assertTrue(inst.close_handled)
+
+ def test_exception_in_reraised(self):
+ from waitress import wasyncore
+ flags = 0
+ flags |= select.POLLIN
+ inst = DummyDispatcher(wasyncore.ExitNow)
+ self.assertRaises(wasyncore.ExitNow, self._callFUT, inst, flags)
+ self.assertTrue(inst.read_event_handled)
+
+ def test_exception_not_in_reraised(self):
+ flags = 0
+ flags |= select.POLLIN
+ inst = DummyDispatcher(ValueError)
+ self._callFUT(inst, flags)
+ self.assertTrue(inst.error_handled)
class DummyDispatcher(object):
read_event_handled = False
@@ -1212,6 +1286,6 @@ class DummyDispatcher(object):
def handle_error(self):
self.error_handled = True
- # def handle_close(self):
- # self.close_handled = True
+ def handle_close(self):
+ self.close_handled = True
diff --git a/waitress/wasyncore.py b/waitress/wasyncore.py
index a9890fd..e2fae86 100644
--- a/waitress/wasyncore.py
+++ b/waitress/wasyncore.py
@@ -130,7 +130,7 @@ def readwrite(obj, flags):
obj.handle_error()
def poll(timeout=0.0, map=None):
- if map is None:
+ if map is None: # pragma: no cover
map = socket_map
if map:
r = []; w = []; e = []
@@ -176,7 +176,7 @@ def poll(timeout=0.0, map=None):
def poll2(timeout=0.0, map=None):
# Use the poll() support added to the select module in Python 2.0
- if map is None:
+ if map is None: # pragma: no cover
map = socket_map
if timeout is not None:
# timeout is in milliseconds
@@ -209,7 +209,7 @@ def poll2(timeout=0.0, map=None):
poll3 = poll2 # Alias for backward compatibility
def loop(timeout=30.0, use_poll=False, map=None, count=None):
- if map is None:
+ if map is None: # pragma: no cover
map = socket_map
if use_poll and hasattr(select, 'poll'):
@@ -238,7 +238,7 @@ class dispatcher:
logger = utilities.logger
def __init__(self, sock=None, map=None):
- if map is None:
+ if map is None: # pragma: no cover
self._map = socket_map
else:
self._map = map
@@ -339,7 +339,7 @@ class dispatcher:
def listen(self, num):
self.accepting = True
- if os.name == 'nt' and num > 5:
+ if os.name == 'nt' and num > 5: # pragma: no cover
num = 5
return self.socket.listen(num)
@@ -352,7 +352,7 @@ class dispatcher:
self.connecting = True
err = self.socket.connect_ex(address)
if err in (EINPROGRESS, EALREADY, EWOULDBLOCK) \
- or err == EINVAL and os.name == 'nt':
+ or err == EINVAL and os.name == 'nt': # pragma: no cover
self.addr = address
return
if err in (0, EISCONN):
@@ -547,7 +547,7 @@ class dispatcher_with_send(dispatcher):
return (not self.connected) or len(self.out_buffer)
def send(self, data):
- if self.debug:
+ if self.debug: # pragma: no cover
self.log_info('sending %s' % repr(data))
self.out_buffer = self.out_buffer + data
self.initiate_send()
@@ -559,7 +559,7 @@ class dispatcher_with_send(dispatcher):
def compact_traceback():
t, v, tb = sys.exc_info()
tbinfo = []
- if not tb: # Must have a traceback
+ if not tb: # pragma: no cover
raise AssertionError("traceback does not exist")
while tb:
tbinfo.append((
@@ -577,7 +577,7 @@ def compact_traceback():
return (file, function, line), t, v, info
def close_all(map=None, ignore_all=False):
- if map is None:
+ if map is None: # pragma: no cover
map = socket_map
for x in list(map.values()): # list() FBO py3
try: