fix(regression-tests): Add PortPicker (#1078)

* fix(regression-tests): Add PortManager

Add PortManager to find and use available ports in regression tests.
Use it in redis_replicaiton_test.
---------

Signed-off-by: ashotland <ari@dragonflydb.io>
This commit is contained in:
ashotland 2023-04-12 19:14:29 +03:00 committed by GitHub
parent ee24029148
commit 5fb5f54885
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 35 additions and 14 deletions

View file

@ -139,3 +139,20 @@ def dfly_args(*args):
def dfly_multi_test_args(*args):
""" Used to define multiple sets of arguments to test multiple dragonfly configurations """
return pytest.mark.parametrize("df_factory", args, indirect=True)
class PortPicker():
""" A simple port manager to allocate available ports for tests """
def __init__(self):
self.next_port = 5555
def get_available_port(self):
while not self.is_port_available(self.next_port):
self.next_port += 1
return self.next_port
def is_port_available(self, port):
import socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
return s.connect_ex(('localhost', port)) != 0

View file

@ -14,7 +14,7 @@ import random
from pathlib import Path
from tempfile import TemporaryDirectory
from . import DflyInstance, DflyInstanceFactory, DflyParams
from . import DflyInstance, DflyInstanceFactory, DflyParams, PortPicker
from .utility import DflySeederFactory
DATABASE_INDEX = 1
@ -188,3 +188,8 @@ def pytest_addoption(parser):
)
parser.addoption(
'--existing-port', action='store', default=None, help='Provide a port to the existing process for the test')
@pytest.fixture(scope="session")
def port_picker():
yield PortPicker()

View file

@ -7,8 +7,8 @@ from .utility import *
class RedisServer:
def __init__(self):
self.port = 5555
def __init__(self, port):
self.port = port
self.proc = None
def start(self):
@ -66,8 +66,8 @@ async def check_data(seeder, replicas, c_replicas):
@pytest.fixture(scope="function")
def redis_server() -> RedisServer:
s = RedisServer()
def redis_server(port_picker) -> RedisServer:
s = RedisServer(port_picker.get_available_port())
try:
s.start()
except FileNotFoundError as e:
@ -86,7 +86,7 @@ full_sync_replication_specs = [
@pytest.mark.parametrize("t_replicas, seeder_config", full_sync_replication_specs)
async def test_replication_full_sync(df_local_factory, df_seeder_factory, redis_server, t_replicas, seeder_config):
async def test_replication_full_sync(df_local_factory, df_seeder_factory, redis_server, t_replicas, seeder_config, port_picker):
master = redis_server
c_master = aioredis.Redis(port=master.port)
assert await c_master.ping()
@ -95,7 +95,7 @@ async def test_replication_full_sync(df_local_factory, df_seeder_factory, redis_
await seeder.run(target_deviation=0.1)
replica = df_local_factory.create(
port=master.port + 1, proactor_threads=t_replicas[0])
port=port_picker.get_available_port(), proactor_threads=t_replicas[0])
replica.start()
c_replica = aioredis.Redis(port=replica.port)
assert await c_replica.ping()
@ -117,13 +117,13 @@ stable_sync_replication_specs = [
@pytest.mark.parametrize("t_replicas, seeder_config", stable_sync_replication_specs)
async def test_replication_stable_sync(df_local_factory, df_seeder_factory, redis_server, t_replicas, seeder_config):
async def test_replication_stable_sync(df_local_factory, df_seeder_factory, redis_server, t_replicas, seeder_config, port_picker):
master = redis_server
c_master = aioredis.Redis(port=master.port)
assert await c_master.ping()
replica = df_local_factory.create(
port=master.port + 1, proactor_threads=t_replicas[0])
port=port_picker.get_available_port(), proactor_threads=t_replicas[0])
replica.start()
c_replica = aioredis.Redis(port=replica.port)
assert await c_replica.ping()
@ -152,13 +152,13 @@ replication_specs = [
@pytest.mark.parametrize("t_replicas, seeder_config", replication_specs)
async def test_redis_replication_all(df_local_factory, df_seeder_factory, redis_server, t_replicas, seeder_config):
async def test_redis_replication_all(df_local_factory, df_seeder_factory, redis_server, t_replicas, seeder_config, port_picker):
master = redis_server
c_master = aioredis.Redis(port=master.port)
assert await c_master.ping()
replicas = [
df_local_factory.create(port=master.port+i+1, proactor_threads=t)
df_local_factory.create(port=port_picker.get_available_port(), proactor_threads=t)
for i, t in enumerate(t_replicas)
]
@ -208,14 +208,13 @@ master_disconnect_cases = [
@pytest.mark.parametrize("t_replicas, t_disconnect, seeder_config", master_disconnect_cases)
async def test_disconnect_master(df_local_factory, df_seeder_factory, redis_server, t_replicas, t_disconnect, seeder_config):
async def test_disconnect_master(df_local_factory, df_seeder_factory, redis_server, t_replicas, t_disconnect, seeder_config, port_picker):
master = redis_server
c_master = aioredis.Redis(port=master.port)
assert await c_master.ping()
replicas = [
df_local_factory.create(port=master.port+i+1, proactor_threads=t)
df_local_factory.create(port=port_picker.get_available_port(), proactor_threads=t)
for i, t in enumerate(t_replicas)
]