From 190d8e8e0881bdcfba0d6fa220abfb05066b9f44 Mon Sep 17 00:00:00 2001 From: Roman Zajic Date: Sun, 21 Jan 2024 11:55:27 +0800 Subject: [PATCH] chore: RLN tests coverage improvement for node gm (#1009) --- waku/v2/node/wakuoptions_test.go | 111 +++++++++++++++++++++++++++ waku/v2/protocol/rln/onchain_test.go | 51 ++++++++++++ 2 files changed, 162 insertions(+) diff --git a/waku/v2/node/wakuoptions_test.go b/waku/v2/node/wakuoptions_test.go index 10d65bd1..abe7a421 100644 --- a/waku/v2/node/wakuoptions_test.go +++ b/waku/v2/node/wakuoptions_test.go @@ -1,6 +1,10 @@ package node import ( + "github.com/ethereum/go-ethereum/common" + "github.com/waku-org/go-waku/waku/v2/protocol/pb" + r "github.com/waku-org/go-zerokit-rln/rln" + "go.uber.org/zap" "net" "testing" "time" @@ -14,6 +18,15 @@ import ( "github.com/waku-org/go-waku/waku/v2/protocol/store" ) +func handleSpam(msg *pb.WakuMessage, topic string) error { + + logger := new(zap.Logger) + + logger.Log(zap.InfoLevel, "Spam has been detected!") + + return nil +} + func TestWakuOptions(t *testing.T) { connStatusChan := make(chan ConnStatus, 100) @@ -59,3 +72,101 @@ func TestWakuOptions(t *testing.T) { require.NotNil(t, params.privKey) require.NotNil(t, params.connStatusC) } + +func TestWakuRLNOptions(t *testing.T) { + connStatusChan := make(chan ConnStatus, 100) + + key, err := tests.RandomHex(32) + require.NoError(t, err) + + prvKey, err := crypto.HexToECDSA(key) + require.NoError(t, err) + + hostAddr, _ := net.ResolveTCPAddr("tcp", "0.0.0.0:0") + + addr, err := multiaddr.NewMultiaddr("/ip4/0.0.0.0/tcp/4000/ws") + require.NoError(t, err) + + storeFactory := func(w *WakuNode) store.Store { + return store.NewWakuStore(w.opts.messageProvider, w.peermanager, w.timesource, prometheus.DefaultRegisterer, w.log) + } + + index := r.MembershipIndex(5) + + // Test WithStaticRLNRelay + + options := []WakuNodeOption{ + WithHostAddress(hostAddr), + WithAdvertiseAddresses(addr), + WithMultiaddress(addr), + WithPrivateKey(prvKey), + WithLibP2POptions(), + WithWakuRelay(), + WithLegacyWakuFilter(true), + WithDiscoveryV5(123, nil, false), + WithWakuStore(), + WithMessageProvider(&persistence.DBStore{}), + WithLightPush(), + WithKeepAlive(time.Hour), + WithConnectionStatusChannel(connStatusChan), + WithWakuStoreFactory(storeFactory), + WithStaticRLNRelay(&index, handleSpam), + } + + params := new(WakuNodeParameters) + + for _, opt := range options { + require.NoError(t, opt(params)) + } + + require.True(t, params.enableRLN) + require.False(t, params.rlnRelayDynamic) + require.Equal(t, uint(5), *params.rlnRelayMemIndex) + require.NotNil(t, params.rlnSpamHandler) + + // Test WithDynamicRLNRelay + + var ( + keystorePath = "./rlnKeystore.json" + keystorePassword = "password" + rlnTreePath = "root" + contractAddress = "0xF471d71E9b1455bBF4b85d475afb9BB0954A29c4" + ethClientAddress = "wss://sepolia.infura.io/ws/v3/API_KEY_GOES_HERE" + ) + + index = uint(0) + + options2 := []WakuNodeOption{ + WithHostAddress(hostAddr), + WithAdvertiseAddresses(addr), + WithMultiaddress(addr), + WithPrivateKey(prvKey), + WithLibP2POptions(), + WithWakuRelay(), + WithLegacyWakuFilter(true), + WithDiscoveryV5(123, nil, false), + WithWakuStore(), + WithMessageProvider(&persistence.DBStore{}), + WithLightPush(), + WithKeepAlive(time.Hour), + WithConnectionStatusChannel(connStatusChan), + WithWakuStoreFactory(storeFactory), + WithDynamicRLNRelay(keystorePath, keystorePassword, rlnTreePath, common.HexToAddress(contractAddress), &index, handleSpam, ethClientAddress), + } + + params2 := new(WakuNodeParameters) + + for _, opt := range options2 { + require.NoError(t, opt(params2)) + } + + require.True(t, params2.enableRLN) + require.True(t, params2.rlnRelayDynamic) + require.Equal(t, keystorePassword, params2.keystorePassword) + require.Equal(t, uint(0), *params2.rlnRelayMemIndex) + require.NotNil(t, params2.rlnSpamHandler) + require.Equal(t, ethClientAddress, params2.rlnETHClientAddress) + require.Equal(t, common.HexToAddress(contractAddress), params2.rlnMembershipContractAddress) + require.Equal(t, rlnTreePath, params2.rlnTreePath) + +} diff --git a/waku/v2/protocol/rln/onchain_test.go b/waku/v2/protocol/rln/onchain_test.go index e603b0e5..866683b4 100644 --- a/waku/v2/protocol/rln/onchain_test.go +++ b/waku/v2/protocol/rln/onchain_test.go @@ -331,3 +331,54 @@ func (s *WakuRLNRelayDynamicSuite) tmpRLNDBPath() string { s.Require().NoError(err) return dbPath } + +func (s *WakuRLNRelayDynamicSuite) TestDynamicGroupManagerGetters() { + // Create a RLN instance + rlnInstance, err := rln.NewRLN() + s.Require().NoError(err) + + ctx := context.Background() + + rt := group_manager.NewMerkleRootTracker(5, rlnInstance) + + u1Credentials := s.generateCredentials(rlnInstance) + appKeystore, err := keystore.New(s.tmpKeystorePath(), dynamic.RLNAppInfo, utils.Logger()) + s.Require().NoError(err) + + membershipIndex := s.register(appKeystore, u1Credentials, s.u1PrivKey) + + gm, err := dynamic.NewDynamicGroupManager(s.web3Config.ETHClientAddress, s.web3Config.RegistryContract.Address, &membershipIndex, appKeystore, keystorePassword, prometheus.DefaultRegisterer, rlnInstance, rt, utils.Logger()) + s.Require().NoError(err) + + // initialize the WakuRLNRelay + rlnRelay := &WakuRLNRelay{ + Details: group_manager.Details{ + RootTracker: rt, + GroupManager: gm, + RLN: rlnInstance, + }, + log: utils.Logger(), + nullifierLog: NewNullifierLog(ctx, utils.Logger()), + } + + err = rlnRelay.Start(ctx) + s.Require().NoError(err) + + // Test IdentityCredentials + _, err = gm.IdentityCredentials() + s.Require().NoError(err) + + // Test MembershipIndex + mIndex := gm.MembershipIndex() + s.Require().Equal(mIndex, uint(membershipIndex)) + + // Test IsReady + isReady, err := gm.IsReady(ctx) + s.Require().NoError(err) + s.Require().True(isReady) + + // Test Stop / gm.Start happened as a part of rlnRelay.Start + err = gm.Stop() + s.Require().NoError(err) + +}