2025-02-13 12:24:33 +02:00
package waku
import (
2025-02-19 09:21:59 +02:00
"fmt"
2025-04-04 11:53:36 +03:00
"slices"
2025-02-13 12:24:33 +02:00
"testing"
"time"
2025-02-19 09:21:59 +02:00
"github.com/cenkalti/backoff/v3"
2025-12-12 22:48:53 +01:00
"github.com/logos-messaging/logos-messaging-go-bindings/waku/common"
2025-02-13 12:24:33 +02:00
"github.com/stretchr/testify/require"
"github.com/waku-org/go-waku/waku/v2/protocol/pb"
"google.golang.org/protobuf/proto"
)
2025-02-19 09:21:59 +02:00
func TestVerifyNumConnectedRelayPeers ( t * testing . T ) {
2025-02-13 12:24:33 +02:00
2025-02-19 09:21:59 +02:00
node1Cfg := DefaultWakuConfig
node1Cfg . Relay = true
node1 , err := StartWakuNode ( "node1" , & node1Cfg )
if err != nil {
t . Fatalf ( "Failed to start node1: %v" , err )
}
node2Cfg := DefaultWakuConfig
node2Cfg . Relay = true
node2 , err := StartWakuNode ( "node2" , & node2Cfg )
if err != nil {
t . Fatalf ( "Failed to start node2: %v" , err )
}
2025-02-16 13:30:57 +02:00
2025-02-19 09:21:59 +02:00
node3 , err := StartWakuNode ( "node3" , nil )
if err != nil {
t . Fatalf ( "Failed to start node3: %v" , err )
}
2025-02-13 12:24:33 +02:00
defer func ( ) {
2025-02-16 13:30:57 +02:00
node1 . StopAndDestroy ( )
node2 . StopAndDestroy ( )
node3 . StopAndDestroy ( )
2025-02-13 12:24:33 +02:00
} ( )
2025-02-19 09:21:59 +02:00
err = node2 . ConnectPeer ( node1 )
if err != nil {
t . Fatalf ( "Failed to connect node2 to node1: %v" , err )
}
2025-02-16 13:30:57 +02:00
2025-02-19 09:21:59 +02:00
err = node3 . ConnectPeer ( node1 )
if err != nil {
t . Fatalf ( "Failed to connect node3 to node1: %v" , err )
}
connectedPeersNode1 , err := node1 . GetConnectedPeers ( )
if err != nil {
t . Fatalf ( "Failed to get connected peers for node1: %v" , err )
}
if len ( connectedPeersNode1 ) != 2 {
t . Fatalf ( "Expected 2 connected peers on node1, but got %d" , len ( connectedPeersNode1 ) )
}
2025-02-16 13:30:57 +02:00
2025-02-19 09:21:59 +02:00
numRelayPeers , err := node1 . GetNumConnectedRelayPeers ( )
if err != nil {
t . Fatalf ( "Failed to get connected relay peers for node1: %v" , err )
}
if numRelayPeers != 1 {
t . Fatalf ( "Expected 1 relay peer on node1, but got %d" , numRelayPeers )
2025-02-16 13:30:57 +02:00
}
2025-02-19 09:21:59 +02:00
t . Logf ( "Successfully connected node2 and node3 to node1. Relay Peers: %d, Total Peers: %d" , numRelayPeers , len ( connectedPeersNode1 ) )
2025-02-13 12:24:33 +02:00
}
2025-04-04 11:53:36 +03:00
func TestVerifyConnectedRelayPeers ( t * testing . T ) {
customShard := uint16 ( 65 )
customPubsubTopic := FormatWakuRelayTopic ( DEFAULT_CLUSTER_ID , customShard )
node1Cfg := DefaultWakuConfig
node1Cfg . Relay = true
node1Cfg . Shards = [ ] uint16 { 64 , customShard }
node1 , err := StartWakuNode ( "node1" , & node1Cfg )
if err != nil {
t . Fatalf ( "Failed to start node1: %v" , err )
}
node2Cfg := DefaultWakuConfig
node2Cfg . Relay = true
node2 , err := StartWakuNode ( "node2" , & node2Cfg )
if err != nil {
t . Fatalf ( "Failed to start node2: %v" , err )
}
node2PeerID , err := node2 . PeerID ( )
require . NoError ( t , err , "Failed to get PeerID for Node 2" )
node3 , err := StartWakuNode ( "node3" , nil )
if err != nil {
t . Fatalf ( "Failed to start node3: %v" , err )
}
node4Cfg := DefaultWakuConfig
node4Cfg . Relay = true
node4Cfg . Shards = [ ] uint16 { customShard }
node4 , err := StartWakuNode ( "node4" , & node4Cfg )
if err != nil {
t . Fatalf ( "Failed to start node4: %v" , err )
}
node4PeerID , err := node4 . PeerID ( )
require . NoError ( t , err , "Failed to get PeerID for Node 4" )
defer func ( ) {
node1 . StopAndDestroy ( )
node2 . StopAndDestroy ( )
node3 . StopAndDestroy ( )
node4 . StopAndDestroy ( )
} ( )
err = node2 . ConnectPeer ( node1 )
if err != nil {
t . Fatalf ( "Failed to connect node2 to node1: %v" , err )
}
err = node3 . ConnectPeer ( node1 )
if err != nil {
t . Fatalf ( "Failed to connect node3 to node1: %v" , err )
}
err = node4 . ConnectPeer ( node1 )
if err != nil {
t . Fatalf ( "Failed to connect node4 to node1: %v" , err )
}
connectedPeersNode1 , err := node1 . GetConnectedPeers ( )
if err != nil {
t . Fatalf ( "Failed to get connected peers for node1: %v" , err )
}
if len ( connectedPeersNode1 ) != 3 {
t . Fatalf ( "Expected 2 connected peers on node1, but got %d" , len ( connectedPeersNode1 ) )
}
relayPeers , err := node1 . GetConnectedRelayPeers ( )
if err != nil {
t . Fatalf ( "Failed to get connected relay peers for node1: %v" , err )
}
if len ( relayPeers ) != 2 {
t . Fatalf ( "Expected 2 relay peers on node1, but got %d" , len ( relayPeers ) )
}
require . True ( t , slices . Contains ( relayPeers , node2PeerID ) , "Node 2 should be included in node 1's connected relay peers" )
require . True ( t , slices . Contains ( relayPeers , node4PeerID ) , "Node 4 should be included in node 1's connected relay peers" )
relayPeersDefaultPubsub , err := node1 . GetConnectedRelayPeers ( DefaultPubsubTopic )
if err != nil {
t . Fatalf ( "Failed to get connected relay peers for node1 and default pubsub topic: %v" , err )
}
if len ( relayPeersDefaultPubsub ) != 1 {
t . Fatalf ( "Expected 1 relay peers on node1 for default pubsub topic, but got %d" , len ( relayPeersDefaultPubsub ) )
}
require . True ( t , slices . Contains ( relayPeersDefaultPubsub , node2PeerID ) , "Node 2 should be included in node 1's connected relay peers for the default pubsub topic" )
relayPeersCustomPubsub , err := node1 . GetConnectedRelayPeers ( customPubsubTopic )
if err != nil {
t . Fatalf ( "Failed to get connected relay peers for node1 and custom pubsub topic: %v" , err )
}
if len ( relayPeersCustomPubsub ) != 1 {
t . Fatalf ( "Expected 1 relay peers on node1 for custom pubsub topic, but got %d" , len ( relayPeersCustomPubsub ) )
}
require . True ( t , slices . Contains ( relayPeersCustomPubsub , node4PeerID ) , "Node 4 should be included in node 1's connected relay peers for the custom pubsub topic" )
t . Logf ( "Successfully connected node2, node3 and node4 to node1. Relay Peers: %d, Total Peers: %d" , len ( relayPeers ) , len ( connectedPeersNode1 ) )
}
2025-02-13 12:24:33 +02:00
func TestRelayMessageTransmission ( t * testing . T ) {
Debug ( "Starting TestRelayMessageTransmission" )
2025-02-16 13:30:57 +02:00
Debug ( "Creating Sender Node with Relay enabled" )
2025-02-13 12:24:33 +02:00
senderConfig := DefaultWakuConfig
senderConfig . Relay = true
2025-02-16 13:30:57 +02:00
2025-02-13 12:24:33 +02:00
senderNode , err := StartWakuNode ( "SenderNode" , & senderConfig )
2025-02-16 13:30:57 +02:00
require . NoError ( t , err , "Failed to start SenderNode" )
2025-02-13 12:24:33 +02:00
defer senderNode . StopAndDestroy ( )
2025-02-16 13:30:57 +02:00
Debug ( "Creating Receiver Node with Relay enabled" )
2025-02-13 12:24:33 +02:00
receiverConfig := DefaultWakuConfig
receiverConfig . Relay = true
2025-02-16 13:30:57 +02:00
// Set the Receiver Node's discovery bootstrap node as SenderNode
enrSender , err := senderNode . ENR ( )
require . NoError ( t , err , "Failed to get ENR for SenderNode" )
receiverConfig . Discv5BootstrapNodes = [ ] string { enrSender . String ( ) }
2025-02-13 12:24:33 +02:00
receiverNode , err := StartWakuNode ( "ReceiverNode" , & receiverConfig )
2025-02-16 13:30:57 +02:00
require . NoError ( t , err , "Failed to start ReceiverNode" )
2025-02-13 12:24:33 +02:00
defer receiverNode . StopAndDestroy ( )
2025-02-16 13:30:57 +02:00
Debug ( "Waiting for nodes to auto-connect via Discv5" )
err = WaitForAutoConnection ( [ ] * WakuNode { senderNode , receiverNode } )
require . NoError ( t , err , "Nodes did not auto-connect within timeout" )
2025-02-13 12:24:33 +02:00
Debug ( "Creating and publishing message" )
message := senderNode . CreateMessage ( )
var msgHash string
2025-02-16 13:30:57 +02:00
2025-02-13 12:24:33 +02:00
err = RetryWithBackOff ( func ( ) error {
var err error
2025-02-19 11:40:37 +02:00
msgHashObj , err := senderNode . RelayPublishNoCTX ( DefaultPubsubTopic , message )
2025-02-13 12:24:33 +02:00
if err == nil {
msgHash = msgHashObj . String ( )
}
return err
} )
require . NoError ( t , err )
require . NotEmpty ( t , msgHash )
Debug ( "Verifying message reception" )
err = RetryWithBackOff ( func ( ) error {
msgHashObj , _ := common . ToMessageHash ( msgHash )
return receiverNode . VerifyMessageReceived ( message , msgHashObj )
} )
2025-02-16 13:30:57 +02:00
require . NoError ( t , err , "Message verification failed" )
2025-02-13 12:24:33 +02:00
Debug ( "TestRelayMessageTransmission completed successfully" )
}
func TestRelayMessageBroadcast ( t * testing . T ) {
Debug ( "Starting TestRelayMessageBroadcast" )
numPeers := 5
nodes := make ( [ ] * WakuNode , numPeers )
nodeNames := [ ] string { "SenderNode" , "PeerNode1" , "PeerNode2" , "PeerNode3" , "PeerNode4" }
defaultPubsubTopic := DefaultPubsubTopic
for i := 0 ; i < numPeers ; i ++ {
Debug ( "Creating node %s" , nodeNames [ i ] )
nodeConfig := DefaultWakuConfig
nodeConfig . Relay = true
2025-02-16 13:30:57 +02:00
if i > 0 {
enrPrevNode , err := nodes [ i - 1 ] . ENR ( )
require . NoError ( t , err , "Failed to get ENR for node %s" , nodeNames [ i - 1 ] )
nodeConfig . Discv5BootstrapNodes = [ ] string { enrPrevNode . String ( ) }
}
2025-02-13 12:24:33 +02:00
node , err := StartWakuNode ( nodeNames [ i ] , & nodeConfig )
require . NoError ( t , err )
defer node . StopAndDestroy ( )
nodes [ i ] = node
}
2025-02-16 13:30:57 +02:00
WaitForAutoConnection ( nodes )
2025-02-13 12:24:33 +02:00
senderNode := nodes [ 0 ]
Debug ( "SenderNode is publishing a message" )
message := senderNode . CreateMessage ( )
msgHash , err := senderNode . RelayPublishNoCTX ( defaultPubsubTopic , message )
require . NoError ( t , err )
require . NotEmpty ( t , msgHash )
Debug ( "Waiting to ensure message delivery" )
time . Sleep ( 3 * time . Second )
Debug ( "Verifying message reception for each node" )
for i , node := range nodes {
Debug ( "Verifying message for node %s" , nodeNames [ i ] )
err := node . VerifyMessageReceived ( message , msgHash )
require . NoError ( t , err , "message verification failed for node: %s" , nodeNames [ i ] )
}
Debug ( "TestRelayMessageBroadcast completed successfully" )
}
func TestSendmsgInvalidPayload ( t * testing . T ) {
Debug ( "Starting TestInvalidMessageFormat" )
defaultPubsubTopic := DefaultPubsubTopic
Debug ( "Creating nodes" )
senderNodeConfig := DefaultWakuConfig
senderNodeConfig . Relay = true
2025-02-16 13:30:57 +02:00
senderNode , err := StartWakuNode ( "SenderNode" , & senderNodeConfig )
2025-02-13 12:24:33 +02:00
require . NoError ( t , err )
defer senderNode . StopAndDestroy ( )
receiverNodeConfig := DefaultWakuConfig
receiverNodeConfig . Relay = true
2025-02-16 13:30:57 +02:00
enrNode2 , err := senderNode . ENR ( )
if err != nil {
require . Error ( t , err , "Can't find node ENR" )
}
receiverNodeConfig . Discv5BootstrapNodes = [ ] string { enrNode2 . String ( ) }
receiverNode , err := StartWakuNode ( "receiverNode" , & receiverNodeConfig )
2025-02-13 12:24:33 +02:00
require . NoError ( t , err )
defer receiverNode . StopAndDestroy ( )
2025-02-16 13:30:57 +02:00
err = WaitForAutoConnection ( [ ] * WakuNode { senderNode , receiverNode } )
require . NoError ( t , err , "Nodes did not auto-connect within timeout" )
2025-02-13 12:24:33 +02:00
Debug ( "SenderNode is publishing an invalid message" )
invalidMessage := & pb . WakuMessage {
2025-02-16 13:30:57 +02:00
Payload : [ ] byte { } ,
ContentTopic : "test-content-topic" ,
Version : proto . Uint32 ( 0 ) ,
Timestamp : proto . Int64 ( time . Now ( ) . UnixNano ( ) ) ,
2025-02-13 12:24:33 +02:00
}
message := senderNode . CreateMessage ( invalidMessage )
2025-02-16 13:30:57 +02:00
var msgHash common . MessageHash
msgHash , err = senderNode . RelayPublishNoCTX ( defaultPubsubTopic , message )
2025-02-13 12:24:33 +02:00
Debug ( "Verifying if message was sent or failed" )
if err != nil {
Debug ( "Message was not sent due to invalid format: %v" , err )
2025-02-16 13:30:57 +02:00
2025-02-13 12:24:33 +02:00
} else {
Debug ( "Message was unexpectedly sent: %s" , msgHash . String ( ) )
require . Fail ( t , "message with invalid format should not be sent" )
}
Debug ( "TestInvalidMessageFormat completed" )
}
2025-02-16 13:30:57 +02:00
func TestRelayNodesNotConnectedDirectly ( t * testing . T ) {
2025-02-19 09:21:59 +02:00
Debug ( "Starting TestRelayNodesNotConnectedDirectly" )
2025-02-13 12:24:33 +02:00
2025-02-16 13:30:57 +02:00
Debug ( "Creating Sender Node with Relay enabled" )
2025-02-13 12:24:33 +02:00
senderConfig := DefaultWakuConfig
senderConfig . Relay = true
senderNode , err := StartWakuNode ( "SenderNode" , & senderConfig )
require . NoError ( t , err )
defer senderNode . StopAndDestroy ( )
2025-02-16 13:30:57 +02:00
Debug ( "Creating Relay-Enabled Receiver Node (Node2)" )
node2Config := DefaultWakuConfig
node2Config . Relay = true
2025-02-19 09:21:59 +02:00
// Use static nodes instead of ENR
node1Address , err := senderNode . ListenAddresses ( )
require . NoError ( t , err , "Failed to get sender node address" )
node2Config . Staticnodes = [ ] string { node1Address [ 0 ] . String ( ) }
2025-02-16 13:30:57 +02:00
node2 , err := StartWakuNode ( "Node2" , & node2Config )
2025-02-13 12:24:33 +02:00
require . NoError ( t , err )
2025-02-16 13:30:57 +02:00
defer node2 . StopAndDestroy ( )
2025-02-13 12:24:33 +02:00
2025-02-19 09:21:59 +02:00
Debug ( "Creating Relay-Enabled Receiver Node (Node3)" )
2025-02-16 13:30:57 +02:00
node3Config := DefaultWakuConfig
node3Config . Relay = true
2025-02-19 09:21:59 +02:00
// Use static nodes instead of Discv5
node2Address , err := node2 . ListenAddresses ( )
require . NoError ( t , err , "Failed to get node2 address" )
node3Config . Staticnodes = [ ] string { node2Address [ 0 ] . String ( ) }
2025-02-16 13:30:57 +02:00
node3 , err := StartWakuNode ( "Node3" , & node3Config )
2025-02-13 12:24:33 +02:00
require . NoError ( t , err )
2025-02-16 13:30:57 +02:00
defer node3 . StopAndDestroy ( )
2025-02-13 12:24:33 +02:00
2025-02-19 09:21:59 +02:00
Debug ( "Waiting for nodes to connect before proceeding" )
2025-02-16 13:30:57 +02:00
err = WaitForAutoConnection ( [ ] * WakuNode { senderNode , node2 , node3 } )
2025-02-19 09:21:59 +02:00
require . NoError ( t , err , "Nodes did not connect within timeout" )
2025-02-16 13:30:57 +02:00
2025-02-13 12:24:33 +02:00
Debug ( "SenderNode is publishing a message" )
message := senderNode . CreateMessage ( )
2025-02-19 11:40:37 +02:00
msgHash , err := senderNode . RelayPublishNoCTX ( DefaultPubsubTopic , message )
2025-02-13 12:24:33 +02:00
require . NoError ( t , err )
require . NotEmpty ( t , msgHash )
2025-02-16 13:30:57 +02:00
Debug ( "Verifying that Node2 received the message" )
err = node2 . VerifyMessageReceived ( message , msgHash )
require . NoError ( t , err , "Node2 should have received the message" )
2025-02-13 12:24:33 +02:00
2025-02-19 09:21:59 +02:00
Debug ( "Verifying that Node3 received the message" )
2025-02-16 13:30:57 +02:00
err = node3 . VerifyMessageReceived ( message , msgHash )
2025-02-19 09:21:59 +02:00
require . NoError ( t , err , "Node3 should have received the message" )
2025-02-13 12:24:33 +02:00
2025-02-19 09:21:59 +02:00
Debug ( "TestRelayNodesNotConnectedDirectly completed successfully" )
2025-02-13 12:24:33 +02:00
}
2025-02-16 13:30:57 +02:00
func TestRelaySubscribeAndPeerCountChange ( t * testing . T ) {
Debug ( "Starting test to verify relay subscription and peer count change after stopping a node" )
node1Config := DefaultWakuConfig
node1Config . Relay = true
Debug ( "Creating Node1 with Relay enabled" )
node1 , err := StartWakuNode ( "Node1" , & node1Config )
require . NoError ( t , err , "Failed to start Node1" )
2025-02-19 09:21:59 +02:00
node1Address , err := node1 . ListenAddresses ( )
require . NoError ( t , err , "Failed to get listening address for Node1" )
2025-02-16 13:30:57 +02:00
node2Config := DefaultWakuConfig
node2Config . Relay = true
2025-02-19 09:21:59 +02:00
node2Config . Staticnodes = [ ] string { node1Address [ 0 ] . String ( ) }
2025-02-16 13:30:57 +02:00
2025-02-19 09:21:59 +02:00
Debug ( "Creating Node2 with Node1 as a static node" )
2025-02-16 13:30:57 +02:00
node2 , err := StartWakuNode ( "Node2" , & node2Config )
require . NoError ( t , err , "Failed to start Node2" )
2025-03-18 11:13:42 +02:00
// Commented till we configure external IPs
//node2Address, err := node2.ListenAddresses()
//require.NoError(t, err, "Failed to get listening address for Node2")
2025-02-16 13:30:57 +02:00
node3Config := DefaultWakuConfig
node3Config . Relay = true
2025-03-18 11:13:42 +02:00
node3Config . Staticnodes = [ ] string { node1Address [ 0 ] . String ( ) }
2025-02-16 13:30:57 +02:00
2025-04-02 11:47:37 +02:00
Debug ( "Creating Node3 with Node1 as a static node" )
2025-02-16 13:30:57 +02:00
node3 , err := StartWakuNode ( "Node3" , & node3Config )
require . NoError ( t , err , "Failed to start Node3" )
defer func ( ) {
Debug ( "Stopping and destroying all Waku nodes" )
node1 . StopAndDestroy ( )
node2 . StopAndDestroy ( )
} ( )
defaultPubsubTopic := DefaultPubsubTopic
Debug ( "Default pubsub topic retrieved: %s" , defaultPubsubTopic )
2025-02-19 09:21:59 +02:00
Debug ( "Waiting for nodes to connect via static node configuration" )
2025-02-16 13:30:57 +02:00
err = WaitForAutoConnection ( [ ] * WakuNode { node1 , node2 , node3 } )
2025-02-19 09:21:59 +02:00
require . NoError ( t , err , "Nodes did not connect within timeout" )
2025-02-16 13:30:57 +02:00
Debug ( "Waiting for peer connections to stabilize" )
2025-02-19 09:21:59 +02:00
options := func ( b * backoff . ExponentialBackOff ) {
2025-03-18 11:13:42 +02:00
b . MaxElapsedTime = 10 * time . Second
2025-02-19 09:21:59 +02:00
}
require . NoError ( t , RetryWithBackOff ( func ( ) error {
numPeers , err := node1 . GetNumConnectedRelayPeers ( defaultPubsubTopic )
if err != nil {
return err
}
if numPeers != 2 {
return fmt . Errorf ( "expected 2 relay peers, got %d" , numPeers )
}
return nil
} , options ) , "Peers did not stabilize in time" )
2025-02-16 13:30:57 +02:00
Debug ( "Stopping Node3" )
node3 . StopAndDestroy ( )
Debug ( "Waiting for network to update after Node3 stops" )
2025-02-19 09:21:59 +02:00
require . NoError ( t , RetryWithBackOff ( func ( ) error {
numPeers , err := node1 . GetNumConnectedRelayPeers ( defaultPubsubTopic )
if err != nil {
return err
}
if numPeers != 1 {
return fmt . Errorf ( "expected 1 relay peer after stopping Node3, got %d" , numPeers )
}
return nil
} , options ) , "Peer count did not update after stopping Node3" )
2025-02-16 13:30:57 +02:00
Debug ( "Test successfully verified peer count changes as expected after stopping Node3" )
}
2025-02-17 08:28:08 +02:00
func TestRelaySubscribeFailsWhenRelayDisabled ( t * testing . T ) {
Debug ( "Starting test to verify that subscribing to a topic fails when Relay is disabled" )
nodeConfig := DefaultWakuConfig
nodeConfig . Relay = false
Debug ( "Creating Node with Relay disabled" )
node , err := StartWakuNode ( "TestNode" , & nodeConfig )
require . NoError ( t , err , "Failed to start Node" )
defer func ( ) {
Debug ( "Stopping and destroying the Waku node" )
node . StopAndDestroy ( )
} ( )
defaultPubsubTopic := DefaultPubsubTopic
Debug ( "Attempting to subscribe to the default pubsub topic: %s" , defaultPubsubTopic )
err = node . RelaySubscribe ( defaultPubsubTopic )
Debug ( "Verifying that subscription failed" )
require . Error ( t , err , "Expected RelaySubscribe to return an error when Relay is disabled" )
Debug ( "Test successfully verified that RelaySubscribe fails when Relay is disabled" )
}
func TestRelayDisabledNodeDoesNotReceiveMessages ( t * testing . T ) {
Debug ( "Starting test to verify that a node with Relay disabled does not receive messages" )
node1Config := DefaultWakuConfig
node1Config . Relay = true
Debug ( "Creating Node1 with Relay enabled" )
node1 , err := StartWakuNode ( "Node1" , & node1Config )
require . NoError ( t , err , "Failed to start Node1" )
enrNode1 , err := node1 . ENR ( )
require . NoError ( t , err , "Failed to get ENR for Node1" )
node2Config := DefaultWakuConfig
node2Config . Relay = true
node2Config . Discv5BootstrapNodes = [ ] string { enrNode1 . String ( ) }
Debug ( "Creating Node2 with Node1 as Discv5 bootstrap" )
node2 , err := StartWakuNode ( "Node2" , & node2Config )
require . NoError ( t , err , "Failed to start Node2" )
enrNode2 , err := node2 . ENR ( )
require . NoError ( t , err , "Failed to get ENR for Node2" )
node3Config := DefaultWakuConfig
node3Config . Relay = false
node3Config . Discv5BootstrapNodes = [ ] string { enrNode2 . String ( ) }
Debug ( "Creating Node3 with Node2 as Discv5 bootstrap" )
node3 , err := StartWakuNode ( "Node3" , & node3Config )
require . NoError ( t , err , "Failed to start Node3" )
defer func ( ) {
Debug ( "Stopping and destroying all Waku nodes" )
node1 . StopAndDestroy ( )
node2 . StopAndDestroy ( )
node3 . StopAndDestroy ( )
} ( )
defaultPubsubTopic := DefaultPubsubTopic
Debug ( "Default pubsub topic retrieved: %s" , defaultPubsubTopic )
err = SubscribeNodesToTopic ( [ ] * WakuNode { node1 , node2 } , defaultPubsubTopic )
require . NoError ( t , err , "Failed to subscribe nodes to the topic" )
Debug ( "Waiting for nodes to auto-connect via Discv5" )
err = WaitForAutoConnection ( [ ] * WakuNode { node1 , node2 } )
require . NoError ( t , err , "Nodes did not auto-connect within timeout" )
Debug ( "Creating and publishing message from Node1" )
message := node1 . CreateMessage ( )
msgHash , err := node1 . RelayPublishNoCTX ( defaultPubsubTopic , message )
require . NoError ( t , err , "Failed to publish message from Node1" )
Debug ( "Waiting to ensure message delivery" )
time . Sleep ( 3 * time . Second )
Debug ( "Verifying that Node2 received the message" )
err = node2 . VerifyMessageReceived ( message , msgHash )
require . NoError ( t , err , "Node2 should have received the message" )
Debug ( "Verifying that Node3 did NOT receive the message" )
err = node3 . VerifyMessageReceived ( message , msgHash )
require . Error ( t , err , "Node3 should NOT have received the message" )
Debug ( "Test successfully verified that Node3 did not receive the message" )
}
func TestPublishWithLargePayload ( t * testing . T ) {
Debug ( "Starting test to verify message publishing with a payload close to 150KB" )
node1Config := DefaultWakuConfig
node1Config . Relay = true
Debug ( "Creating Node1 with Relay enabled" )
node1 , err := StartWakuNode ( "Node1" , & node1Config )
require . NoError ( t , err , "Failed to start Node1" )
enrNode1 , err := node1 . ENR ( )
require . NoError ( t , err , "Failed to get ENR for Node1" )
node2Config := DefaultWakuConfig
node2Config . Relay = true
node2Config . Discv5BootstrapNodes = [ ] string { enrNode1 . String ( ) }
Debug ( "Creating Node2 with Node1 as Discv5 bootstrap" )
node2 , err := StartWakuNode ( "Node2" , & node2Config )
require . NoError ( t , err , "Failed to start Node2" )
defer func ( ) {
Debug ( "Stopping and destroying all Waku nodes" )
node1 . StopAndDestroy ( )
node2 . StopAndDestroy ( )
} ( )
defaultPubsubTopic := DefaultPubsubTopic
Debug ( "Default pubsub topic retrieved: %s" , defaultPubsubTopic )
err = SubscribeNodesToTopic ( [ ] * WakuNode { node1 , node2 } , defaultPubsubTopic )
require . NoError ( t , err , "Failed to subscribe nodes to the topic" )
Debug ( "Waiting for nodes to auto-connect via Discv5" )
err = WaitForAutoConnection ( [ ] * WakuNode { node1 , node2 } )
require . NoError ( t , err , "Nodes did not auto-connect within timeout" )
payloadLength := 1024 * 100 // 100KB raw, approximately 150KB when base64 encoded
Debug ( "Generating a large payload of %d bytes" , payloadLength )
largePayload := make ( [ ] byte , payloadLength )
for i := range largePayload {
largePayload [ i ] = 'a'
}
message := node1 . CreateMessage ( & pb . WakuMessage {
Payload : largePayload ,
ContentTopic : "test-content-topic" ,
Timestamp : proto . Int64 ( time . Now ( ) . UnixNano ( ) ) ,
} )
Debug ( "Publishing message from Node1 with large payload" )
msgHash , err := node1 . RelayPublishNoCTX ( defaultPubsubTopic , message )
require . NoError ( t , err , "Failed to publish message from Node1" )
Debug ( "Waiting to ensure message propagation" )
time . Sleep ( 2 * time . Second )
Debug ( "Verifying that Node2 received the message" )
err = node2 . VerifyMessageReceived ( message , msgHash )
require . NoError ( t , err , "Node2 should have received the message" )
Debug ( "Test successfully verified message publishing with a large payload" )
}