Skip to content

Commit 19107b7

Browse files
committed
Run test cluster on a random ephemeral port
1 parent 1f5b86e commit 19107b7

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

asyncpg/_testbase.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@ def _start_cluster(server_settings={}):
108108
_default_cluster = pg_cluster.TempCluster()
109109
_default_cluster.init()
110110
_default_cluster.trust_local_connections()
111-
_default_cluster.start(port=12345, server_settings=server_settings)
111+
_default_cluster.start(port='dynamic',
112+
server_settings=server_settings)
112113
atexit.register(_shutdown_cluster, _default_cluster)
113114

114115
return _default_cluster

asyncpg/cluster.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66

77

88
import asyncio
9+
import errno
910
import os
1011
import os.path
12+
import random
1113
import re
1214
import shutil
15+
import socket
1316
import subprocess
1417
import sys
1518
import tempfile
@@ -37,6 +40,31 @@ def ensure_dead_with_parent():
3740
pass
3841

3942

43+
def find_available_port(port_range=(49152, 65535), max_tries=1000):
44+
low, high = port_range
45+
46+
port = low
47+
try_no = 0
48+
49+
while try_no < max_tries:
50+
try_no += 1
51+
port = random.randint(low, high)
52+
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
53+
try:
54+
sock.bind(('127.0.0.1', port))
55+
except socket.error as e:
56+
if e.errno == errno.EADDRINUSE:
57+
continue
58+
finally:
59+
sock.close()
60+
61+
break
62+
else:
63+
port = None
64+
65+
return port
66+
67+
4068
class Cluster:
4169
def __init__(self, data_dir, *, pg_config_path=None):
4270
self._data_dir = data_dir
@@ -116,7 +144,12 @@ def start(self, wait=60, *, server_settings={}, **opts):
116144
'cluster in {!r} has not been initialized'.format(
117145
self._data_dir))
118146

147+
port = opts.pop('port', None)
148+
if port == 'dynamic':
149+
port = find_available_port()
150+
119151
extra_args = ['--{}={}'.format(k, v) for k, v in opts.items()]
152+
extra_args.append('--port={}'.format(port))
120153

121154
for k, v in server_settings.items():
122155
extra_args.extend(['-c', '{}={}'.format(k, v)])

0 commit comments

Comments
 (0)