Index: Lib/test/test_support.py =================================================================== --- Lib/test/test_support.py (revision 81677) +++ Lib/test/test_support.py (working copy) @@ -750,17 +750,30 @@ raise ResourceDenied("an optional resource is not available") +_transient_errno = [errno.ECONNRESET, errno.ETIMEDOUT] +_transient_gaierror = [ getattr(socket, t) + for t in ('EAI_NODATA', 'EAI_NONAME') + if hasattr(socket, t) ] @contextlib.contextmanager 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) - dns_nodata = TransientResource(socket.gaierror, errno=socket.EAI_NODATA) - dns_noname = TransientResource(socket.gaierror, errno=socket.EAI_NONAME) - with time_out, socket_peer_reset, ioerror_peer_reset, dns_nodata, dns_noname: + with the Internet connection manifest themselves as exceptions. + + Errors caught: + time out IOError errno = ETIMEDOUT + socket reset socket.error, IOError errno = ECONNRESET + dns no data socket.gaierror errno = EAI_NODATA + dns no name socket.gaierror errno = EAI_NONAME + """ + try: yield + except (IOError, socket.error, socket.gaierror) as err: + if (isinstance(err, socket.gaierror) and + err.errno in _transient_gaierror + or err.errno in _transient_errno): + raise ResourceDenied( + "could not establish network connection ({})".format(err)) + raise @contextlib.contextmanager