From 5d1b4f54f982f23ea1287a2bf70218f1fbd0a6bc Mon Sep 17 00:00:00 2001 From: Roman Date: Tue, 30 Apr 2024 14:14:53 +0800 Subject: [PATCH] test: happy and common case with 5 nodes --- src/steps/rln.py | 35 ++++++++++++++++++++++++++++++++++- tests/relay/test_rln.py | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/src/steps/rln.py b/src/steps/rln.py index 01919bfa..17337eb0 100644 --- a/src/steps/rln.py +++ b/src/steps/rln.py @@ -6,7 +6,7 @@ import allure from src.node.waku_message import WakuMessage from src.steps.common import StepsCommon from src.test_data import PUBSUB_TOPICS_RLN -from src.env_vars import DEFAULT_NWAKU, RLN_CREDENTIALS, NODEKEY, NODE_1, NODE_2 +from src.env_vars import DEFAULT_NWAKU, RLN_CREDENTIALS, NODEKEY, NODE_1, NODE_2, ADDITIONAL_NODES from src.libs.common import gen_step_id, delay from src.libs.custom_logger import get_custom_logger from src.node.waku_node import WakuNode, rln_credential_store_ready @@ -30,6 +30,13 @@ class StepsRLN(StepsCommon): self.register_rln_single_node(rln_creds_source=RLN_CREDENTIALS, rln_creds_id="1") self.register_rln_single_node(rln_creds_source=RLN_CREDENTIALS, rln_creds_id="2") + @pytest.fixture(scope="function") + def register_optional_rln_relay_nodes(self, request): + logger.debug(f"Running fixture setup: {inspect.currentframe().f_code.co_name}") + self.register_rln_single_node(rln_creds_source=RLN_CREDENTIALS, rln_creds_id="3") + self.register_rln_single_node(rln_creds_source=RLN_CREDENTIALS, rln_creds_id="4") + self.register_rln_single_node(rln_creds_source=RLN_CREDENTIALS, rln_creds_id="5") + @allure.step def setup_main_rln_relay_nodes(self, **kwargs): self.setup_first_rln_relay_node(**kwargs) @@ -66,6 +73,28 @@ class StepsRLN(StepsCommon): self.add_node_peer(self.node2, [self.multiaddr_with_id]) self.main_nodes.extend([self.node2]) + @allure.step + def setup_optional_rln_relay_nodes(self, **kwargs): + if ADDITIONAL_NODES: + nodes = [node.strip() for node in ADDITIONAL_NODES.split(",")] + else: + pytest.skip("ADDITIONAL_NODES is empty, cannot run test") + if len(nodes) > 3: + logger.debug("More than 3 nodes are not supported for RLN tests, using first 3") + nodes = nodes[:3] + for index, node in enumerate(nodes): + node = WakuNode(node, f"node{index + 3}_{self.test_id}") + node.start( + relay="true", + discv5_bootstrap_node=self.enr_uri, + rln_creds_source=RLN_CREDENTIALS, + rln_creds_id=f"{index + 3}", + rln_relay_membership_index="1", + **kwargs, + ) + self.add_node_peer(node, [self.multiaddr_with_id]) + self.optional_nodes.append(node) + @allure.step def setup_second_lightpush_node(self, relay="false", **kwargs): self.light_push_node2 = WakuNode(NODE_2, f"lightpush_node2_{self.test_id}") @@ -134,6 +163,10 @@ class StepsRLN(StepsCommon): def subscribe_main_relay_nodes(self): self.ensure_relay_subscriptions_on_nodes(self.main_nodes, [self.test_pubsub_topic]) + @allure.step + def subscribe_optional_relay_nodes(self): + self.ensure_relay_subscriptions_on_nodes(self.optional_nodes, [self.test_pubsub_topic]) + @allure.step def create_payload(self, pubsub_topic=None, message=None, **kwargs): if message is None: diff --git a/tests/relay/test_rln.py b/tests/relay/test_rln.py index 24979f9a..9fe9b335 100644 --- a/tests/relay/test_rln.py +++ b/tests/relay/test_rln.py @@ -191,3 +191,41 @@ class TestRelayRLN(StepsRLN, StepsRelay): previous = now except Exception as e: assert "RLN validation failed" in str(e) + + @pytest.mark.usefixtures("register_optional_rln_relay_nodes") + def test_valid_payloads_with_optional_nodes_at_slow_rate(self): + self.setup_main_rln_relay_nodes() + self.setup_optional_rln_relay_nodes() + self.subscribe_main_relay_nodes() + self.subscribe_optional_relay_nodes() + failed_payloads = [] + for payload in SAMPLE_INPUTS: + logger.debug(f'Running test with payload {payload["description"]}') + message = self.create_message(payload=to_base64(payload["value"])) + try: + self.check_published_message_reaches_relay_peer(message) + except Exception as e: + logger.error(f'Payload {payload["description"]} failed: {str(e)}') + failed_payloads.append(payload["description"]) + delay(1) + assert not failed_payloads, f"Payloads failed: {failed_payloads}" + + @pytest.mark.usefixtures("register_optional_rln_relay_nodes") + def test_valid_payloads_with_optional_nodes_at_spam_rate(self): + self.setup_main_rln_relay_nodes() + self.setup_optional_rln_relay_nodes() + self.subscribe_main_relay_nodes() + self.subscribe_optional_relay_nodes() + previous = math.trunc(time()) + for i, payload in enumerate(SAMPLE_INPUTS): + logger.debug(f'Running test with payload {payload["description"]}') + message = self.create_message(payload=to_base64(payload["value"])) + try: + now = math.trunc(time()) + self.publish_message(message) + if i > 0 and (now - previous) == 0: + raise AssertionError("Publish with RLN enabled at spam rate worked!!!") + else: + previous = now + except Exception as e: + assert "RLN validation failed" in str(e)