import asyncio from typing import NamedTuple import pytest from multiaddr import Multiaddr from libp2p import new_node from libp2p.pubsub.floodsub import FloodSub from libp2p.pubsub.gossipsub import GossipSub from libp2p.pubsub.pubsub import Pubsub from .configs import ( FLOODSUB_PROTOCOL_ID, GOSSIPSUB_PROTOCOL_ID, LISTEN_MADDR, ) # pylint: disable=redefined-outer-name @pytest.fixture def num_hosts(): return 3 @pytest.fixture async def hosts(num_hosts): _hosts = await asyncio.gather(*[ new_node(transport_opt=[str(LISTEN_MADDR)]) for _ in range(num_hosts) ]) await asyncio.gather(*[ _host.get_network().listen(LISTEN_MADDR) for _host in _hosts ]) yield _hosts # Clean up listeners = [] for _host in _hosts: for listener in _host.get_network().listeners.values(): listener.server.close() listeners.append(listener) await asyncio.gather(*[ listener.server.wait_closed() for listener in listeners ]) @pytest.fixture def floodsubs(num_hosts): return tuple( FloodSub(protocols=[FLOODSUB_PROTOCOL_ID]) for _ in range(num_hosts) ) class GossipsubParams(NamedTuple): degree: int = 10 degree_low: int = 9 degree_high: int = 11 fanout_ttl: int = 30 gossip_window: int = 3 gossip_history: int = 5 heartbeat_interval: float = 0.5 @pytest.fixture def gossipsub_params(): return GossipsubParams() @pytest.fixture def gossipsubs(num_hosts, gossipsub_params): yield tuple( GossipSub( protocols=[GOSSIPSUB_PROTOCOL_ID], **gossipsub_params._asdict(), ) for _ in range(num_hosts) ) # TODO: Clean up def _make_pubsubs(hosts, pubsub_routers): if len(pubsub_routers) != len(hosts): raise ValueError( f"lenght of pubsub_routers={pubsub_routers} should be equaled to the " f"length of hosts={len(hosts)}" ) return tuple( Pubsub( host=host, router=router, my_id=host.get_id(), ) for host, router in zip(hosts, pubsub_routers) ) @pytest.fixture def pubsubs_fsub(hosts, floodsubs): _pubsubs_fsub = _make_pubsubs(hosts, floodsubs) yield _pubsubs_fsub # TODO: Clean up @pytest.fixture def pubsubs_gsub(hosts, gossipsubs): _pubsubs_gsub = _make_pubsubs(hosts, gossipsubs) yield _pubsubs_gsub # TODO: Clean up