[test] Fix connect timeout test (#9906)

Fixes https://github.com/yt-dlp/yt-dlp/issues/9659

Authored by: coletdjnz
This commit is contained in:
coletdjnz 2024-05-18 19:12:21 +12:00 committed by GitHub
parent c999bac02c
commit 53b4d44f55
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 31 additions and 16 deletions

View File

@ -6,7 +6,7 @@ import sys
import pytest import pytest
from yt_dlp.networking.common import Features from yt_dlp.networking.common import Features, DEFAULT_TIMEOUT
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
@ -523,20 +523,17 @@ class TestHTTPRequestHandler(TestRequestHandlerBase):
def test_connect_timeout(self, handler): def test_connect_timeout(self, handler):
# nothing should be listening on this port # nothing should be listening on this port
connect_timeout_url = 'http://10.255.255.255' connect_timeout_url = 'http://10.255.255.255'
with handler(timeout=0.01) as rh: with handler(timeout=0.01) as rh, pytest.raises(TransportError):
now = time.time() now = time.time()
with pytest.raises(TransportError): validate_and_send(rh, Request(connect_timeout_url))
validate_and_send( assert time.time() - now < DEFAULT_TIMEOUT
rh, Request(connect_timeout_url))
assert 0.01 <= time.time() - now < 20
with handler() as rh:
with pytest.raises(TransportError):
# Per request timeout, should override handler timeout # Per request timeout, should override handler timeout
request = Request(connect_timeout_url, extensions={'timeout': 0.01})
with handler() as rh, pytest.raises(TransportError):
now = time.time() now = time.time()
validate_and_send( validate_and_send(rh, request)
rh, Request(connect_timeout_url, extensions={'timeout': 0.01})) assert time.time() - now < DEFAULT_TIMEOUT
assert 0.01 <= time.time() - now < 20
def test_source_address(self, handler): def test_source_address(self, handler):
source_address = f'127.0.0.{random.randint(5, 255)}' source_address = f'127.0.0.{random.randint(5, 255)}'

View File

@ -3,11 +3,12 @@
# Allow direct execution # Allow direct execution
import os import os
import sys import sys
import time
import pytest import pytest
from test.helper import verify_address_availability from test.helper import verify_address_availability
from yt_dlp.networking.common import Features from yt_dlp.networking.common import Features, DEFAULT_TIMEOUT
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
@ -202,11 +203,26 @@ class TestWebsSocketRequestHandlerConformance:
({'timeout': sys.float_info.min}, {}), ({'timeout': sys.float_info.min}, {}),
({}, {'timeout': sys.float_info.min}), ({}, {'timeout': sys.float_info.min}),
]) ])
def test_timeout(self, handler, params, extensions): def test_read_timeout(self, handler, params, extensions):
with handler(**params) as rh: with handler(**params) as rh:
with pytest.raises(TransportError): with pytest.raises(TransportError):
ws_validate_and_send(rh, Request(self.ws_base_url, extensions=extensions)) ws_validate_and_send(rh, Request(self.ws_base_url, extensions=extensions))
def test_connect_timeout(self, handler):
# nothing should be listening on this port
connect_timeout_url = 'ws://10.255.255.255'
with handler(timeout=0.01) as rh, pytest.raises(TransportError):
now = time.time()
ws_validate_and_send(rh, Request(connect_timeout_url))
assert time.time() - now < DEFAULT_TIMEOUT
# Per request timeout, should override handler timeout
request = Request(connect_timeout_url, extensions={'timeout': 0.01})
with handler() as rh, pytest.raises(TransportError):
now = time.time()
ws_validate_and_send(rh, request)
assert time.time() - now < DEFAULT_TIMEOUT
def test_cookies(self, handler): def test_cookies(self, handler):
cookiejar = YoutubeDLCookieJar() cookiejar = YoutubeDLCookieJar()
cookiejar.set_cookie(http.cookiejar.Cookie( cookiejar.set_cookie(http.cookiejar.Cookie(

View File

@ -31,6 +31,8 @@ from ..utils import (
) )
from ..utils.networking import HTTPHeaderDict, normalize_url from ..utils.networking import HTTPHeaderDict, normalize_url
DEFAULT_TIMEOUT = 20
def register_preference(*handlers: type[RequestHandler]): def register_preference(*handlers: type[RequestHandler]):
assert all(issubclass(handler, RequestHandler) for handler in handlers) assert all(issubclass(handler, RequestHandler) for handler in handlers)
@ -235,7 +237,7 @@ class RequestHandler(abc.ABC):
self._logger = logger self._logger = logger
self.headers = headers or {} self.headers = headers or {}
self.cookiejar = cookiejar if cookiejar is not None else YoutubeDLCookieJar() self.cookiejar = cookiejar if cookiejar is not None else YoutubeDLCookieJar()
self.timeout = float(timeout or 20) self.timeout = float(timeout or DEFAULT_TIMEOUT)
self.proxies = proxies or {} self.proxies = proxies or {}
self.source_address = source_address self.source_address = source_address
self.verbose = verbose self.verbose = verbose