github.com/pokt-network/tendermint@v0.32.11-0.20230426215212-59310158d3e9/p2p/node_info_test.go (about) 1 package p2p 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 9 "github.com/tendermint/tendermint/crypto/ed25519" 10 ) 11 12 func TestNodeInfoValidate(t *testing.T) { 13 14 // empty fails 15 ni := DefaultNodeInfo{} 16 assert.Error(t, ni.Validate()) 17 18 channels := make([]byte, maxNumChannels) 19 for i := 0; i < maxNumChannels; i++ { 20 channels[i] = byte(i) 21 } 22 dupChannels := make([]byte, 5) 23 copy(dupChannels, channels[:5]) 24 dupChannels = append(dupChannels, testCh) 25 26 nonASCII := "¢§µ" 27 emptyTab := fmt.Sprintf("\t") 28 emptySpace := fmt.Sprintf(" ") 29 30 testCases := []struct { 31 testName string 32 malleateNodeInfo func(*DefaultNodeInfo) 33 expectErr bool 34 }{ 35 { 36 "Too Many Channels", 37 func(ni *DefaultNodeInfo) { ni.Channels = append(channels, byte(maxNumChannels)) }, // nolint: gocritic 38 true, 39 }, 40 {"Duplicate Channel", func(ni *DefaultNodeInfo) { ni.Channels = dupChannels }, true}, 41 {"Good Channels", func(ni *DefaultNodeInfo) { ni.Channels = ni.Channels[:5] }, false}, 42 43 {"Invalid NetAddress", func(ni *DefaultNodeInfo) { ni.ListenAddr = "not-an-address" }, true}, 44 {"Good NetAddress", func(ni *DefaultNodeInfo) { ni.ListenAddr = "0.0.0.0:26656" }, false}, 45 46 {"Non-ASCII Version", func(ni *DefaultNodeInfo) { ni.Version = nonASCII }, true}, 47 {"Empty tab Version", func(ni *DefaultNodeInfo) { ni.Version = emptyTab }, true}, 48 {"Empty space Version", func(ni *DefaultNodeInfo) { ni.Version = emptySpace }, true}, 49 {"Empty Version", func(ni *DefaultNodeInfo) { ni.Version = "" }, false}, 50 51 {"Non-ASCII Moniker", func(ni *DefaultNodeInfo) { ni.Moniker = nonASCII }, true}, 52 {"Empty tab Moniker", func(ni *DefaultNodeInfo) { ni.Moniker = emptyTab }, true}, 53 {"Empty space Moniker", func(ni *DefaultNodeInfo) { ni.Moniker = emptySpace }, true}, 54 {"Empty Moniker", func(ni *DefaultNodeInfo) { ni.Moniker = "" }, true}, 55 {"Good Moniker", func(ni *DefaultNodeInfo) { ni.Moniker = "hey its me" }, false}, 56 57 {"Non-ASCII TxIndex", func(ni *DefaultNodeInfo) { ni.Other.TxIndex = nonASCII }, true}, 58 {"Empty tab TxIndex", func(ni *DefaultNodeInfo) { ni.Other.TxIndex = emptyTab }, true}, 59 {"Empty space TxIndex", func(ni *DefaultNodeInfo) { ni.Other.TxIndex = emptySpace }, true}, 60 {"Empty TxIndex", func(ni *DefaultNodeInfo) { ni.Other.TxIndex = "" }, false}, 61 {"Off TxIndex", func(ni *DefaultNodeInfo) { ni.Other.TxIndex = "off" }, false}, 62 63 {"Non-ASCII RPCAddress", func(ni *DefaultNodeInfo) { ni.Other.RPCAddress = nonASCII }, true}, 64 {"Empty tab RPCAddress", func(ni *DefaultNodeInfo) { ni.Other.RPCAddress = emptyTab }, true}, 65 {"Empty space RPCAddress", func(ni *DefaultNodeInfo) { ni.Other.RPCAddress = emptySpace }, true}, 66 {"Empty RPCAddress", func(ni *DefaultNodeInfo) { ni.Other.RPCAddress = "" }, false}, 67 {"Good RPCAddress", func(ni *DefaultNodeInfo) { ni.Other.RPCAddress = "0.0.0.0:26657" }, false}, 68 } 69 70 nodeKey := NodeKey{PrivKey: ed25519.GenPrivKey()} 71 name := "testing" 72 73 // test case passes 74 ni = testNodeInfo(nodeKey.ID(), name).(DefaultNodeInfo) 75 ni.Channels = channels 76 assert.NoError(t, ni.Validate()) 77 78 for _, tc := range testCases { 79 ni := testNodeInfo(nodeKey.ID(), name).(DefaultNodeInfo) 80 ni.Channels = channels 81 tc.malleateNodeInfo(&ni) 82 err := ni.Validate() 83 if tc.expectErr { 84 assert.Error(t, err, tc.testName) 85 } else { 86 assert.NoError(t, err, tc.testName) 87 } 88 } 89 90 } 91 92 func TestNodeInfoCompatible(t *testing.T) { 93 94 nodeKey1 := NodeKey{PrivKey: ed25519.GenPrivKey()} 95 nodeKey2 := NodeKey{PrivKey: ed25519.GenPrivKey()} 96 name := "testing" 97 98 var newTestChannel byte = 0x2 99 100 // test NodeInfo is compatible 101 ni1 := testNodeInfo(nodeKey1.ID(), name).(DefaultNodeInfo) 102 ni2 := testNodeInfo(nodeKey2.ID(), name).(DefaultNodeInfo) 103 assert.NoError(t, ni1.CompatibleWith(ni2)) 104 105 // add another channel; still compatible 106 ni2.Channels = []byte{newTestChannel, testCh} 107 assert.NoError(t, ni1.CompatibleWith(ni2)) 108 109 // wrong NodeInfo type is not compatible 110 _, netAddr := CreateRoutableAddr() 111 ni3 := mockNodeInfo{netAddr} 112 assert.Error(t, ni1.CompatibleWith(ni3)) 113 114 testCases := []struct { 115 testName string 116 malleateNodeInfo func(*DefaultNodeInfo) 117 }{ 118 {"Wrong block version", func(ni *DefaultNodeInfo) { ni.ProtocolVersion.Block++ }}, 119 {"Wrong network", func(ni *DefaultNodeInfo) { ni.Network += "-wrong" }}, 120 {"No common channels", func(ni *DefaultNodeInfo) { ni.Channels = []byte{newTestChannel} }}, 121 } 122 123 for _, tc := range testCases { 124 ni := testNodeInfo(nodeKey2.ID(), name).(DefaultNodeInfo) 125 tc.malleateNodeInfo(&ni) 126 assert.Error(t, ni1.CompatibleWith(ni)) 127 } 128 }