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  }