2026-06-10 10:13:55 +01:00
|
|
|
package kernel
|
2025-02-12 14:03:36 +02:00
|
|
|
|
|
|
|
|
import (
|
2026-08-26 00:07:24 +01:00
|
|
|
"context"
|
2025-02-13 11:31:08 +02:00
|
|
|
"slices"
|
2025-02-12 14:03:36 +02:00
|
|
|
"testing"
|
|
|
|
|
"time"
|
|
|
|
|
|
2026-06-10 10:13:55 +01:00
|
|
|
"github.com/logos-messaging/logos-delivery-go-bindings/pkg/kernel/common"
|
2025-02-12 14:03:36 +02:00
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Test node connect & disconnect peers
|
|
|
|
|
func TestDisconnectPeerNodes(t *testing.T) {
|
2026-08-26 00:07:24 +01:00
|
|
|
requiresNode(t)
|
|
|
|
|
logDebug("Starting TestDisconnectPeerNodes")
|
2025-02-12 14:03:36 +02:00
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
nodeA, err := StartWakuNode(nil)
|
2025-02-12 14:03:36 +02:00
|
|
|
require.NoError(t, err, "Failed to start Node A")
|
2026-08-26 00:07:24 +01:00
|
|
|
defer func() { _ = nodeA.Close() }()
|
2025-02-12 14:03:36 +02:00
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
nodeB, err := StartWakuNode(nil)
|
2025-02-12 14:03:36 +02:00
|
|
|
require.NoError(t, err, "Failed to start Node B")
|
2026-08-26 00:07:24 +01:00
|
|
|
defer func() { _ = nodeB.Close() }()
|
2025-02-12 14:03:36 +02:00
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Connecting Node A to Node B")
|
|
|
|
|
err = nodeA.Peers().ConnectTo(context.Background(), nodeB)
|
2025-02-12 14:03:36 +02:00
|
|
|
require.NoError(t, err, "Failed to connect nodes")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Verifying connection between Node A and Node B")
|
|
|
|
|
connectedPeers, err := nodeA.Peers().Connected()
|
2025-02-13 11:31:08 +02:00
|
|
|
require.NoError(t, err, "Failed to get connected peers for Node A")
|
2026-08-26 00:07:24 +01:00
|
|
|
nodeBPeerID, err := nodeB.Debug().PeerID()
|
2025-02-13 11:31:08 +02:00
|
|
|
require.NoError(t, err, "Failed to get PeerID for Node B")
|
|
|
|
|
require.True(t, slices.Contains(connectedPeers, nodeBPeerID), "Node B should be a peer of Node A before disconnection")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Disconnecting Node A from Node B")
|
|
|
|
|
err = nodeA.Peers().DisconnectFrom(nodeB)
|
2025-02-12 14:03:36 +02:00
|
|
|
require.NoError(t, err, "Failed to disconnect nodes")
|
2025-02-13 11:31:08 +02:00
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Verifying disconnection between Node A and Node B")
|
|
|
|
|
connectedPeers, err = nodeA.Peers().Connected()
|
2025-02-13 11:31:08 +02:00
|
|
|
require.NoError(t, err, "Failed to get connected peers for Node A after disconnection")
|
|
|
|
|
require.False(t, slices.Contains(connectedPeers, nodeBPeerID), "Node B should no longer be a peer of Node A after disconnection")
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Test completed successfully: Node B was disconnected from Node A")
|
2025-02-12 14:03:36 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestConnectMultipleNodesToSingleNode(t *testing.T) {
|
2026-08-26 00:07:24 +01:00
|
|
|
requiresNode(t)
|
|
|
|
|
logDebug("Starting TestConnectMultipleNodesToSingleNode")
|
2025-02-12 14:03:36 +02:00
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Creating 3 nodes with automatically assigned ports")
|
2025-02-13 11:31:08 +02:00
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
node1, err := StartWakuNode(nil)
|
2025-02-12 14:03:36 +02:00
|
|
|
require.NoError(t, err, "Failed to start Node 1")
|
|
|
|
|
defer func() {
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Stopping and destroying Node 1")
|
|
|
|
|
_ = node1.Close()
|
2025-02-12 14:03:36 +02:00
|
|
|
}()
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
node2, err := StartWakuNode(nil)
|
2025-02-12 14:03:36 +02:00
|
|
|
require.NoError(t, err, "Failed to start Node 2")
|
|
|
|
|
defer func() {
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Stopping and destroying Node 2")
|
|
|
|
|
_ = node2.Close()
|
2025-02-12 14:03:36 +02:00
|
|
|
}()
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
node3, err := StartWakuNode(nil)
|
2025-02-12 14:03:36 +02:00
|
|
|
require.NoError(t, err, "Failed to start Node 3")
|
|
|
|
|
defer func() {
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Stopping and destroying Node 3")
|
|
|
|
|
_ = node3.Close()
|
2025-02-12 14:03:36 +02:00
|
|
|
}()
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Connecting Node 2 to Node 1")
|
|
|
|
|
err = node2.Peers().ConnectTo(context.Background(), node1)
|
2025-02-12 14:03:36 +02:00
|
|
|
require.NoError(t, err, "Failed to connect Node 2 to Node 1")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Connecting Node 3 to Node 1")
|
|
|
|
|
err = node3.Peers().ConnectTo(context.Background(), node1)
|
2025-02-12 14:03:36 +02:00
|
|
|
require.NoError(t, err, "Failed to connect Node 3 to Node 1")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Verifying connected peers for Node 1")
|
|
|
|
|
connectedPeers, err := node1.Peers().Connected()
|
2025-02-19 09:21:59 +02:00
|
|
|
require.NoError(t, err, "Failed to get connected peers for Node 1")
|
2026-08-26 00:07:24 +01:00
|
|
|
node3PeerID, err := node3.Debug().PeerID()
|
2025-02-13 11:31:08 +02:00
|
|
|
require.NoError(t, err, "Failed to get PeerID for Node 1")
|
2026-08-26 00:07:24 +01:00
|
|
|
node2PeerID, err := node2.Debug().PeerID()
|
2025-02-13 11:31:08 +02:00
|
|
|
require.NoError(t, err, "Failed to get PeerID for Node 2")
|
|
|
|
|
|
2025-02-19 09:21:59 +02:00
|
|
|
require.True(t, slices.Contains(connectedPeers, node3PeerID), "Node 3 should be a peer of Node 1")
|
|
|
|
|
require.True(t, slices.Contains(connectedPeers, node2PeerID), "Node 2 should be a peer of Node 1")
|
2025-02-13 11:31:08 +02:00
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Test completed successfully: multiple nodes connected to a single node and verified peers")
|
2025-02-12 14:03:36 +02:00
|
|
|
}
|
2025-02-19 09:21:59 +02:00
|
|
|
|
2025-03-12 12:12:10 +00:00
|
|
|
func TestConnectUsingMultipleStaticPeers(t *testing.T) {
|
2026-08-26 00:07:24 +01:00
|
|
|
requiresNode(t)
|
|
|
|
|
logDebug("Starting TestConnectUsingMultipleStaticPeers")
|
2025-03-12 12:12:10 +00:00
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
node1, err := StartWakuNode(nil)
|
2025-03-12 12:12:10 +00:00
|
|
|
require.NoError(t, err, "Failed to start Node 1")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
node2, err := StartWakuNode(nil)
|
2025-03-12 12:12:10 +00:00
|
|
|
require.NoError(t, err, "Failed to start Node 2")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
node3, err := StartWakuNode(nil)
|
2025-03-12 12:12:10 +00:00
|
|
|
require.NoError(t, err, "Failed to start Node 3")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
addr1, err := node1.Debug().ListenAddresses()
|
2025-03-12 12:12:10 +00:00
|
|
|
require.NoError(t, err, "Failed to get listen addresses for Node 1")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
addr2, err := node2.Debug().ListenAddresses()
|
2025-03-12 12:12:10 +00:00
|
|
|
require.NoError(t, err, "Failed to get listen addresses for Node 2")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
addr3, err := node3.Debug().ListenAddresses()
|
2025-03-12 12:12:10 +00:00
|
|
|
require.NoError(t, err, "Failed to get listen addresses for Node 3")
|
|
|
|
|
|
|
|
|
|
node4Config := DefaultWakuConfig
|
|
|
|
|
node4Config.Discv5Discovery = false
|
|
|
|
|
node4Config.Staticnodes = []string{addr1[0].String(), addr2[0].String(), addr3[0].String()}
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
node4, err := StartWakuNode(&node4Config)
|
2025-03-12 12:12:10 +00:00
|
|
|
require.NoError(t, err, "Failed to start Node 4")
|
|
|
|
|
|
|
|
|
|
defer func() {
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Stopping and destroying all Waku nodes")
|
|
|
|
|
_ = node1.Close()
|
|
|
|
|
_ = node2.Close()
|
|
|
|
|
_ = node3.Close()
|
|
|
|
|
_ = node4.Close()
|
2025-03-12 12:12:10 +00:00
|
|
|
}()
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Verifying connected peers for Node 4")
|
|
|
|
|
connectedPeers, err := node4.Peers().Connected()
|
2025-03-12 12:12:10 +00:00
|
|
|
require.NoError(t, err, "Failed to get connected peers for Node 4")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
node1PeerID, err := node1.Debug().PeerID()
|
2025-03-12 12:12:10 +00:00
|
|
|
require.NoError(t, err, "Failed to get PeerID for Node 1")
|
2026-08-26 00:07:24 +01:00
|
|
|
node2PeerID, err := node2.Debug().PeerID()
|
2025-03-12 12:12:10 +00:00
|
|
|
require.NoError(t, err, "Failed to get PeerID for Node 2")
|
2026-08-26 00:07:24 +01:00
|
|
|
node3PeerID, err := node3.Debug().PeerID()
|
2025-03-12 12:12:10 +00:00
|
|
|
require.NoError(t, err, "Failed to get PeerID for Node 3")
|
|
|
|
|
|
|
|
|
|
require.True(t, slices.Contains(connectedPeers, node1PeerID), "Node 1 should be a peer of Node 4")
|
|
|
|
|
require.True(t, slices.Contains(connectedPeers, node2PeerID), "Node 2 should be a peer of Node 4")
|
|
|
|
|
require.True(t, slices.Contains(connectedPeers, node3PeerID), "Node 3 should be a peer of Node 4")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Test passed: multiple nodes connected to a single node using Static Peers")
|
2025-03-12 12:12:10 +00:00
|
|
|
}
|
|
|
|
|
|
2025-04-04 12:10:25 +03:00
|
|
|
func TestConnectedPeersInfo(t *testing.T) {
|
2026-08-26 00:07:24 +01:00
|
|
|
requiresNode(t)
|
|
|
|
|
logDebug("Starting TestPeerData")
|
2025-04-04 12:10:25 +03:00
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
node1, err := StartWakuNode(nil)
|
2025-04-04 12:10:25 +03:00
|
|
|
require.NoError(t, err, "Failed to start Node 1")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
node2, err := StartWakuNode(nil)
|
2025-04-04 12:10:25 +03:00
|
|
|
require.NoError(t, err, "Failed to start Node 2")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
node3, err := StartWakuNode(nil)
|
2025-04-04 12:10:25 +03:00
|
|
|
require.NoError(t, err, "Failed to start Node 3")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
addr1, err := node1.Debug().ListenAddresses()
|
2025-04-04 12:10:25 +03:00
|
|
|
require.NoError(t, err, "Failed to get listen addresses for Node 1")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
addr2, err := node2.Debug().ListenAddresses()
|
2025-04-04 12:10:25 +03:00
|
|
|
require.NoError(t, err, "Failed to get listen addresses for Node 2")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
addr3, err := node3.Debug().ListenAddresses()
|
2025-04-04 12:10:25 +03:00
|
|
|
require.NoError(t, err, "Failed to get listen addresses for Node 3")
|
|
|
|
|
|
|
|
|
|
node4Config := DefaultWakuConfig
|
|
|
|
|
node4Config.Discv5Discovery = false
|
|
|
|
|
node4Config.Staticnodes = []string{addr1[0].String(), addr2[0].String(), addr3[0].String()}
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
node4, err := StartWakuNode(&node4Config)
|
2025-04-04 12:10:25 +03:00
|
|
|
require.NoError(t, err, "Failed to start Node 4")
|
|
|
|
|
|
|
|
|
|
defer func() {
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Stopping and destroying all Waku nodes")
|
|
|
|
|
_ = node1.Close()
|
|
|
|
|
_ = node2.Close()
|
|
|
|
|
_ = node3.Close()
|
|
|
|
|
_ = node4.Close()
|
2025-04-04 12:10:25 +03:00
|
|
|
}()
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Verifying connected peers for Node 4")
|
|
|
|
|
connectedPeers, err := node4.Peers().Connected()
|
2025-04-04 12:10:25 +03:00
|
|
|
require.NoError(t, err, "Failed to get connected peers for Node 4")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
node1PeerID, err := node1.Debug().PeerID()
|
2025-04-04 12:10:25 +03:00
|
|
|
require.NoError(t, err, "Failed to get PeerID for Node 1")
|
2026-08-26 00:07:24 +01:00
|
|
|
node2PeerID, err := node2.Debug().PeerID()
|
2025-04-04 12:10:25 +03:00
|
|
|
require.NoError(t, err, "Failed to get PeerID for Node 2")
|
2026-08-26 00:07:24 +01:00
|
|
|
node3PeerID, err := node3.Debug().PeerID()
|
2025-04-04 12:10:25 +03:00
|
|
|
require.NoError(t, err, "Failed to get PeerID for Node 3")
|
|
|
|
|
|
|
|
|
|
require.True(t, slices.Contains(connectedPeers, node1PeerID), "Node 1 should be a peer of Node 4")
|
|
|
|
|
require.True(t, slices.Contains(connectedPeers, node2PeerID), "Node 2 should be a peer of Node 4")
|
|
|
|
|
require.True(t, slices.Contains(connectedPeers, node3PeerID), "Node 3 should be a peer of Node 4")
|
|
|
|
|
|
2025-12-15 01:09:46 +05:30
|
|
|
time.Sleep(1 * time.Second)
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
peersInfo, err := node4.Peers().ConnectedInfo()
|
2025-04-04 12:10:25 +03:00
|
|
|
require.NoError(t, err, "Failed to get node 4's connected peers info")
|
|
|
|
|
|
2025-12-15 01:09:46 +05:30
|
|
|
require.Equal(t, 3, len(peersInfo), "Expected Node 4's connected peers info to have 3 entries")
|
2025-04-04 12:10:25 +03:00
|
|
|
|
2025-12-15 01:09:46 +05:30
|
|
|
// Verify the addresses contain the expected peer IDs when encapsulated
|
2025-04-04 12:10:25 +03:00
|
|
|
node1DerivedAddr := common.EncapsulatePeerID(node1PeerID, peersInfo[node1PeerID].Addresses...)
|
2025-12-15 01:09:46 +05:30
|
|
|
require.NotEmpty(t, node1DerivedAddr, "Node1's derived address should not be empty")
|
|
|
|
|
require.Contains(t, node1DerivedAddr[0].String(), node1PeerID.String(), "Node1's derived address should contain its peer ID")
|
2025-04-04 12:10:25 +03:00
|
|
|
|
|
|
|
|
node2DerivedAddr := common.EncapsulatePeerID(node2PeerID, peersInfo[node2PeerID].Addresses...)
|
2025-12-15 01:09:46 +05:30
|
|
|
require.NotEmpty(t, node2DerivedAddr, "Node2's derived address should not be empty")
|
|
|
|
|
require.Contains(t, node2DerivedAddr[0].String(), node2PeerID.String(), "Node2's derived address should contain its peer ID")
|
2025-04-04 12:10:25 +03:00
|
|
|
|
|
|
|
|
node3DerivedAddr := common.EncapsulatePeerID(node3PeerID, peersInfo[node3PeerID].Addresses...)
|
2025-12-15 01:09:46 +05:30
|
|
|
require.NotEmpty(t, node3DerivedAddr, "Node3's derived address should not be empty")
|
|
|
|
|
require.Contains(t, node3DerivedAddr[0].String(), node3PeerID.String(), "Node3's derived address should contain its peer ID")
|
2025-04-04 12:10:25 +03:00
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Test passed: peersInfoData is correct")
|
2025-04-04 12:10:25 +03:00
|
|
|
}
|
|
|
|
|
|
2025-02-19 09:21:59 +02:00
|
|
|
func TestDiscv5PeerMeshCount(t *testing.T) {
|
2026-08-26 00:07:24 +01:00
|
|
|
requiresNode(t)
|
|
|
|
|
logDebug("Starting test to verify peer count in mesh using Discv5 after topic subscription")
|
2025-02-19 09:21:59 +02:00
|
|
|
|
|
|
|
|
node1Config := DefaultWakuConfig
|
|
|
|
|
node1Config.Relay = true
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Creating Node1")
|
|
|
|
|
node1, err := StartWakuNode(&node1Config)
|
2025-02-19 09:21:59 +02:00
|
|
|
require.NoError(t, err, "Failed to start Node1")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
enrNode1, err := node1.Debug().ENR()
|
2025-02-19 09:21:59 +02:00
|
|
|
require.NoError(t, err, "Failed to get ENR for Node1")
|
|
|
|
|
|
|
|
|
|
node2Config := DefaultWakuConfig
|
|
|
|
|
node2Config.Discv5BootstrapNodes = []string{enrNode1.String()}
|
|
|
|
|
node2Config.Relay = true
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Creating Node2 with Node1 as Discv5 bootstrap")
|
|
|
|
|
node2, err := StartWakuNode(&node2Config)
|
2025-02-19 09:21:59 +02:00
|
|
|
require.NoError(t, err, "Failed to start Node2")
|
|
|
|
|
|
|
|
|
|
node3Config := DefaultWakuConfig
|
|
|
|
|
node3Config.Discv5BootstrapNodes = []string{enrNode1.String()}
|
|
|
|
|
node3Config.Relay = true
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Creating Node3 with Node2 as Discv5 bootstrap")
|
|
|
|
|
node3, err := StartWakuNode(&node3Config)
|
2025-02-19 09:21:59 +02:00
|
|
|
require.NoError(t, err, "Failed to start Node3")
|
|
|
|
|
|
|
|
|
|
defer func() {
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Stopping and destroying all Waku nodes")
|
|
|
|
|
_ = node1.Close()
|
|
|
|
|
_ = node2.Close()
|
2025-02-19 09:21:59 +02:00
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
defaultPubsubTopic := DefaultPubsubTopic
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Default pubsub topic retrieved: %s", defaultPubsubTopic)
|
2025-02-19 09:21:59 +02:00
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
err = SubscribeNodesToTopic([]*Node{node1, node2, node3}, defaultPubsubTopic)
|
2025-02-19 09:21:59 +02:00
|
|
|
require.NoError(t, err, "Failed to subscribe all nodes to the topic")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Waiting for nodes to auto-connect via Discv5")
|
|
|
|
|
err = WaitForAutoConnection([]*Node{node1, node2, node3})
|
2025-02-19 09:21:59 +02:00
|
|
|
require.NoError(t, err, "Nodes did not auto-connect within timeout")
|
2025-04-02 11:55:20 +02:00
|
|
|
time.Sleep(time.Second * 5)
|
2025-02-19 09:21:59 +02:00
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Fetching number of peers in mesh for Node1 before stopping Node3")
|
|
|
|
|
peerCountBefore, err := node1.Relay().NumPeersInMesh(defaultPubsubTopic)
|
2025-02-19 09:21:59 +02:00
|
|
|
require.NoError(t, err, "Failed to get number of peers in mesh for Node1 before stopping Node3")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Total number of peers in mesh for Node1 before stopping Node3: %d", peerCountBefore)
|
2025-02-19 09:21:59 +02:00
|
|
|
require.Equal(t, 2, peerCountBefore, "Expected Node1 to have exactly 2 peers in the mesh before stopping Node3")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Stopping Node3")
|
|
|
|
|
_ = node3.Close()
|
2025-02-19 09:21:59 +02:00
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Waiting for network update after Node3 stops")
|
2025-02-19 09:21:59 +02:00
|
|
|
time.Sleep(10 * time.Second)
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Fetching number of peers in mesh for Node1 after stopping Node3")
|
|
|
|
|
peerCountAfter, err := node1.Relay().NumPeersInMesh(defaultPubsubTopic)
|
2025-02-19 09:21:59 +02:00
|
|
|
require.NoError(t, err, "Failed to get number of peers in mesh for Node1 after stopping Node3")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Total number of peers in mesh for Node1 after stopping Node3: %d", peerCountAfter)
|
2025-02-19 09:21:59 +02:00
|
|
|
require.Equal(t, 1, peerCountAfter, "Expected Node1 to have exactly 1 peer in the mesh after stopping Node3")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Test successfully verified peer count change after stopping Node3")
|
2025-02-19 09:21:59 +02:00
|
|
|
}
|
|
|
|
|
|
2025-04-04 11:53:14 +03:00
|
|
|
func TestDiscv5PeerMeshIds(t *testing.T) {
|
2026-08-26 00:07:24 +01:00
|
|
|
requiresNode(t)
|
|
|
|
|
logDebug("Starting test to verify peers in mesh using Discv5 after topic subscription")
|
2025-04-04 11:53:14 +03:00
|
|
|
|
|
|
|
|
node1Config := DefaultWakuConfig
|
|
|
|
|
node1Config.Relay = true
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Creating Node1")
|
|
|
|
|
node1, err := StartWakuNode(&node1Config)
|
2025-04-04 11:53:14 +03:00
|
|
|
require.NoError(t, err, "Failed to start Node1")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
enrNode1, err := node1.Debug().ENR()
|
2025-04-04 11:53:14 +03:00
|
|
|
require.NoError(t, err, "Failed to get ENR for Node1")
|
|
|
|
|
|
|
|
|
|
node2Config := DefaultWakuConfig
|
|
|
|
|
node2Config.Discv5BootstrapNodes = []string{enrNode1.String()}
|
|
|
|
|
node2Config.Relay = true
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Creating Node2 with Node1 as Discv5 bootstrap")
|
|
|
|
|
node2, err := StartWakuNode(&node2Config)
|
2025-04-04 11:53:14 +03:00
|
|
|
require.NoError(t, err, "Failed to start Node2")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
node2PeerID, err := node2.Debug().PeerID()
|
2025-04-04 11:53:14 +03:00
|
|
|
require.NoError(t, err, "Failed to get PeerID for Node 2")
|
|
|
|
|
|
|
|
|
|
node3Config := DefaultWakuConfig
|
|
|
|
|
node3Config.Discv5BootstrapNodes = []string{enrNode1.String()}
|
|
|
|
|
node3Config.Relay = true
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Creating Node3 with Node2 as Discv5 bootstrap")
|
|
|
|
|
node3, err := StartWakuNode(&node3Config)
|
2025-04-04 11:53:14 +03:00
|
|
|
require.NoError(t, err, "Failed to start Node3")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
node3PeerID, err := node3.Debug().PeerID()
|
2025-04-04 11:53:14 +03:00
|
|
|
require.NoError(t, err, "Failed to get PeerID for Node 3")
|
|
|
|
|
|
|
|
|
|
defer func() {
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Stopping and destroying all Waku nodes")
|
|
|
|
|
_ = node1.Close()
|
|
|
|
|
_ = node2.Close()
|
2025-04-04 11:53:14 +03:00
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
defaultPubsubTopic := DefaultPubsubTopic
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Default pubsub topic retrieved: %s", defaultPubsubTopic)
|
2025-04-04 11:53:14 +03:00
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
err = SubscribeNodesToTopic([]*Node{node1, node2, node3}, defaultPubsubTopic)
|
2025-04-04 11:53:14 +03:00
|
|
|
require.NoError(t, err, "Failed to subscribe all nodes to the topic")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Waiting for nodes to auto-connect via Discv5")
|
|
|
|
|
err = WaitForAutoConnection([]*Node{node1, node2, node3})
|
2025-04-04 11:53:14 +03:00
|
|
|
require.NoError(t, err, "Nodes did not auto-connect within timeout")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Fetching number of peers in mesh for Node1 before stopping Node3")
|
|
|
|
|
peersBefore, err := node1.Relay().PeersInMesh(defaultPubsubTopic)
|
2025-04-04 11:53:14 +03:00
|
|
|
require.NoError(t, err, "Failed to get number of peers in mesh for Node1 before stopping Node3")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Total number of peers in mesh for Node1 before stopping Node3: %d", len(peersBefore))
|
2025-04-04 11:53:14 +03:00
|
|
|
require.Equal(t, 2, len(peersBefore), "Expected Node1 to have exactly 2 peers in the mesh before stopping Node3")
|
|
|
|
|
require.True(t, slices.Contains(peersBefore, node2PeerID), "Node 2 should be included in node 1's mesh")
|
|
|
|
|
require.True(t, slices.Contains(peersBefore, node3PeerID), "Node 3 should be included in node 1's mesh")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Stopping Node3")
|
|
|
|
|
_ = node3.Close()
|
2025-04-04 11:53:14 +03:00
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Waiting for network update after Node3 stops")
|
2025-04-04 11:53:14 +03:00
|
|
|
time.Sleep(10 * time.Second)
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Fetching number of peers in mesh for Node1 after stopping Node3")
|
|
|
|
|
peersAfter, err := node1.Relay().PeersInMesh(defaultPubsubTopic)
|
2025-04-04 11:53:14 +03:00
|
|
|
require.NoError(t, err, "Failed to get number of peers in mesh for Node1 after stopping Node3")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Total number of peers in mesh for Node1 after stopping Node3: %d", len(peersAfter))
|
2025-04-04 11:53:14 +03:00
|
|
|
require.Equal(t, 1, len(peersAfter), "Expected Node1 to have exactly 1 peer in the mesh after stopping Node3")
|
|
|
|
|
require.True(t, slices.Contains(peersBefore, node2PeerID), "Node 2 should be included in node 1's mesh")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Test successfully verified peer count change after stopping Node3")
|
2025-04-04 11:53:14 +03:00
|
|
|
}
|
|
|
|
|
|
2025-03-12 12:12:10 +00:00
|
|
|
func TestDiscv5DisabledNoPeersConnected(t *testing.T) {
|
2026-08-26 00:07:24 +01:00
|
|
|
requiresNode(t)
|
|
|
|
|
logDebug("Starting TestDiscv5DisabledNoPeersConnected")
|
2025-03-12 12:12:10 +00:00
|
|
|
|
|
|
|
|
nodeConfig := DefaultWakuConfig
|
|
|
|
|
nodeConfig.Discv5Discovery = false
|
|
|
|
|
nodeConfig.Relay = true
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Creating Node1")
|
|
|
|
|
node1, err := StartWakuNode(&nodeConfig)
|
2025-03-12 12:12:10 +00:00
|
|
|
require.NoError(t, err, "Failed to start Node1")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
enrNode1, err := node1.Debug().ENR()
|
2025-03-12 12:12:10 +00:00
|
|
|
require.NoError(t, err, "Failed to get ENR for Node1")
|
|
|
|
|
nodeConfig.Discv5BootstrapNodes = []string{enrNode1.String()}
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Creating Node2 with Node1 as Discv5 bootstrap")
|
|
|
|
|
node2, err := StartWakuNode(&nodeConfig)
|
2025-03-12 12:12:10 +00:00
|
|
|
require.NoError(t, err, "Failed to start Node2")
|
|
|
|
|
|
|
|
|
|
defer func() {
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Stopping and destroying all Waku nodes")
|
|
|
|
|
_ = node1.Close()
|
|
|
|
|
_ = node2.Close()
|
2025-03-12 12:12:10 +00:00
|
|
|
}()
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Waiting to ensure no auto-connection")
|
2025-03-12 12:12:10 +00:00
|
|
|
time.Sleep(15 * time.Second)
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Verifying number of peers connected to Nodes")
|
|
|
|
|
peerCount, err := node1.Peers().NumConnected()
|
2025-03-12 12:12:10 +00:00
|
|
|
require.NoError(t, err, "Failed to get number of peers in mesh for Node1")
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Total number of connected peers for Node1: %d", peerCount)
|
2025-03-12 12:12:10 +00:00
|
|
|
require.Equal(t, 0, peerCount, "Expected Node1 to have exactly 0 peers in the mesh")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
peerCount, err = node2.Peers().NumConnected()
|
2025-03-12 12:12:10 +00:00
|
|
|
require.NoError(t, err, "Failed to get number of peers in mesh for Node2")
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Total number of connected peers for Node2: %d", peerCount)
|
2025-03-12 12:12:10 +00:00
|
|
|
require.Equal(t, 0, peerCount, "Expected Node2 to have exactly 0 peers in the mesh")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Test passed: all the nodes have 0 peers")
|
2025-03-12 12:12:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// this test commented as it will fail will be changed to have external ip in future task
|
2025-02-19 09:21:59 +02:00
|
|
|
/*
|
|
|
|
|
func TestDiscv5GetPeersConnected(t *testing.T) {
|
2026-08-26 00:07:24 +01:00
|
|
|
requiresNode(t)
|
|
|
|
|
logDebug("Starting test to verify peer count in mesh with 4 nodes using Discv5 (Chained Connection)")
|
2025-02-19 09:21:59 +02:00
|
|
|
|
|
|
|
|
node1Config := DefaultWakuConfig
|
|
|
|
|
node1Config.Relay = true
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Creating Node1")
|
|
|
|
|
node1, err := StartWakuNode(&node1Config)
|
2025-02-19 09:21:59 +02:00
|
|
|
require.NoError(t, err, "Failed to start Node1")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
enrNode1, err := node1.Debug().ENR()
|
2025-02-19 09:21:59 +02:00
|
|
|
require.NoError(t, err, "Failed to get ENR for Node1")
|
|
|
|
|
|
|
|
|
|
node2Config := DefaultWakuConfig
|
|
|
|
|
node2Config.Relay = true
|
|
|
|
|
node2Config.Discv5BootstrapNodes = []string{enrNode1.String()}
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Creating Node2 with Node1 as Discv5 bootstrap")
|
|
|
|
|
node2, err := StartWakuNode(&node2Config)
|
2025-02-19 09:21:59 +02:00
|
|
|
require.NoError(t, err, "Failed to start Node2")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
enrNode2, err := node2.Debug().ENR()
|
2025-02-19 09:21:59 +02:00
|
|
|
require.NoError(t, err, "Failed to get ENR for Node2")
|
|
|
|
|
|
|
|
|
|
node3Config := DefaultWakuConfig
|
|
|
|
|
node3Config.Relay = true
|
|
|
|
|
node3Config.Discv5BootstrapNodes = []string{enrNode2.String()}
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Creating Node3 with Node2 as Discv5 bootstrap")
|
|
|
|
|
node3, err := StartWakuNode(&node3Config)
|
2025-02-19 09:21:59 +02:00
|
|
|
require.NoError(t, err, "Failed to start Node3")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
enrNode3, err := node3.Debug().ENR()
|
2025-02-19 09:21:59 +02:00
|
|
|
require.NoError(t, err, "Failed to get ENR for Node3")
|
|
|
|
|
|
|
|
|
|
node4Config := DefaultWakuConfig
|
|
|
|
|
node4Config.Relay = true
|
|
|
|
|
node4Config.Discv5BootstrapNodes = []string{enrNode3.String()}
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Creating Node4 with Node3 as Discv5 bootstrap")
|
|
|
|
|
node4, err := StartWakuNode(&node4Config)
|
2025-02-19 09:21:59 +02:00
|
|
|
require.NoError(t, err, "Failed to start Node4")
|
|
|
|
|
|
|
|
|
|
defer func() {
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Stopping and destroying all Waku nodes")
|
|
|
|
|
node1.Close()
|
|
|
|
|
node2.Close()
|
|
|
|
|
node3.Close()
|
|
|
|
|
node4.Close()
|
2025-02-19 09:21:59 +02:00
|
|
|
}()
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Waiting for nodes to auto-connect via Discv5")
|
|
|
|
|
err = WaitForAutoConnection([]*Node{node1, node2, node3, node4})
|
2025-02-19 09:21:59 +02:00
|
|
|
require.NoError(t, err, "Nodes did not auto-connect within timeout")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Fetching number of peers in connected to Node1")
|
|
|
|
|
peerCount, err := node1.Peers().NumConnected()
|
2025-02-19 09:21:59 +02:00
|
|
|
require.NoError(t, err, "Failed to get number of peers in mesh for Node1")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Total number of peers connected to Node1: %d", peerCount)
|
2025-02-19 09:21:59 +02:00
|
|
|
require.Equal(t, 3, peerCount, "Expected Node1 to have exactly 3 peers in the mesh")
|
|
|
|
|
|
2026-08-26 00:07:24 +01:00
|
|
|
logDebug("Test successfully verified peer count in mesh with 4 nodes using Discv5 (Chained Connection)")
|
2025-02-19 09:21:59 +02:00
|
|
|
}
|
2025-03-12 12:12:10 +00:00
|
|
|
*/
|