diff options
author | Chris McDonough <chrism@plope.com> | 2018-07-22 22:16:16 -0400 |
---|---|---|
committer | Chris McDonough <chrism@plope.com> | 2018-07-22 22:16:16 -0400 |
commit | e7ace389b2292db3cffd00e5cf40a0dac1676988 (patch) | |
tree | 31a4739cb08cdf73339f16678e1f69b58b809c77 | |
parent | ff94a9f38fe8d0057b79c432f2de34fe652e14a3 (diff) | |
download | waitress-e7ace389b2292db3cffd00e5cf40a0dac1676988.tar.gz |
improve coverage
-rw-r--r-- | waitress/tests/test_wasyncore.py | 90 | ||||
-rw-r--r-- | waitress/wasyncore.py | 18 |
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: |