From 8032ca8bafa1136d96e8182e23df3f27423f2935 Mon Sep 17 00:00:00 2001 From: Gabriel mermelstein Date: Fri, 30 May 2025 15:46:32 +0200 Subject: [PATCH] feat: integrating waku_is_online function --- waku/nwaku.go | 38 ++++++++++++++++++++++++++ waku/nwaku_test.go | 67 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) diff --git a/waku/nwaku.go b/waku/nwaku.go index d88fe4c..6e5eee5 100644 --- a/waku/nwaku.go +++ b/waku/nwaku.go @@ -311,6 +311,10 @@ package waku resp); } + static void cGoWakuIsOnline(void* wakuCtx, void* resp) { + waku_is_online(wakuCtx, (WakuCallBack) GoCallback, resp); + } + */ import "C" import ( @@ -1590,3 +1594,37 @@ func (n *WakuNode) DisconnectPeer(target *WakuNode) error { Debug("Successfully disconnected %s from %s", n.nodeName, target.nodeName) return nil } + +func (n *WakuNode) IsOnline() (bool, error) { + if n == nil { + err := errors.New("waku node is nil") + Error("Failed to get online state %v", err) + return false, err + } + + Debug("Querying online state for %v", n.nodeName) + + wg := sync.WaitGroup{} + var resp = C.allocResp(unsafe.Pointer(&wg)) + defer C.freeResp(resp) + + wg.Add(1) + C.cGoWakuIsOnline(n.wakuCtx, resp) + wg.Wait() + + if C.getRet(resp) == C.RET_OK { + onlineStr := C.GoStringN(C.getMyCharPtr(resp), C.int(C.getMyCharLen(resp))) + + if onlineStr == "true" { + return true, nil + } + + return false, nil + + } + + errMsg := "error IsOnline: " + C.GoStringN(C.getMyCharPtr(resp), C.int(C.getMyCharLen(resp))) + Error("Failed to query online state for %v: %v", n.nodeName, errMsg) + + return false, errors.New(errMsg) +} diff --git a/waku/nwaku_test.go b/waku/nwaku_test.go index eca0dcc..8d5b8cd 100644 --- a/waku/nwaku_test.go +++ b/waku/nwaku_test.go @@ -964,3 +964,70 @@ func TestParallelPings(t *testing.T) { // Stop nodes require.NoError(t, dialerNode.Stop()) } + +func TestOnline(t *testing.T) { + + clusterId := uint16(16) + shardId := uint16(64) + + tcpPort, udpPort, err := GetFreePortIfNeeded(0, 0) + require.NoError(t, err) + + // start node1 + wakuConfig1 := common.WakuConfig{ + Relay: true, + LogLevel: "DEBUG", + Discv5Discovery: false, + ClusterID: clusterId, + Shards: []uint16{shardId}, + Discv5UdpPort: udpPort, + TcpPort: tcpPort, + } + + node1, err := NewWakuNode(&wakuConfig1, "node1") + require.NoError(t, err) + require.NoError(t, node1.Start()) + + tcpPort, udpPort, err = GetFreePortIfNeeded(0, 0) + require.NoError(t, err) + + // start node2 + wakuConfig2 := common.WakuConfig{ + Relay: true, + LogLevel: "DEBUG", + Discv5Discovery: false, + ClusterID: clusterId, + Shards: []uint16{shardId}, + Discv5UdpPort: udpPort, + TcpPort: tcpPort, + } + node2, err := NewWakuNode(&wakuConfig2, "node2") + require.NoError(t, err) + require.NoError(t, node2.Start()) + multiaddr2, err := node2.ListenAddresses() + require.NoError(t, err) + require.NotNil(t, multiaddr2) + require.True(t, len(multiaddr2) > 0) + + // node1 dials node2 so they become peers + ctx, cancel := context.WithTimeout(context.Background(), requestTimeout) + defer cancel() + err = node1.Connect(ctx, multiaddr2[0]) + require.NoError(t, err) + time.Sleep(1 * time.Second) + // Check that both nodes now have one connected peer + peerCount1, err := node1.GetNumConnectedPeers() + require.NoError(t, err) + require.True(t, peerCount1 == 1, "node1 should have 1 peer") + peerCount2, err := node2.GetNumConnectedPeers() + require.NoError(t, err) + require.True(t, peerCount2 == 1, "node2 should have 1 peer") + + isOnline, err := node1.IsOnline() + require.NoError(t, err) + require.True(t, isOnline, "node1 should be online") + + // Stop nodes + require.NoError(t, node1.Stop()) + require.NoError(t, node2.Stop()) +}