From 41d4e32353a546036d76c154169917f5f754ce09 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Tue, 13 Mar 2007 02:34:09 +0000 Subject: [PATCH] Add test.test_support.transient_internet . Returns a context manager that nests test.test_support.TransientResource context managers that capture exceptions raised when the Internet connection is flaky. Initially using in test_socket_ssl but should probably be expanded to cover any test that should not raise the captured exceptions if the Internet connection works. --- Lib/test/test_socket_ssl.py | 2 +- Lib/test/test_support.py | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_socket_ssl.py b/Lib/test/test_socket_ssl.py index 8fb7e4c13e8..1f2b9d10ebb 100644 --- a/Lib/test/test_socket_ssl.py +++ b/Lib/test/test_socket_ssl.py @@ -27,7 +27,7 @@ def test_basic(): print "didn't raise TypeError" socket.RAND_add("this is a random string", 75.0) - with test_support.TransientResource(IOError, errno=errno.ETIMEDOUT): + with test_support.transient_internet(): f = urllib.urlopen('https://sf.net') buf = f.read() f.close() diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index 2e47aedf214..880e8e8906d 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -3,7 +3,9 @@ if __name__ != 'test.test_support': raise ImportError, 'test_support must be imported from the test package' -from contextlib import contextmanager +import contextlib +import errno +import socket import sys import warnings @@ -271,7 +273,7 @@ def open_urlresource(url): fn, _ = urllib.urlretrieve(url, filename) return open(fn) -@contextmanager +@contextlib.contextmanager def guard_warnings_filter(): """Guard the warnings filter from being permanently changed.""" original_filters = warnings.filters[:] @@ -338,6 +340,15 @@ class TransientResource(object): raise ResourceDenied("an optional resource is not available") +def transient_internet(): + """Return a context manager that raises ResourceDenied when various issues + with the Internet connection manifest themselves as exceptions.""" + time_out = TransientResource(IOError, errno=errno.ETIMEDOUT) + socket_peer_reset = TransientResource(socket.error, errno=errno.ECONNRESET) + ioerror_peer_reset = TransientResource(IOError, errno=errno.ECONNRESET) + return contextlib.nested(time_out, peer_reset, ioerror_peer_reset) + + #======================================================================= # Decorator for running a function in a different locale, correctly resetting # it afterwards.