mirror of
https://github.com/dragonflydb/dragonfly.git
synced 2025-05-11 18:35:46 +02:00
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:
parent
ee24029148
commit
5fb5f54885
3 changed files with 35 additions and 14 deletions
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
]
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue