|
78 | 78 | "requires_linux_version", "requires_mac_ver", |
79 | 79 | "check_syntax_error", "check_syntax_warning", |
80 | 80 | "TransientResource", "time_out", "socket_peer_reset", "ioerror_peer_reset", |
81 | | - "transient_internet", "BasicTestRunner", "run_unittest", "run_doctest", |
| 81 | + "BasicTestRunner", "run_unittest", "run_doctest", |
82 | 82 | "skip_unless_symlink", "requires_gzip", "requires_bz2", "requires_lzma", |
83 | 83 | "bigmemtest", "bigaddrspacetest", "cpython_only", "get_attribute", |
84 | 84 | "requires_IEEE_754", "skip_unless_xattr", "requires_zlib", |
|
144 | 144 | # option. |
145 | 145 | LONG_TIMEOUT = 5 * 60.0 |
146 | 146 |
|
147 | | -_NOT_SET = object() |
148 | | - |
149 | 147 |
|
150 | 148 | class Error(Exception): |
151 | 149 | """Base class for regression test exceptions.""" |
@@ -1386,90 +1384,6 @@ def __exit__(self, type_=None, value=None, traceback=None): |
1386 | 1384 | ioerror_peer_reset = TransientResource(OSError, errno=errno.ECONNRESET) |
1387 | 1385 |
|
1388 | 1386 |
|
1389 | | -@contextlib.contextmanager |
1390 | | -def transient_internet(resource_name, *, timeout=_NOT_SET, errnos=()): |
1391 | | - """Return a context manager that raises ResourceDenied when various issues |
1392 | | - with the Internet connection manifest themselves as exceptions.""" |
1393 | | - import socket |
1394 | | - import nntplib |
1395 | | - import urllib.error |
1396 | | - if timeout is _NOT_SET: |
1397 | | - timeout = INTERNET_TIMEOUT |
1398 | | - |
1399 | | - default_errnos = [ |
1400 | | - ('ECONNREFUSED', 111), |
1401 | | - ('ECONNRESET', 104), |
1402 | | - ('EHOSTUNREACH', 113), |
1403 | | - ('ENETUNREACH', 101), |
1404 | | - ('ETIMEDOUT', 110), |
1405 | | - # socket.create_connection() fails randomly with |
1406 | | - # EADDRNOTAVAIL on Travis CI. |
1407 | | - ('EADDRNOTAVAIL', 99), |
1408 | | - ] |
1409 | | - default_gai_errnos = [ |
1410 | | - ('EAI_AGAIN', -3), |
1411 | | - ('EAI_FAIL', -4), |
1412 | | - ('EAI_NONAME', -2), |
1413 | | - ('EAI_NODATA', -5), |
1414 | | - # Encountered when trying to resolve IPv6-only hostnames |
1415 | | - ('WSANO_DATA', 11004), |
1416 | | - ] |
1417 | | - |
1418 | | - denied = ResourceDenied("Resource %r is not available" % resource_name) |
1419 | | - captured_errnos = errnos |
1420 | | - gai_errnos = [] |
1421 | | - if not captured_errnos: |
1422 | | - captured_errnos = [getattr(errno, name, num) |
1423 | | - for (name, num) in default_errnos] |
1424 | | - gai_errnos = [getattr(socket, name, num) |
1425 | | - for (name, num) in default_gai_errnos] |
1426 | | - |
1427 | | - def filter_error(err): |
1428 | | - n = getattr(err, 'errno', None) |
1429 | | - if (isinstance(err, socket.timeout) or |
1430 | | - (isinstance(err, socket.gaierror) and n in gai_errnos) or |
1431 | | - (isinstance(err, urllib.error.HTTPError) and |
1432 | | - 500 <= err.code <= 599) or |
1433 | | - (isinstance(err, urllib.error.URLError) and |
1434 | | - (("ConnectionRefusedError" in err.reason) or |
1435 | | - ("TimeoutError" in err.reason) or |
1436 | | - ("EOFError" in err.reason))) or |
1437 | | - n in captured_errnos): |
1438 | | - if not verbose: |
1439 | | - sys.stderr.write(denied.args[0] + "\n") |
1440 | | - raise denied from err |
1441 | | - |
1442 | | - old_timeout = socket.getdefaulttimeout() |
1443 | | - try: |
1444 | | - if timeout is not None: |
1445 | | - socket.setdefaulttimeout(timeout) |
1446 | | - yield |
1447 | | - except nntplib.NNTPTemporaryError as err: |
1448 | | - if verbose: |
1449 | | - sys.stderr.write(denied.args[0] + "\n") |
1450 | | - raise denied from err |
1451 | | - except OSError as err: |
1452 | | - # urllib can wrap original socket errors multiple times (!), we must |
1453 | | - # unwrap to get at the original error. |
1454 | | - while True: |
1455 | | - a = err.args |
1456 | | - if len(a) >= 1 and isinstance(a[0], OSError): |
1457 | | - err = a[0] |
1458 | | - # The error can also be wrapped as args[1]: |
1459 | | - # except socket.error as msg: |
1460 | | - # raise OSError('socket error', msg).with_traceback(sys.exc_info()[2]) |
1461 | | - elif len(a) >= 2 and isinstance(a[1], OSError): |
1462 | | - err = a[1] |
1463 | | - else: |
1464 | | - break |
1465 | | - filter_error(err) |
1466 | | - raise |
1467 | | - # XXX should we catch generic exceptions and look for their |
1468 | | - # __cause__ or __context__? |
1469 | | - finally: |
1470 | | - socket.setdefaulttimeout(old_timeout) |
1471 | | - |
1472 | | - |
1473 | 1387 | @contextlib.contextmanager |
1474 | 1388 | def captured_output(stream_name): |
1475 | 1389 | """Return a context manager used by captured_stdout/stdin/stderr |
|
0 commit comments