Test/store part 1 (#31)
* first set of tests * fix ci * new tests * finish publish tests * new tests * running nodes tests * new tests * finishing touches * new test * temp commit * running node tests * new tests * new store tests * store part 1
This commit is contained in:
parent
53417a8665
commit
8d956b3d9c
|
@ -0,0 +1,111 @@
|
||||||
|
#!/bin/bash
|
||||||
|
printf "\nAssuming you already have a docker network called waku\n"
|
||||||
|
# if not something like this should create it: docker network create --driver bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 waku
|
||||||
|
|
||||||
|
|
||||||
|
cluster_id=0
|
||||||
|
pubsub_topic="/waku/2/rs/$cluster_id/0"
|
||||||
|
encoded_pubsub_topic=$(echo "$pubsub_topic" | sed 's:/:%2F:g')
|
||||||
|
content_topic="/test/1/store/proto"
|
||||||
|
encoded_content_topic=$(echo "$content_topic" | sed 's:/:%2F:g')
|
||||||
|
node_1=harbor.status.im/wakuorg/nwaku:latest
|
||||||
|
node_1_ip=172.18.64.13
|
||||||
|
node_1_rest=32261
|
||||||
|
node_1_tcp=32262
|
||||||
|
node_2=harbor.status.im/wakuorg/nwaku:latest
|
||||||
|
node_2_ip=172.18.64.14
|
||||||
|
node_2_rest=4588
|
||||||
|
|
||||||
|
|
||||||
|
printf "\nStarting containers\n"
|
||||||
|
|
||||||
|
container_id1=$(docker run -d -i -t -p $node_1_rest:$node_1_rest -p $node_1_tcp:$node_1_tcp -p 32263:32263 -p 32264:32264 -p 32265:32265 $node_1 --listen-address=0.0.0.0 --rest=true --rest-admin=true --websocket-support=true --log-level=TRACE --rest-relay-cache-capacity=100 --websocket-port=32263 --rest-port=$node_1_rest --tcp-port=$node_1_tcp --discv5-udp-port=32264 --rest-address=0.0.0.0 --nat=extip:$node_1_ip --peer-exchange=true --discv5-discovery=true --cluster-id=$cluster_id --metrics-server=true --metrics-server-address=0.0.0.0 --metrics-server-port=32265 --metrics-logging=true --store=false --relay=true)
|
||||||
|
docker network connect --ip $node_1_ip waku $container_id1
|
||||||
|
|
||||||
|
printf "\nSleeping 2 seconds\n"
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
response=$(curl -X GET "http://127.0.0.1:$node_1_rest/debug/v1/info" -H "accept: application/json")
|
||||||
|
enrUri=$(echo $response | jq -r '.enrUri')
|
||||||
|
|
||||||
|
# Extract the first non-WebSocket address
|
||||||
|
ws_address=$(echo $response | jq -r '.listenAddresses[] | select(contains("/ws") | not)')
|
||||||
|
|
||||||
|
# Check if we got an address, and construct the new address with it
|
||||||
|
if [[ $ws_address != "" ]]; then
|
||||||
|
identifier=$(echo $ws_address | awk -F'/p2p/' '{print $2}')
|
||||||
|
if [[ $identifier != "" ]]; then
|
||||||
|
multiaddr_with_id="/ip4/${node_1_ip}/tcp/${node_1_tcp}/p2p/${identifier}"
|
||||||
|
echo $multiaddr_with_id
|
||||||
|
else
|
||||||
|
echo "No identifier found in the address."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "No non-WebSocket address found."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
container_id2=$(docker run -d -i -t -p $node_2_rest:$node_2_rest -p 4589:4589 -p 4590:4590 -p 4591:4591 -p 4592:4592 $node_2 --listen-address=0.0.0.0 --rest=true --rest-admin=true --websocket-support=true --log-level=TRACE --rest-relay-cache-capacity=100 --websocket-port=4590 --rest-port=$node_2_rest --tcp-port=4589 --discv5-udp-port=4591 --rest-address=0.0.0.0 --nat=extip:$node_2_ip --peer-exchange=true --discv5-discovery=true --cluster-id=$cluster_id --metrics-server=true --metrics-server-address=0.0.0.0 --metrics-server-port=4592 --metrics-logging=true --discv5-bootstrap-node=$enrUri --storenode=$multiaddr_with_id --store=true --relay=true)
|
||||||
|
|
||||||
|
docker network connect --ip $node_2_ip waku $container_id2
|
||||||
|
|
||||||
|
printf "\nSleeping 1 seconds\n"
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
printf "\nConnect peers\n"
|
||||||
|
curl -X POST "http://127.0.0.1:$node_2_rest/admin/v1/peers" -H "Content-Type: application/json" -d "[\"$multiaddr_with_id\"]"
|
||||||
|
|
||||||
|
printf "\nSubscribe\n"
|
||||||
|
curl -X POST "http://127.0.0.1:$node_1_rest/relay/v1/subscriptions" -H "Content-Type: application/json" -d "[\"$pubsub_topic\"]"
|
||||||
|
curl -X POST "http://127.0.0.1:$node_2_rest/relay/v1/subscriptions" -H "Content-Type: application/json" -d "[\"$pubsub_topic\"]"
|
||||||
|
|
||||||
|
|
||||||
|
printf "\nSleeping 1 seconds\n"
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
printf "\nRelay from NODE 1\n"
|
||||||
|
curl -X POST "http://127.0.0.1:$node_1_rest/relay/v1/messages/$encoded_pubsub_topic" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"payload": "UmVsYXkgd29ya3MhIQ==", "contentTopic": "'"$content_topic"'", "timestamp": '$(date +%s%N)'}'
|
||||||
|
|
||||||
|
|
||||||
|
printf "\nSleeping 1 seconds\n"
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
printf "\nCheck message in NODE 2\n"
|
||||||
|
response=$(curl -X GET "http://127.0.0.1:$node_2_rest/relay/v1/messages/$encoded_pubsub_topic" -H "Content-Type: application/json")
|
||||||
|
|
||||||
|
printf "\nResponse: $response\n"
|
||||||
|
|
||||||
|
if [ "$response" == "[]" ]; then
|
||||||
|
echo "Error: NODE 2 didn't find the message"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "Success: NODE 2 received the message"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
printf "\nCheck message was stored in NODE 2 with v1 API\n"
|
||||||
|
response=$(curl -v -X GET "http://127.0.0.1:$node_2_rest/store/v1/messages?contentTopics=$encoded_content_topic&pageSize=5&ascending=true")
|
||||||
|
|
||||||
|
printf "\nResponse: $response\n"
|
||||||
|
|
||||||
|
if [ "$response" == "[]" ] || [ -z "$response" ]; then
|
||||||
|
echo "Error: NODE 2 didn't store the message with v1 API"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "Success: NODE 2 stored the message with v1 API"
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "\nCheck message was stored in NODE 2 with v3 API\n"
|
||||||
|
response=$(curl -v -X GET "http://127.0.0.1:$node_2_rest/store/v3/messages?peerAddr=$multiaddr_with_id&contentTopics=$encoded_content_topic&pageSize=5&ascending=true")
|
||||||
|
|
||||||
|
printf "\nResponse: $response\n"
|
||||||
|
|
||||||
|
if [ "$response" == "[]" ] || [ -z "$response" ]; then
|
||||||
|
echo "Error: NODE 2 didn't stored the message with v3 API"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "Success: NODE 2 stored the message with v3 API"
|
||||||
|
fi
|
|
@ -82,3 +82,41 @@ class REST(BaseClient):
|
||||||
endpoint = f"filter/v2/messages/{quote(content_topic, safe='')}"
|
endpoint = f"filter/v2/messages/{quote(content_topic, safe='')}"
|
||||||
get_messages_response = self.rest_call("get", endpoint)
|
get_messages_response = self.rest_call("get", endpoint)
|
||||||
return get_messages_response.json()
|
return get_messages_response.json()
|
||||||
|
|
||||||
|
def get_store_messages(
|
||||||
|
self, peerAddr, includeData, pubsubTopic, contentTopics, startTime, endTime, hashes, cursor, pageSize, ascending, store_v, **kwargs
|
||||||
|
):
|
||||||
|
base_url = f"store/{store_v}/messages"
|
||||||
|
params = []
|
||||||
|
|
||||||
|
if peerAddr is not None:
|
||||||
|
params.append(f"peerAddr={quote(peerAddr, safe='')}")
|
||||||
|
if includeData is not None:
|
||||||
|
params.append(f"includeData={includeData}")
|
||||||
|
if pubsubTopic is not None:
|
||||||
|
params.append(f"pubsubTopic={quote(pubsubTopic, safe='')}")
|
||||||
|
if contentTopics is not None:
|
||||||
|
params.append(f"contentTopics={quote(contentTopics, safe='')}")
|
||||||
|
if startTime is not None:
|
||||||
|
params.append(f"startTime={startTime}")
|
||||||
|
if endTime is not None:
|
||||||
|
params.append(f"endTime={endTime}")
|
||||||
|
if hashes is not None:
|
||||||
|
params.append(f"hashes={quote(hashes, safe='')}")
|
||||||
|
if cursor is not None:
|
||||||
|
params.append(f"cursor={quote(cursor, safe='')}")
|
||||||
|
if pageSize is not None:
|
||||||
|
params.append(f"pageSize={pageSize}")
|
||||||
|
if ascending is not None:
|
||||||
|
params.append(f"ascending={ascending}")
|
||||||
|
|
||||||
|
# Append any additional keyword arguments to the parameters list
|
||||||
|
for key, value in kwargs.items():
|
||||||
|
if value is not None:
|
||||||
|
params.append(f"{key}={quote(str(value), safe='')}")
|
||||||
|
|
||||||
|
if params:
|
||||||
|
base_url += "?" + "&".join(params)
|
||||||
|
|
||||||
|
get_messages_response = self.rest_call("get", base_url)
|
||||||
|
return get_messages_response.json()
|
||||||
|
|
|
@ -17,16 +17,15 @@ class MessageRpcResponse:
|
||||||
rate_limit_proof: Optional[dict] = field(default_factory=dict)
|
rate_limit_proof: Optional[dict] = field(default_factory=dict)
|
||||||
|
|
||||||
|
|
||||||
message_rpc_response_schema = class_schema(MessageRpcResponse)()
|
|
||||||
|
|
||||||
|
|
||||||
class WakuMessage:
|
class WakuMessage:
|
||||||
def __init__(self, message_response):
|
def __init__(self, message_response, schema=MessageRpcResponse):
|
||||||
|
self.schema = schema
|
||||||
self.received_messages = message_response
|
self.received_messages = message_response
|
||||||
|
self.message_rpc_response_schema = class_schema(self.schema)()
|
||||||
|
|
||||||
@allure.step
|
@allure.step
|
||||||
def assert_received_message(self, sent_message, index=0):
|
def assert_received_message(self, sent_message, index=0):
|
||||||
message = message_rpc_response_schema.load(self.received_messages[index])
|
message = self.message_rpc_response_schema.load(self.received_messages[index])
|
||||||
|
|
||||||
def assert_fail_message(field_name):
|
def assert_fail_message(field_name):
|
||||||
return f"Incorrect field: {field_name}. Published: {sent_message[field_name]} Received: {getattr(message, field_name)}"
|
return f"Incorrect field: {field_name}. Published: {sent_message[field_name]} Received: {getattr(message, field_name)}"
|
||||||
|
|
|
@ -260,6 +260,24 @@ class WakuNode:
|
||||||
def get_filter_messages(self, content_topic, pubsub_topic=None):
|
def get_filter_messages(self, content_topic, pubsub_topic=None):
|
||||||
return self._api.get_filter_messages(content_topic, pubsub_topic)
|
return self._api.get_filter_messages(content_topic, pubsub_topic)
|
||||||
|
|
||||||
|
def get_store_messages(
|
||||||
|
self, peerAddr, includeData, pubsubTopic, contentTopics, startTime, endTime, hashes, cursor, pageSize, ascending, store_v, **kwargs
|
||||||
|
):
|
||||||
|
return self._api.get_store_messages(
|
||||||
|
peerAddr=peerAddr,
|
||||||
|
includeData=includeData,
|
||||||
|
pubsubTopic=pubsubTopic,
|
||||||
|
contentTopics=contentTopics,
|
||||||
|
startTime=startTime,
|
||||||
|
endTime=endTime,
|
||||||
|
hashes=hashes,
|
||||||
|
cursor=cursor,
|
||||||
|
pageSize=pageSize,
|
||||||
|
ascending=ascending,
|
||||||
|
store_v=store_v,
|
||||||
|
**kwargs,
|
||||||
|
)
|
||||||
|
|
||||||
def get_metrics(self):
|
def get_metrics(self):
|
||||||
if self.is_nwaku():
|
if self.is_nwaku():
|
||||||
metrics = requests.get(f"http://localhost:{self._metrics_port}/metrics")
|
metrics = requests.get(f"http://localhost:{self._metrics_port}/metrics")
|
||||||
|
|
|
@ -0,0 +1,204 @@
|
||||||
|
import inspect
|
||||||
|
import os
|
||||||
|
from src.libs.custom_logger import get_custom_logger
|
||||||
|
from time import time
|
||||||
|
import pytest
|
||||||
|
import allure
|
||||||
|
from src.libs.common import to_base64, delay, gen_step_id
|
||||||
|
from src.node.waku_message import WakuMessage
|
||||||
|
from src.env_vars import (
|
||||||
|
ADDITIONAL_NODES,
|
||||||
|
NODE_1,
|
||||||
|
NODE_2,
|
||||||
|
)
|
||||||
|
from src.node.waku_node import WakuNode, rln_credential_store_ready
|
||||||
|
from tenacity import retry, stop_after_delay, wait_fixed
|
||||||
|
from src.test_data import VALID_PUBSUB_TOPICS
|
||||||
|
|
||||||
|
logger = get_custom_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class StepsStore:
|
||||||
|
test_content_topic = "/myapp/1/latest/proto"
|
||||||
|
test_pubsub_topic = "/waku/2/rs/0/0"
|
||||||
|
test_payload = "Store works!!"
|
||||||
|
|
||||||
|
@pytest.fixture(scope="function", autouse=True)
|
||||||
|
def store_setup(self):
|
||||||
|
logger.debug(f"Running fixture setup: {inspect.currentframe().f_code.co_name}")
|
||||||
|
self.main_publishing_nodes = []
|
||||||
|
self.store_nodes = []
|
||||||
|
self.optional_nodes = []
|
||||||
|
self.multiaddr_list = []
|
||||||
|
|
||||||
|
@allure.step
|
||||||
|
def add_node_peer(self, node):
|
||||||
|
if node.is_nwaku():
|
||||||
|
for multiaddr in self.multiaddr_list:
|
||||||
|
node.add_peers([multiaddr])
|
||||||
|
|
||||||
|
@allure.step
|
||||||
|
def start_publishing_node(self, image, node_index, **kwargs):
|
||||||
|
node = WakuNode(image, f"publishing_node{node_index}_{self.test_id}")
|
||||||
|
node.start(**kwargs)
|
||||||
|
if kwargs["relay"] == "true":
|
||||||
|
self.main_publishing_nodes.extend([node])
|
||||||
|
if kwargs["store"] == "true":
|
||||||
|
self.store_nodes.extend([node])
|
||||||
|
self.add_node_peer(node)
|
||||||
|
self.multiaddr_list.extend([node.get_multiaddr_with_id()])
|
||||||
|
return node
|
||||||
|
|
||||||
|
@allure.step
|
||||||
|
def setup_store_node(self, image, node_index, **kwargs):
|
||||||
|
node = WakuNode(image, f"store_node{node_index}_{self.test_id}")
|
||||||
|
node.start(discv5_bootstrap_node=self.enr_uri, storenode=self.multiaddr_list[0], **kwargs)
|
||||||
|
if kwargs["relay"] == "true":
|
||||||
|
self.main_publishing_nodes.extend([node])
|
||||||
|
self.store_nodes.extend([node])
|
||||||
|
self.add_node_peer(node)
|
||||||
|
return node
|
||||||
|
|
||||||
|
@allure.step
|
||||||
|
def setup_first_publishing_node(self, store="true", relay="true", **kwargs):
|
||||||
|
self.publishing_node1 = self.start_publishing_node(NODE_1, node_index=1, store=store, relay=relay, **kwargs)
|
||||||
|
self.enr_uri = self.publishing_node1.get_enr_uri()
|
||||||
|
|
||||||
|
@allure.step
|
||||||
|
def setup_second_publishing_node(self, store, relay, **kwargs):
|
||||||
|
self.publishing_node2 = self.start_publishing_node(NODE_1, node_index=2, store=store, relay=relay, **kwargs)
|
||||||
|
|
||||||
|
@allure.step
|
||||||
|
def setup_additional_publishing_nodes(self, node_list=ADDITIONAL_NODES, **kwargs):
|
||||||
|
if node_list:
|
||||||
|
nodes = [node.strip() for node in node_list.split(",") if node]
|
||||||
|
else:
|
||||||
|
pytest.skip("ADDITIONAL_NODES/node_list is empty, cannot run test")
|
||||||
|
for index, node in enumerate(nodes):
|
||||||
|
self.start_publishing_node(node, node_index=index + 2, store="true", relay="true", **kwargs)
|
||||||
|
|
||||||
|
@allure.step
|
||||||
|
def setup_first_store_node(self, store="true", relay="true", **kwargs):
|
||||||
|
self.store_node1 = self.setup_store_node(NODE_2, node_index=1, store=store, relay=relay, **kwargs)
|
||||||
|
|
||||||
|
@allure.step
|
||||||
|
def setup_second_store_node(self, store="true", relay="false", **kwargs):
|
||||||
|
self.store_node2 = self.setup_store_node(NODE_2, node_index=2, store=store, relay=relay, **kwargs)
|
||||||
|
|
||||||
|
@allure.step
|
||||||
|
def setup_additional_store_nodes(self, node_list=ADDITIONAL_NODES, **kwargs):
|
||||||
|
if node_list:
|
||||||
|
nodes = [node.strip() for node in node_list.split(",") if node]
|
||||||
|
else:
|
||||||
|
pytest.skip("ADDITIONAL_NODES/node_list is empty, cannot run test")
|
||||||
|
self.additional_store_nodes = []
|
||||||
|
for index, node in enumerate(nodes):
|
||||||
|
node = self.setup_store_node(node, node_index=index + 2, store="true", relay="false", **kwargs)
|
||||||
|
self.additional_store_nodes.append(node)
|
||||||
|
|
||||||
|
@allure.step
|
||||||
|
def subscribe_to_pubsub_topics_via_relay(self, node=None, pubsub_topics=None):
|
||||||
|
if pubsub_topics is None:
|
||||||
|
pubsub_topics = [self.test_pubsub_topic]
|
||||||
|
if not node:
|
||||||
|
node = self.main_publishing_nodes
|
||||||
|
if isinstance(node, list):
|
||||||
|
for node in node:
|
||||||
|
node.set_relay_subscriptions(pubsub_topics)
|
||||||
|
else:
|
||||||
|
node.set_relay_subscriptions(pubsub_topics)
|
||||||
|
|
||||||
|
@allure.step
|
||||||
|
def subscribe_to_pubsub_topics_via_filter(self, node, pubsub_topic=None, content_topic=None):
|
||||||
|
if pubsub_topic is None:
|
||||||
|
pubsub_topic = self.test_pubsub_topic
|
||||||
|
if content_topic is None:
|
||||||
|
content_topic = [self.test_content_topic]
|
||||||
|
subscription = {"requestId": "1", "contentFilters": content_topic, "pubsubTopic": pubsub_topic}
|
||||||
|
node.set_filter_subscriptions(subscription)
|
||||||
|
|
||||||
|
@allure.step
|
||||||
|
def publish_message_via(self, type, pubsub_topic=None, message=None, message_propagation_delay=0.1, sender=None):
|
||||||
|
self.message = self.create_message() if message is None else message
|
||||||
|
if pubsub_topic is None:
|
||||||
|
pubsub_topic = self.test_pubsub_topic
|
||||||
|
if not sender:
|
||||||
|
sender = self.publishing_node1
|
||||||
|
if type == "relay":
|
||||||
|
logger.debug("Relaying message")
|
||||||
|
sender.send_relay_message(self.message, pubsub_topic)
|
||||||
|
elif type == "lightpush":
|
||||||
|
payload = self.create_payload(pubsub_topic, self.message)
|
||||||
|
sender.send_light_push_message(payload)
|
||||||
|
delay(message_propagation_delay)
|
||||||
|
|
||||||
|
@allure.step
|
||||||
|
def check_published_message_is_stored(
|
||||||
|
self,
|
||||||
|
store_node=None,
|
||||||
|
peerAddr=None,
|
||||||
|
includeData=None,
|
||||||
|
pubsubTopic=None,
|
||||||
|
contentTopics=None,
|
||||||
|
startTime=None,
|
||||||
|
endTime=None,
|
||||||
|
hashes=None,
|
||||||
|
cursor=None,
|
||||||
|
pageSize=None,
|
||||||
|
ascending=None,
|
||||||
|
store_v="v1",
|
||||||
|
**kwargs,
|
||||||
|
):
|
||||||
|
if store_node is None:
|
||||||
|
store_node = self.store_nodes
|
||||||
|
elif not isinstance(store_node, list):
|
||||||
|
store_node = [store_node]
|
||||||
|
else:
|
||||||
|
store_node = store_node
|
||||||
|
for node in store_node:
|
||||||
|
logger.debug(f"Checking that peer {node.image} can find the stored message")
|
||||||
|
self.store_response = node.get_store_messages(
|
||||||
|
peerAddr=peerAddr,
|
||||||
|
includeData=includeData,
|
||||||
|
pubsubTopic=pubsubTopic,
|
||||||
|
contentTopics=contentTopics,
|
||||||
|
startTime=startTime,
|
||||||
|
endTime=endTime,
|
||||||
|
hashes=hashes,
|
||||||
|
cursor=cursor,
|
||||||
|
pageSize=pageSize,
|
||||||
|
ascending=ascending,
|
||||||
|
store_v=store_v,
|
||||||
|
**kwargs,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert "messages" in self.store_response, f"Peer {node.image} has no messages key in the reponse"
|
||||||
|
assert self.store_response["messages"], f"Peer {node.image} couldn't find any messages"
|
||||||
|
assert len(self.store_response["messages"]) >= 1, "Expected at least 1 message but got none"
|
||||||
|
waku_message = WakuMessage(self.store_response["messages"][-1:])
|
||||||
|
waku_message.assert_received_message(self.message)
|
||||||
|
|
||||||
|
@allure.step
|
||||||
|
def check_store_returns_empty_response(self, pubsub_topic=None):
|
||||||
|
if not pubsub_topic:
|
||||||
|
pubsub_topic = self.test_pubsub_topic
|
||||||
|
try:
|
||||||
|
self.check_published_message_is_stored(pubsubTopic=pubsub_topic, pageSize=5, ascending="true")
|
||||||
|
except Exception as ex:
|
||||||
|
assert "couldn't find any messages" in str(ex)
|
||||||
|
|
||||||
|
@allure.step
|
||||||
|
def create_message(self, **kwargs):
|
||||||
|
message = {"payload": to_base64(self.test_payload), "contentTopic": self.test_content_topic, "timestamp": int(time() * 1e9)}
|
||||||
|
message.update(kwargs)
|
||||||
|
return message
|
||||||
|
|
||||||
|
@allure.step
|
||||||
|
def create_payload(self, pubsub_topic=None, message=None, **kwargs):
|
||||||
|
if message is None:
|
||||||
|
message = self.create_message()
|
||||||
|
if pubsub_topic is None:
|
||||||
|
pubsub_topic = self.test_pubsub_topic
|
||||||
|
payload = {"pubsubTopic": pubsub_topic, "message": message}
|
||||||
|
payload.update(kwargs)
|
||||||
|
return payload
|
|
@ -0,0 +1,30 @@
|
||||||
|
import pytest
|
||||||
|
from src.libs.custom_logger import get_custom_logger
|
||||||
|
from src.libs.common import to_base64
|
||||||
|
from src.steps.store import StepsStore
|
||||||
|
from src.test_data import SAMPLE_INPUTS
|
||||||
|
|
||||||
|
logger = get_custom_logger(__name__)
|
||||||
|
|
||||||
|
# TO DO test without pubsubtopic freezes
|
||||||
|
|
||||||
|
|
||||||
|
class TestGetMessages(StepsStore):
|
||||||
|
@pytest.fixture(scope="function", autouse=True)
|
||||||
|
def store_functional_setup(self, store_setup):
|
||||||
|
self.setup_first_publishing_node(store="true", relay="true")
|
||||||
|
self.setup_first_store_node(store="true", relay="true")
|
||||||
|
self.subscribe_to_pubsub_topics_via_relay()
|
||||||
|
|
||||||
|
def test_store_messages_with_valid_payloads(self):
|
||||||
|
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.publish_message_via("relay", message=message)
|
||||||
|
self.check_published_message_is_stored(pubsubTopic=self.test_pubsub_topic, pageSize=50, ascending="true")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f'Payload {payload["description"]} failed: {str(e)}')
|
||||||
|
failed_payloads.append(payload["description"])
|
||||||
|
assert not failed_payloads, f"Payloads failed: {failed_payloads}"
|
|
@ -0,0 +1,81 @@
|
||||||
|
import pytest
|
||||||
|
from src.env_vars import NODE_2
|
||||||
|
from src.steps.store import StepsStore
|
||||||
|
|
||||||
|
|
||||||
|
class TestRunningNodes(StepsStore):
|
||||||
|
def test_main_node_relay_and_store__peer_relay_and_store(self):
|
||||||
|
self.setup_first_publishing_node(store="true", relay="true")
|
||||||
|
self.setup_first_store_node(store="true", relay="true")
|
||||||
|
self.subscribe_to_pubsub_topics_via_relay()
|
||||||
|
self.publish_message_via("relay")
|
||||||
|
self.check_published_message_is_stored(pubsubTopic=self.test_pubsub_topic, pageSize=5, ascending="true")
|
||||||
|
|
||||||
|
def test_main_node_relay_and_store__peer_only_store(self):
|
||||||
|
self.setup_first_publishing_node(store="true", relay="true")
|
||||||
|
self.setup_first_store_node(store="true", relay="false")
|
||||||
|
self.subscribe_to_pubsub_topics_via_relay()
|
||||||
|
self.publish_message_via("relay")
|
||||||
|
if self.store_node1.is_gowaku():
|
||||||
|
self.check_published_message_is_stored(pubsubTopic=self.test_pubsub_topic, pageSize=5, ascending="true")
|
||||||
|
elif self.store_node1.is_nwaku():
|
||||||
|
self.check_store_returns_empty_response()
|
||||||
|
|
||||||
|
def test_main_node_relay_and_store__peer_only_relay(self):
|
||||||
|
self.setup_first_publishing_node(store="true", relay="true")
|
||||||
|
self.setup_first_store_node(store="false", relay="true")
|
||||||
|
self.subscribe_to_pubsub_topics_via_relay()
|
||||||
|
self.publish_message_via("relay")
|
||||||
|
self.check_published_message_is_stored(pubsubTopic=self.test_pubsub_topic, pageSize=5, ascending="true")
|
||||||
|
|
||||||
|
def test_main_node_relay_and_store__peer_neither_relay_nor_store(self):
|
||||||
|
self.setup_first_publishing_node(store="true", relay="true")
|
||||||
|
self.setup_first_store_node(store="false", relay="false")
|
||||||
|
self.subscribe_to_pubsub_topics_via_relay()
|
||||||
|
self.publish_message_via("relay")
|
||||||
|
self.check_published_message_is_stored(pubsubTopic=self.test_pubsub_topic, pageSize=5, ascending="true")
|
||||||
|
|
||||||
|
@pytest.mark.xfail("go-waku" in NODE_2, reason="Bug reported: https://github.com/waku-org/go-waku/issues/1087")
|
||||||
|
def test_main_node_only_relay__peer_relay_and_store(self):
|
||||||
|
self.setup_first_publishing_node(store="false", relay="true")
|
||||||
|
self.setup_first_store_node(store="true", relay="true")
|
||||||
|
self.subscribe_to_pubsub_topics_via_relay()
|
||||||
|
self.publish_message_via("relay")
|
||||||
|
self.check_published_message_is_stored(pubsubTopic=self.test_pubsub_topic, pageSize=5, ascending="true")
|
||||||
|
|
||||||
|
def test_main_node_only_relay__peer_only_store(self):
|
||||||
|
self.setup_first_publishing_node(store="false", relay="true")
|
||||||
|
self.setup_first_store_node(store="true", relay="false")
|
||||||
|
self.subscribe_to_pubsub_topics_via_relay()
|
||||||
|
self.publish_message_via("relay")
|
||||||
|
if self.store_node1.is_gowaku():
|
||||||
|
try:
|
||||||
|
self.check_published_message_is_stored(pubsubTopic=self.test_pubsub_topic, pageSize=5, ascending="true")
|
||||||
|
except Exception as ex:
|
||||||
|
assert "failed to negotiate protocol: protocols not supported" in str(ex)
|
||||||
|
elif self.store_node1.is_nwaku():
|
||||||
|
self.check_store_returns_empty_response()
|
||||||
|
|
||||||
|
def test_main_node_only_relay__peer_only_relay(self):
|
||||||
|
self.setup_first_publishing_node(store="false", relay="true")
|
||||||
|
self.setup_first_store_node(store="false", relay="true")
|
||||||
|
self.subscribe_to_pubsub_topics_via_relay()
|
||||||
|
self.publish_message_via("relay")
|
||||||
|
try:
|
||||||
|
self.check_published_message_is_stored(pubsubTopic=self.test_pubsub_topic, pageSize=5, ascending="true")
|
||||||
|
except Exception as ex:
|
||||||
|
assert "failed to negotiate protocol: protocols not supported" in str(ex) or "PEER_DIAL_FAILURE" in str(ex)
|
||||||
|
|
||||||
|
def test_store_lightpushed_message(self):
|
||||||
|
self.setup_first_publishing_node(store="true", relay="true", lightpush="true")
|
||||||
|
self.setup_first_store_node(store="false", relay="false", lightpush="true", lightpushnode=self.multiaddr_list[0])
|
||||||
|
self.subscribe_to_pubsub_topics_via_relay()
|
||||||
|
self.publish_message_via("lightpush", sender=self.store_node1)
|
||||||
|
self.check_published_message_is_stored(pubsubTopic=self.test_pubsub_topic, pageSize=5, ascending="true")
|
||||||
|
|
||||||
|
def test_store_with_filter(self):
|
||||||
|
self.setup_first_publishing_node(store="true", relay="true", filter="true")
|
||||||
|
self.setup_first_store_node(store="false", relay="false", filter="true")
|
||||||
|
self.subscribe_to_pubsub_topics_via_relay()
|
||||||
|
self.publish_message_via("relay")
|
||||||
|
self.check_published_message_is_stored(pubsubTopic=self.test_pubsub_topic, pageSize=5, ascending="true")
|
Loading…
Reference in New Issue