You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

160 lines
5.1 KiB
Python

5 years ago
import gevent.testing as greentest
import gevent
from gevent.hub import get_hub
import sys
SHOULD_EXPIRE = 0.01
if not greentest.RUNNING_ON_CI:
SHOULD_NOT_EXPIRE = SHOULD_EXPIRE * 2.0
else:
SHOULD_NOT_EXPIRE = SHOULD_EXPIRE * 20.0
class TestDirectRaise(greentest.TestCase):
switch_expected = False
def test_direct_raise_class(self):
try:
raise gevent.Timeout
except gevent.Timeout as t:
assert not t.pending, repr(t)
def test_direct_raise_instance(self):
timeout = gevent.Timeout()
try:
raise timeout
except gevent.Timeout as t:
assert timeout is t, (timeout, t)
assert not t.pending, repr(t)
class Test(greentest.TestCase):
def _test(self, timeout, close):
try:
get_hub().switch()
self.fail('Must raise Timeout')
except gevent.Timeout as ex:
if ex is not timeout:
raise
if close:
ex.close()
return ex
def _check_expires(self, timeout):
timeout.start()
self._test(timeout, False)
# Restart
timeout.start()
return self._test(timeout, True)
def test_expires(self):
timeout = gevent.Timeout(SHOULD_EXPIRE)
self._check_expires(timeout)
def test_expires_false(self):
# A False exception value only matters to a
# context manager
timeout = gevent.Timeout(SHOULD_EXPIRE, False)
self._check_expires(timeout)
def test_expires_str(self):
# str values are accepted but not documented; they change
# the message
timeout = gevent.Timeout(SHOULD_EXPIRE, 'XXX')
ex = self._check_expires(timeout)
self.assertTrue(str(ex).endswith('XXX'))
def assert_type_err(self, ex):
# PyPy3 uses 'exceptions must derive', everyone else uses "exceptions must be"
self.assertTrue("exceptions must be" in str(ex) or "exceptions must derive" in str(ex), str(ex))
def test_expires_non_exception(self):
timeout = gevent.Timeout(SHOULD_EXPIRE, object())
timeout.start()
try:
get_hub().switch()
self.fail("Most raise TypeError")
except TypeError as ex:
self.assert_type_err(ex)
timeout.close()
class OldStyle:
pass
timeout = gevent.Timeout(SHOULD_EXPIRE, OldStyle) # Type
timeout.start()
try:
get_hub().switch()
self.fail("Must raise OldStyle")
except TypeError as ex:
self.assertTrue(greentest.PY3, "Py3 raises a TypeError for non-BaseExceptions")
self.assert_type_err(ex)
except: # pylint:disable=bare-except
self.assertTrue(greentest.PY2, "Old style classes can only be raised on Py2")
t = sys.exc_info()[0]
self.assertEqual(t, OldStyle)
timeout.close()
timeout = gevent.Timeout(SHOULD_EXPIRE, OldStyle()) # instance
timeout.start()
try:
get_hub().switch()
self.fail("Must raise OldStyle")
except TypeError as ex:
self.assertTrue(greentest.PY3, "Py3 raises a TypeError for non-BaseExceptions")
self.assert_type_err(ex)
except: # pylint:disable=bare-except
self.assertTrue(greentest.PY2, "Old style classes can only be raised on Py2")
t = sys.exc_info()[0]
self.assertEqual(t, OldStyle)
timeout.close()
def _check_context_manager_expires(self, timeout, raises=True):
try:
with timeout:
get_hub().switch()
except gevent.Timeout as ex:
if ex is not timeout:
raise
return ex
if raises:
self.fail("Must raise Timeout")
def test_context_manager(self):
timeout = gevent.Timeout(SHOULD_EXPIRE)
self._check_context_manager_expires(timeout)
def test_context_manager_false(self):
# Suppress the exception
timeout = gevent.Timeout(SHOULD_EXPIRE, False)
self._check_context_manager_expires(timeout, raises=False)
self.assertTrue(str(timeout).endswith('(silent)'), str(timeout))
def test_context_manager_str(self):
timeout = gevent.Timeout(SHOULD_EXPIRE, 'XXX')
ex = self._check_context_manager_expires(timeout)
self.assertTrue(str(ex).endswith('XXX'), str(ex))
def test_cancel(self):
timeout = gevent.Timeout(SHOULD_EXPIRE)
timeout.start()
timeout.cancel()
gevent.sleep(SHOULD_NOT_EXPIRE)
self.assertFalse(timeout.pending, timeout)
timeout.close()
@greentest.ignores_leakcheck
def test_with_timeout(self):
with self.assertRaises(gevent.Timeout):
gevent.with_timeout(SHOULD_EXPIRE, gevent.sleep, SHOULD_NOT_EXPIRE)
X = object()
r = gevent.with_timeout(SHOULD_EXPIRE, gevent.sleep, SHOULD_NOT_EXPIRE, timeout_value=X)
self.assertIs(r, X)
r = gevent.with_timeout(SHOULD_NOT_EXPIRE, gevent.sleep, SHOULD_EXPIRE, timeout_value=X)
self.assertIsNone(r)
if __name__ == '__main__':
greentest.main()