Skip to content

Commit 7de251a

Browse files
committed
DISPATCH-1986: Retry creating TestServer instance if port is already in use
1 parent 1b80ecb commit 7de251a

File tree

2 files changed

+51
-40
lines changed

2 files changed

+51
-40
lines changed

tests/http1_tests.py

Lines changed: 48 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
from httplib import HTTPConnection, HTTPException
3131

3232
from system_test import TestCase, TIMEOUT, Logger, Qdrouterd
33+
TEST_SERVER_ERROR = "TestServer failed to start due to port %s already in use issue"
3334

3435

3536
class RequestHandler(BaseHTTPRequestHandler):
@@ -212,6 +213,27 @@ class TestServer(object):
212213
A HTTPServer running in a separate thread
213214
"""
214215

216+
@classmethod
217+
def new_server(cls, server_port, client_port, tests, handler_cls=None):
218+
num_attempts = 0
219+
max_attempts = 4
220+
while num_attempts < max_attempts:
221+
try:
222+
# Create an instance of TestServer. This might fail because the port has
223+
# not been relinquished yet. Try for a max of 4 seconds before giving up.
224+
server11 = TestServer(server_port=server_port,
225+
client_port=client_port,
226+
tests=tests,
227+
handler_cls=handler_cls)
228+
# Return the successfully created server.
229+
return server11
230+
except OSError:
231+
# TestServer creation failed. Try again in one second, for a max of 4 seconds.
232+
num_attempts += 1
233+
sleep(1)
234+
235+
return None
236+
215237
def __init__(self, server_port, client_port, tests, handler_cls=None):
216238
self._logger = Logger(title="TestServer", print_to_console=False)
217239
self._client_port = client_port
@@ -272,13 +294,11 @@ def http1_ping(sport, cport):
272294
]
273295
}
274296

275-
server = TestServer(server_port=sport,
276-
client_port=cport,
277-
tests=TEST)
297+
server = TestServer.new_server(sport, cport, TEST)
278298
client = ThreadedTestClient(tests=TEST, port=cport)
279299
client.wait()
280300
server.wait()
281-
return (client.count, client.error)
301+
return client.count, client.error
282302

283303

284304
class ResponseMsg(object):
@@ -457,14 +477,12 @@ def test_01_concurrent_requests(self):
457477
ResponseValidator(status=200)
458478
)],
459479
}
460-
server11 = TestServer(server_port=self.http_server11_port,
461-
client_port=self.http_listener11_port,
462-
tests=TESTS_11)
463-
server10 = TestServer(server_port=self.http_server10_port,
464-
client_port=self.http_listener10_port,
465-
tests=TESTS_10,
466-
handler_cls=RequestHandler10)
467480

481+
server11 = TestServer.new_server(self.http_server11_port, self.http_listener11_port, TESTS_11)
482+
self.assertIsNotNone(server11, TEST_SERVER_ERROR % self.http_server11_port)
483+
server10 = TestServer.new_server(self.http_server10_port, self.http_listener10_port, TESTS_10,
484+
handler_cls=RequestHandler10)
485+
self.assertIsNotNone(server10, TEST_SERVER_ERROR % self.http_server10_port)
468486
self.EA2.wait_connectors()
469487

470488
repeat_ct = 10
@@ -511,9 +529,9 @@ def test_02_credit_replenish(self):
511529
),
512530
]
513531
}
514-
server = TestServer(server_port=self.http_server11_port,
515-
client_port=self.http_listener11_port,
516-
tests=TESTS)
532+
server = TestServer.new_server(self.http_server11_port, self.http_listener11_port, TESTS)
533+
self.assertIsNotNone(server, TEST_SERVER_ERROR % self.http_server11_port)
534+
517535
self.EA2.wait_connectors()
518536

519537
client = ThreadedTestClient(TESTS,
@@ -543,9 +561,8 @@ def test_03_server_reconnect(self):
543561

544562
# bring up the server and send some requests. This will cause the
545563
# router to grant credit for clients
546-
server = TestServer(server_port=self.http_server11_port,
547-
client_port=self.http_listener11_port,
548-
tests=TESTS)
564+
server = TestServer.new_server(self.http_server11_port, self.http_listener11_port, TESTS)
565+
self.assertIsNotNone(server, TEST_SERVER_ERROR % self.http_server11_port)
549566
self.EA2.wait_connectors()
550567

551568
client = ThreadedTestClient(TESTS,
@@ -567,9 +584,9 @@ def test_03_server_reconnect(self):
567584
# cannot be reestablished after 2.5 seconds. Restart the server before
568585
# that occurrs to prevent client messages from being released with 503
569586
# status.
570-
server = TestServer(server_port=self.http_server11_port,
571-
client_port=self.http_listener11_port,
572-
tests=TESTS)
587+
server = TestServer.new_server(self.http_server11_port, self.http_listener11_port, TESTS)
588+
self.assertIsNotNone(server, TEST_SERVER_ERROR % self.http_server11_port)
589+
573590
client.wait()
574591
self.assertIsNone(client.error)
575592
self.assertEqual(2, client.count)
@@ -594,9 +611,9 @@ def test_04_server_pining_for_the_fjords(self):
594611

595612
# bring up the server and send some requests. This will cause the
596613
# router to grant credit for clients
597-
server = TestServer(server_port=self.http_server11_port,
598-
client_port=self.http_listener11_port,
599-
tests=TESTS)
614+
server = TestServer.new_server(self.http_server11_port, self.http_listener11_port, TESTS)
615+
self.assertIsNotNone(server, TEST_SERVER_ERROR % self.http_server11_port)
616+
600617
self.EA2.wait_connectors()
601618

602619
client = ThreadedTestClient(TESTS, self.http_listener11_port)
@@ -627,9 +644,9 @@ def test_04_server_pining_for_the_fjords(self):
627644
self.assertEqual(1, client.count)
628645

629646
# ensure links recover once the server re-appears
630-
server = TestServer(server_port=self.http_server11_port,
631-
client_port=self.http_listener11_port,
632-
tests=TESTS)
647+
server = TestServer.new_server(self.http_server11_port, self.http_listener11_port, TESTS)
648+
self.assertIsNotNone(server, TEST_SERVER_ERROR % self.http_server11_port)
649+
633650
self.EA2.wait_connectors()
634651

635652
client = ThreadedTestClient(TESTS, self.http_listener11_port)
@@ -701,13 +718,11 @@ def test_05_large_streaming_msg(self):
701718
ResponseValidator(status=200))
702719
],
703720
}
704-
server11 = TestServer(server_port=self.http_server11_port,
705-
client_port=self.http_listener11_port,
706-
tests=TESTS_11)
707-
server10 = TestServer(server_port=self.http_server10_port,
708-
client_port=self.http_listener10_port,
709-
tests=TESTS_10,
710-
handler_cls=RequestHandler10)
721+
server11 = TestServer.new_server(self.http_server11_port, self.http_listener11_port, TESTS_11)
722+
self.assertIsNotNone(server11, TEST_SERVER_ERROR % self.http_server11_port)
723+
server10 = TestServer.new_server(self.http_server10_port, self.http_listener10_port, TESTS_10,
724+
handler_cls=RequestHandler10)
725+
self.assertIsNotNone(server10, TEST_SERVER_ERROR % self.http_server10_port)
711726

712727
self.EA2.wait_connectors()
713728

tests/system_tests_http1_over_tcp.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,9 @@ def setUpClass(cls):
6565
cls.INT_A = cls.routers[0]
6666
cls.INT_A.listener = cls.INT_A.addresses[0]
6767

68-
cls.http11_server = TestServer(server_port=cls.http_server11_port,
69-
client_port=cls.http_listener11_port,
70-
tests=cls.TESTS_11)
71-
cls.http10_server = TestServer(server_port=cls.http_server10_port,
72-
client_port=cls.http_listener10_port,
73-
tests=cls.TESTS_10,
74-
handler_cls=RequestHandler10)
68+
cls.http11_server = TestServer.new_server(cls.http_server11_port, cls.http_listener11_port, cls.TESTS_11)
69+
cls.http10_server = TestServer.new_server(cls.http_server10_port, cls.http_listener10_port, cls.TESTS_10,
70+
handler_cls=RequestHandler10)
7571
cls.INT_A.wait_connectors()
7672

7773

0 commit comments

Comments
 (0)