3
3
import os
4
4
import platform
5
5
import socket
6
+ import time
7
+ import traceback
6
8
from abc import ABCMeta , abstractmethod
7
9
from typing import cast , Any , List , Mapping , Optional , Tuple , Type
8
10
9
11
import mozprocess
10
12
from mozdebug import DebuggerInfo
11
13
from mozlog .structuredlog import StructuredLogger
12
14
15
+ from ..environment import wait_for_service
13
16
from ..testloader import GroupMetadata
14
17
from ..wptcommandline import require_arg # noqa: F401
15
18
from ..wpttest import Test
@@ -316,6 +319,7 @@ def __init__(self,
316
319
self .env = os .environ .copy () if env is None else env
317
320
self .webdriver_args = webdriver_args if webdriver_args is not None else []
318
321
322
+ self .init_deadline : Optional [float ] = None
319
323
self ._output_handler : Optional [OutputHandler ] = None
320
324
self ._cmd = None
321
325
self ._proc : Optional [mozprocess .ProcessHandler ] = None
@@ -326,6 +330,7 @@ def make_command(self) -> List[str]:
326
330
return [self .webdriver_binary ] + self .webdriver_args
327
331
328
332
def start (self , group_metadata : GroupMetadata , ** kwargs : Any ) -> None :
333
+ self .init_deadline = time .time () + self .init_timeout
329
334
try :
330
335
self ._run_server (group_metadata , ** kwargs )
331
336
except KeyboardInterrupt :
@@ -340,6 +345,7 @@ def create_output_handler(self, cmd: List[str]) -> OutputHandler:
340
345
return OutputHandler (self .logger , cmd )
341
346
342
347
def _run_server (self , group_metadata : GroupMetadata , ** kwargs : Any ) -> None :
348
+ assert self .init_deadline is not None
343
349
cmd = self .make_command ()
344
350
self ._output_handler = self .create_output_handler (cmd )
345
351
@@ -359,7 +365,21 @@ def _run_server(self, group_metadata: GroupMetadata, **kwargs: Any) -> None:
359
365
raise
360
366
self ._output_handler .after_process_start (self ._proc .pid )
361
367
362
- self ._output_handler .start (group_metadata = group_metadata , ** kwargs )
368
+ try :
369
+ wait_for_service (
370
+ self .logger ,
371
+ self .host ,
372
+ self .port ,
373
+ timeout = self .init_deadline - time .time (),
374
+ server_process = self ._proc ,
375
+ )
376
+ except Exception :
377
+ self .logger .error (
378
+ "WebDriver was not accessible "
379
+ f"within the timeout:\n { traceback .format_exc ()} " )
380
+ raise
381
+ finally :
382
+ self ._output_handler .start (group_metadata = group_metadata , ** kwargs )
363
383
self .logger .debug ("_run complete" )
364
384
365
385
def stop (self , force : bool = False ) -> bool :
0 commit comments