|
11 | 11 | import os |
12 | 12 | import sys |
13 | 13 | import copy |
| 14 | +import time |
14 | 15 |
|
15 | 16 | g_failed = False |
| 17 | +g_server_ready = threading.Event() |
| 18 | +g_server_startup_timeout = 3 # seconds |
16 | 19 |
|
17 | 20 | # Thread class that runs a process and captures its output |
18 | 21 | class RunProcessInThread(threading.Thread): |
19 | 22 |
|
20 | | - def __init__( self, tag, cmdline, env, **popen_kwargs ): |
| 23 | + def __init__( self, tag, cmdline, env, ready_message=None, ready_event=None, **popen_kwargs ): |
21 | 24 | threading.Thread.__init__( self, name=tag ) |
22 | 25 | self.daemon = True |
23 | 26 | self.tag = tag |
24 | 27 | self.cmdline = cmdline |
| 28 | + self.ready_message = ready_message |
| 29 | + self.ready_event = ready_event |
25 | 30 | if env: |
26 | 31 | self.env = env |
27 | 32 | else: |
@@ -54,6 +59,9 @@ def run( self ): |
54 | 59 | if sOutput: |
55 | 60 | sOutput = str(sOutput, 'utf-8', 'ignore') |
56 | 61 | self.WriteLn( sOutput.rstrip() ) |
| 62 | + # Check if this is the ready message, then set requested event |
| 63 | + if self.ready_message and self.ready_event and self.ready_message in sOutput: |
| 64 | + self.ready_event.set() |
57 | 65 | elif self.process.poll() is not None: |
58 | 66 | break |
59 | 67 | self.process.wait() |
@@ -81,8 +89,8 @@ def term( self ): |
81 | 89 | self.process.terminate() |
82 | 90 | self.join( 5 ) |
83 | 91 |
|
84 | | -def StartProcessInThread( tag, cmdline, env=None, **popen_kwargs ): |
85 | | - thread = RunProcessInThread( tag, cmdline, env, **popen_kwargs ) |
| 92 | +def StartProcessInThread( tag, cmdline, env=None, ready_message=None, ready_event=None, **popen_kwargs ): |
| 93 | + thread = RunProcessInThread( tag, cmdline, env, ready_message=ready_message, ready_event=ready_event, **popen_kwargs ) |
86 | 94 | thread.start() |
87 | 95 | return thread |
88 | 96 |
|
@@ -140,7 +148,17 @@ def SymmetricTest(): |
140 | 148 | print( "Can't find trivial_signaling_server.py" ) |
141 | 149 | sys.exit(1) |
142 | 150 |
|
143 | | -signaling = StartProcessInThread( "signaling", [ sys.executable, trivial_signaling_server ] ) |
| 151 | +signaling = StartProcessInThread( "signaling", [ sys.executable, trivial_signaling_server ], |
| 152 | + ready_message="Listening at", ready_event=g_server_ready ) |
| 153 | + |
| 154 | +# Wait for the signaling server to be ready before starting tests |
| 155 | +if not g_server_ready.wait( timeout=g_server_startup_timeout ): |
| 156 | + print( "ERROR: Signaling server failed to start within %d seconds" % g_server_startup_timeout ) |
| 157 | + g_failed = True |
| 158 | + signaling.term() |
| 159 | + sys.exit(1) |
| 160 | + |
| 161 | +print( "Signaling server is ready, starting test clients" ) |
144 | 162 |
|
145 | 163 | # Run the tests |
146 | 164 | for test in [ ClientServerTest, SymmetricTest ]: |
|
0 commit comments