commit 019c8e773605623871b7d4fd5a85e6ae7869abbb
parent 587252f1a8b89e386f4b6769976f67af17b6ec49
Author: Maksim Sadym <69349599+sadym-chromium@users.noreply.github.com>
Date: Wed, 15 Oct 2025 09:00:01 +0000
Bug 1994236 [wpt PR 55355] - [wdspec] fail pending commands on closed websocket, a=testonly
Automatic update from web-platform-tests
[wdspec] fail pending commands on closed websocket (#55355)
When a websocket connection is closed, pending commands remain in a pending state, causing tests to time out. This change ensures commands fail immediately upon connection closure, preventing the tests from waiting for the timeout.
Co-authored-by: Henrik Skupin <mail@hskupin.info>
--
wpt-commits: 70bf03f4ab64c5bf4cdeced6ffaea864fef7fd78
wpt-pr: 55355
Diffstat:
2 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/testing/web-platform/tests/tools/webdriver/webdriver/bidi/client.py b/testing/web-platform/tests/tools/webdriver/webdriver/bidi/client.py
@@ -6,7 +6,7 @@ from typing import Any, Awaitable, Callable, List, Optional, Mapping, MutableMap
from urllib.parse import urljoin, urlparse
from . import modules
-from .error import from_error_details
+from .error import from_error_details, UnknownErrorException
from .transport import Transport
@@ -144,7 +144,10 @@ class BidiSession:
async def start_transport(self,
loop: Optional[asyncio.AbstractEventLoop] = None) -> None:
if self.transport is None:
- self.transport = Transport(self.websocket_url, self.on_message, loop=loop)
+ self.transport = Transport(self.websocket_url,
+ self.on_message,
+ loop=loop,
+ on_closed=self.on_transport_closed)
await self.transport.start()
elif loop is not None and loop is not self.event_loop:
raise ValueError("Transport with a different event loop already exists")
@@ -159,6 +162,11 @@ class BidiSession:
self.session_id, self.capabilities = await self.session.new( # type: ignore
capabilities=self.requested_capabilities)
+ def on_transport_closed(self):
+ for future in self.pending_commands.values():
+ if future is not None and not future.done():
+ future.set_exception(UnknownErrorException("WebSocket connection closed"))
+
async def send_command(
self,
method: str,
diff --git a/testing/web-platform/tests/tools/webdriver/webdriver/bidi/transport.py b/testing/web-platform/tests/tools/webdriver/webdriver/bidi/transport.py
@@ -25,12 +25,15 @@ def get_running_loop() -> asyncio.AbstractEventLoop:
class Transport:
"""Low level message handler for the WebSockets connection"""
def __init__(self, url: str,
- msg_handler: Callable[[Mapping[str, Any]], Coroutine[Any, Any, None]],
- loop: Optional[asyncio.AbstractEventLoop] = None):
+ msg_handler: Callable[
+ [Mapping[str, Any]], Coroutine[Any, Any, None]],
+ loop: Optional[asyncio.AbstractEventLoop] = None,
+ on_closed: Optional[Callable[[], None]] = None):
self.url = url
self.connection: Optional[websockets.WebSocketClientProtocol] = None
self.msg_handler = msg_handler
self.send_buf: List[Mapping[str, Any]] = []
+ self.on_closed = on_closed
if loop is None:
loop = get_running_loop()
@@ -81,6 +84,8 @@ class Transport:
await self.handle(msg)
except ConnectionClosed:
logger.debug("connection closed while reading messages")
+ if self.on_closed:
+ self.on_closed()
async def wait_closed(self) -> None:
if self.connection and not self.connection.closed: