logos-messaging-go-bindings/waku/peer_connections_test.go
2025-12-12 22:48:53 +01:00

467 lines
17 KiB
Go

package waku
import (
"slices"
"testing"
"time"
"github.com/logos-messaging/logos-messaging-go-bindings/waku/common"
"github.com/stretchr/testify/require"
)
// Test node connect & disconnect peers
func TestDisconnectPeerNodes(t *testing.T) {
Debug("Starting TestDisconnectPeerNodes")
nodeA, err := StartWakuNode("nodeA", nil)
require.NoError(t, err, "Failed to start Node A")
defer nodeA.StopAndDestroy()
nodeB, err := StartWakuNode("nodeB", nil)
require.NoError(t, err, "Failed to start Node B")
defer nodeB.StopAndDestroy()
Debug("Connecting Node A to Node B")
err = nodeA.ConnectPeer(nodeB)
require.NoError(t, err, "Failed to connect nodes")
Debug("Verifying connection between Node A and Node B")
connectedPeers, err := nodeA.GetConnectedPeers()
require.NoError(t, err, "Failed to get connected peers for Node A")
nodeBPeerID, err := nodeB.PeerID()
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")
Debug("Disconnecting Node A from Node B")
err = nodeA.DisconnectPeer(nodeB)
require.NoError(t, err, "Failed to disconnect nodes")
Debug("Verifying disconnection between Node A and Node B")
connectedPeers, err = nodeA.GetConnectedPeers()
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")
Debug("Test completed successfully: Node B was disconnected from Node A")
}
func TestConnectMultipleNodesToSingleNode(t *testing.T) {
Debug("Starting TestConnectMultipleNodesToSingleNode")
Debug("Creating 3 nodes with automatically assigned ports")
node1, err := StartWakuNode("node1", nil)
require.NoError(t, err, "Failed to start Node 1")
defer func() {
Debug("Stopping and destroying Node 1")
node1.StopAndDestroy()
}()
node2, err := StartWakuNode("node2", nil)
require.NoError(t, err, "Failed to start Node 2")
defer func() {
Debug("Stopping and destroying Node 2")
node2.StopAndDestroy()
}()
node3, err := StartWakuNode("node3", nil)
require.NoError(t, err, "Failed to start Node 3")
defer func() {
Debug("Stopping and destroying Node 3")
node3.StopAndDestroy()
}()
Debug("Connecting Node 2 to Node 1")
err = node2.ConnectPeer(node1)
require.NoError(t, err, "Failed to connect Node 2 to Node 1")
Debug("Connecting Node 3 to Node 1")
err = node3.ConnectPeer(node1)
require.NoError(t, err, "Failed to connect Node 3 to Node 1")
Debug("Verifying connected peers for Node 1")
connectedPeers, err := node1.GetConnectedPeers()
require.NoError(t, err, "Failed to get connected peers for Node 1")
node3PeerID, err := node3.PeerID()
require.NoError(t, err, "Failed to get PeerID for Node 1")
node2PeerID, err := node2.PeerID()
require.NoError(t, err, "Failed to get PeerID for Node 2")
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")
Debug("Test completed successfully: multiple nodes connected to a single node and verified peers")
}
func TestConnectUsingMultipleStaticPeers(t *testing.T) {
Debug("Starting TestConnectUsingMultipleStaticPeers")
node1, err := StartWakuNode("node1", nil)
require.NoError(t, err, "Failed to start Node 1")
node2, err := StartWakuNode("node2", nil)
require.NoError(t, err, "Failed to start Node 2")
node3, err := StartWakuNode("node3", nil)
require.NoError(t, err, "Failed to start Node 3")
addr1, err := node1.ListenAddresses()
require.NoError(t, err, "Failed to get listen addresses for Node 1")
addr2, err := node2.ListenAddresses()
require.NoError(t, err, "Failed to get listen addresses for Node 2")
addr3, err := node3.ListenAddresses()
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()}
node4, err := StartWakuNode("node4", &node4Config)
require.NoError(t, err, "Failed to start Node 4")
defer func() {
Debug("Stopping and destroying all Waku nodes")
node1.StopAndDestroy()
node2.StopAndDestroy()
node3.StopAndDestroy()
node4.StopAndDestroy()
}()
Debug("Verifying connected peers for Node 4")
connectedPeers, err := node4.GetConnectedPeers()
require.NoError(t, err, "Failed to get connected peers for Node 4")
node1PeerID, err := node1.PeerID()
require.NoError(t, err, "Failed to get PeerID for Node 1")
node2PeerID, err := node2.PeerID()
require.NoError(t, err, "Failed to get PeerID for Node 2")
node3PeerID, err := node3.PeerID()
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")
Debug("Test passed: multiple nodes connected to a single node using Static Peers")
}
func TestConnectedPeersInfo(t *testing.T) {
Debug("Starting TestPeerData")
node1, err := StartWakuNode("node1", nil)
require.NoError(t, err, "Failed to start Node 1")
node2, err := StartWakuNode("node2", nil)
require.NoError(t, err, "Failed to start Node 2")
node3, err := StartWakuNode("node3", nil)
require.NoError(t, err, "Failed to start Node 3")
addr1, err := node1.ListenAddresses()
require.NoError(t, err, "Failed to get listen addresses for Node 1")
addr2, err := node2.ListenAddresses()
require.NoError(t, err, "Failed to get listen addresses for Node 2")
addr3, err := node3.ListenAddresses()
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()}
node4, err := StartWakuNode("node4", &node4Config)
require.NoError(t, err, "Failed to start Node 4")
defer func() {
Debug("Stopping and destroying all Waku nodes")
node1.StopAndDestroy()
node2.StopAndDestroy()
node3.StopAndDestroy()
node4.StopAndDestroy()
}()
Debug("Verifying connected peers for Node 4")
connectedPeers, err := node4.GetConnectedPeers()
require.NoError(t, err, "Failed to get connected peers for Node 4")
node1PeerID, err := node1.PeerID()
require.NoError(t, err, "Failed to get PeerID for Node 1")
node2PeerID, err := node2.PeerID()
require.NoError(t, err, "Failed to get PeerID for Node 2")
node3PeerID, err := node3.PeerID()
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")
peersInfo, err := node4.GetConnectedPeersInfo()
require.NoError(t, err, "Failed to get node 4's connected peers info")
require.Equal(t, len(peersInfo), 3, "Expected Node 4's connected peers info to have 3 entries")
node1DerivedAddr := common.EncapsulatePeerID(node1PeerID, peersInfo[node1PeerID].Addresses...)
require.Equal(t, node1DerivedAddr, addr1, "Expected Node1's derived address to equal its listen address")
node2DerivedAddr := common.EncapsulatePeerID(node2PeerID, peersInfo[node2PeerID].Addresses...)
require.Equal(t, node2DerivedAddr, addr2, "Expected Node2's derived address to equal its listen address")
node3DerivedAddr := common.EncapsulatePeerID(node3PeerID, peersInfo[node3PeerID].Addresses...)
require.Equal(t, node3DerivedAddr, addr3, "Expected Node3's derived address to equal its listen address")
Debug("Test passed: peersInfoData is correct")
}
func TestDiscv5PeerMeshCount(t *testing.T) {
Debug("Starting test to verify peer count in mesh using Discv5 after topic subscription")
node1Config := DefaultWakuConfig
node1Config.Relay = true
Debug("Creating Node1")
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.Discv5BootstrapNodes = []string{enrNode1.String()}
node2Config.Relay = true
Debug("Creating Node2 with Node1 as Discv5 bootstrap")
node2, err := StartWakuNode("Node2", &node2Config)
require.NoError(t, err, "Failed to start Node2")
node3Config := DefaultWakuConfig
node3Config.Discv5BootstrapNodes = []string{enrNode1.String()}
node3Config.Relay = true
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()
}()
defaultPubsubTopic := DefaultPubsubTopic
Debug("Default pubsub topic retrieved: %s", defaultPubsubTopic)
err = SubscribeNodesToTopic([]*WakuNode{node1, node2, node3}, defaultPubsubTopic)
require.NoError(t, err, "Failed to subscribe all nodes to the topic")
Debug("Waiting for nodes to auto-connect via Discv5")
err = WaitForAutoConnection([]*WakuNode{node1, node2, node3})
require.NoError(t, err, "Nodes did not auto-connect within timeout")
time.Sleep(time.Second * 5)
Debug("Fetching number of peers in mesh for Node1 before stopping Node3")
peerCountBefore, err := node1.GetNumPeersInMesh(defaultPubsubTopic)
require.NoError(t, err, "Failed to get number of peers in mesh for Node1 before stopping Node3")
Debug("Total number of peers in mesh for Node1 before stopping Node3: %d", peerCountBefore)
require.Equal(t, 2, peerCountBefore, "Expected Node1 to have exactly 2 peers in the mesh before stopping Node3")
Debug("Stopping Node3")
node3.StopAndDestroy()
Debug("Waiting for network update after Node3 stops")
time.Sleep(10 * time.Second)
Debug("Fetching number of peers in mesh for Node1 after stopping Node3")
peerCountAfter, err := node1.GetNumPeersInMesh(defaultPubsubTopic)
require.NoError(t, err, "Failed to get number of peers in mesh for Node1 after stopping Node3")
Debug("Total number of peers in mesh for Node1 after stopping Node3: %d", peerCountAfter)
require.Equal(t, 1, peerCountAfter, "Expected Node1 to have exactly 1 peer in the mesh after stopping Node3")
Debug("Test successfully verified peer count change after stopping Node3")
}
func TestDiscv5PeerMeshIds(t *testing.T) {
Debug("Starting test to verify peers in mesh using Discv5 after topic subscription")
node1Config := DefaultWakuConfig
node1Config.Relay = true
Debug("Creating Node1")
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.Discv5BootstrapNodes = []string{enrNode1.String()}
node2Config.Relay = true
Debug("Creating Node2 with Node1 as Discv5 bootstrap")
node2, err := StartWakuNode("Node2", &node2Config)
require.NoError(t, err, "Failed to start Node2")
node2PeerID, err := node2.PeerID()
require.NoError(t, err, "Failed to get PeerID for Node 2")
node3Config := DefaultWakuConfig
node3Config.Discv5BootstrapNodes = []string{enrNode1.String()}
node3Config.Relay = true
Debug("Creating Node3 with Node2 as Discv5 bootstrap")
node3, err := StartWakuNode("Node3", &node3Config)
require.NoError(t, err, "Failed to start Node3")
node3PeerID, err := node3.PeerID()
require.NoError(t, err, "Failed to get PeerID for Node 3")
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, node3}, defaultPubsubTopic)
require.NoError(t, err, "Failed to subscribe all nodes to the topic")
Debug("Waiting for nodes to auto-connect via Discv5")
err = WaitForAutoConnection([]*WakuNode{node1, node2, node3})
require.NoError(t, err, "Nodes did not auto-connect within timeout")
Debug("Fetching number of peers in mesh for Node1 before stopping Node3")
peersBefore, err := node1.GetPeersInMesh(defaultPubsubTopic)
require.NoError(t, err, "Failed to get number of peers in mesh for Node1 before stopping Node3")
Debug("Total number of peers in mesh for Node1 before stopping Node3: %d", len(peersBefore))
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")
Debug("Stopping Node3")
node3.StopAndDestroy()
Debug("Waiting for network update after Node3 stops")
time.Sleep(10 * time.Second)
Debug("Fetching number of peers in mesh for Node1 after stopping Node3")
peersAfter, err := node1.GetPeersInMesh(defaultPubsubTopic)
require.NoError(t, err, "Failed to get number of peers in mesh for Node1 after stopping Node3")
Debug("Total number of peers in mesh for Node1 after stopping Node3: %d", len(peersAfter))
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")
Debug("Test successfully verified peer count change after stopping Node3")
}
func TestDiscv5DisabledNoPeersConnected(t *testing.T) {
Debug("Starting TestDiscv5DisabledNoPeersConnected")
nodeConfig := DefaultWakuConfig
nodeConfig.Discv5Discovery = false
nodeConfig.Relay = true
Debug("Creating Node1")
node1, err := StartWakuNode("Node1", &nodeConfig)
require.NoError(t, err, "Failed to start Node1")
enrNode1, err := node1.ENR()
require.NoError(t, err, "Failed to get ENR for Node1")
nodeConfig.Discv5BootstrapNodes = []string{enrNode1.String()}
Debug("Creating Node2 with Node1 as Discv5 bootstrap")
node2, err := StartWakuNode("Node2", &nodeConfig)
require.NoError(t, err, "Failed to start Node2")
defer func() {
Debug("Stopping and destroying all Waku nodes")
node1.StopAndDestroy()
node2.StopAndDestroy()
}()
Debug("Waiting to ensure no auto-connection")
time.Sleep(15 * time.Second)
Debug("Verifying number of peers connected to Nodes")
peerCount, err := node1.GetNumConnectedPeers()
require.NoError(t, err, "Failed to get number of peers in mesh for Node1")
Debug("Total number of connected peers for Node1: %d", peerCount)
require.Equal(t, 0, peerCount, "Expected Node1 to have exactly 0 peers in the mesh")
peerCount, err = node2.GetNumConnectedPeers()
require.NoError(t, err, "Failed to get number of peers in mesh for Node2")
Debug("Total number of connected peers for Node2: %d", peerCount)
require.Equal(t, 0, peerCount, "Expected Node2 to have exactly 0 peers in the mesh")
Debug("Test passed: all the nodes have 0 peers")
}
// this test commented as it will fail will be changed to have external ip in future task
/*
func TestDiscv5GetPeersConnected(t *testing.T) {
Debug("Starting test to verify peer count in mesh with 4 nodes using Discv5 (Chained Connection)")
node1Config := DefaultWakuConfig
node1Config.Relay = true
Debug("Creating Node1")
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 = true
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")
enrNode3, err := node3.ENR()
require.NoError(t, err, "Failed to get ENR for Node3")
node4Config := DefaultWakuConfig
node4Config.Relay = true
node4Config.Discv5BootstrapNodes = []string{enrNode3.String()}
Debug("Creating Node4 with Node3 as Discv5 bootstrap")
node4, err := StartWakuNode("Node4", &node4Config)
require.NoError(t, err, "Failed to start Node4")
defer func() {
Debug("Stopping and destroying all Waku nodes")
node1.StopAndDestroy()
node2.StopAndDestroy()
node3.StopAndDestroy()
node4.StopAndDestroy()
}()
Debug("Waiting for nodes to auto-connect via Discv5")
err = WaitForAutoConnection([]*WakuNode{node1, node2, node3, node4})
require.NoError(t, err, "Nodes did not auto-connect within timeout")
Debug("Fetching number of peers in connected to Node1")
peerCount, err := node1.GetNumConnectedPeers()
require.NoError(t, err, "Failed to get number of peers in mesh for Node1")
Debug("Total number of peers connected to Node1: %d", peerCount)
require.Equal(t, 3, peerCount, "Expected Node1 to have exactly 3 peers in the mesh")
Debug("Test successfully verified peer count in mesh with 4 nodes using Discv5 (Chained Connection)")
}
*/