Compare commits

..

2 Commits

Author SHA1 Message Date
coletdjnz
c20ec1eb89
remove ydl tests
will deal with this contention in another pr
2024-02-17 19:41:28 +13:00
coletdjnz
d121ac7b19
Fix for websockets 2024-02-17 19:35:32 +13:00
2 changed files with 31 additions and 28 deletions

View File

@ -746,6 +746,25 @@ class TestClientCertificate:
})
class TestRequestHandlerMisc:
"""Misc generic tests for request handlers, not related to request or validation testing"""
@pytest.mark.parametrize('handler,logger_name', [
('Requests', 'urllib3'),
('Websockets', 'websockets.client'),
('Websockets', 'websockets.server')
], indirect=['handler'])
def test_remove_logging_handler(self, handler, logger_name):
# Ensure any logging handlers, which may contain a YoutubeDL instance,
# are removed when we close the request handler
# See: https://github.com/yt-dlp/yt-dlp/issues/8922
logging_handlers = logging.getLogger(logger_name).handlers
before_count = len(logging_handlers)
rh = handler()
assert len(logging_handlers) == before_count + 1
rh.close()
assert len(logging_handlers) == before_count
class TestUrllibRequestHandler(TestRequestHandlerBase):
@pytest.mark.parametrize('handler', ['Urllib'], indirect=True)
def test_file_urls(self, handler):
@ -906,16 +925,6 @@ class TestRequestsRequestHandler(TestRequestHandlerBase):
assert called
def test_remove_logging_handler(self, handler):
# Ensure logging handler, containing YoutubeDL instance, is removed when we close the request handler
# https://github.com/yt-dlp/yt-dlp/issues/8922
logging_handlers = logging.getLogger('urllib3').handlers
before_count = len(logging_handlers)
rh = handler()
assert len(logging_handlers) == before_count + 1
rh.close()
assert len(logging_handlers) == before_count
def run_validation(handler, error, req, **handler_kwargs):
with handler(**handler_kwargs) as rh:
@ -1420,23 +1429,6 @@ class TestYoutubeDLNetworking:
assert len(director.preferences) == 1
assert director.preferences.pop()(UrllibRH, None)
def test_close(self, monkeypatch):
with FakeYDL() as ydl:
director = ydl._request_director
called = False
original_close = director.close
def mock_close(*args, **kwargs):
nonlocal called
called = True
return original_close(*args, **kwargs)
monkeypatch.setattr(director, 'close', mock_close)
ydl.close()
assert called is True
class TestRequest:

View File

@ -38,6 +38,8 @@ if websockets_version < (12, 0):
import websockets.sync.client
from websockets.uri import parse_uri
WEBSOCKETS_LOGGERS = ('websockets.client', 'websockets.server')
class WebsocketsResponseAdapter(WebSocketResponse):
@ -90,10 +92,12 @@ class WebsocketsRH(WebSocketRequestHandler):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for name in ('websockets.client', 'websockets.server'):
self.__logging_handlers = []
for name in WEBSOCKETS_LOGGERS:
logger = logging.getLogger(name)
handler = logging.StreamHandler(stream=sys.stdout)
handler.setFormatter(logging.Formatter(f'{self.RH_NAME}: %(message)s'))
self.__logging_handlers.append(handler)
logger.addHandler(handler)
if self.verbose:
logger.setLevel(logging.DEBUG)
@ -103,6 +107,13 @@ class WebsocketsRH(WebSocketRequestHandler):
extensions.pop('timeout', None)
extensions.pop('cookiejar', None)
def close(self):
# Remove the logging handler that contains a reference to our logger
# See: https://github.com/yt-dlp/yt-dlp/issues/8922
for name in WEBSOCKETS_LOGGERS:
for handler in self.__logging_handlers:
logging.getLogger(name).removeHandler(handler)
def _send(self, request):
timeout = float(request.extensions.get('timeout') or self.timeout)
headers = self._merge_headers(request.headers)