erigon-pulse/p2p/sentry/eth_handshake_test.go
2023-11-02 08:35:13 +07:00

84 lines
2.7 KiB
Go

package sentry
import (
"math/big"
"testing"
"github.com/holiman/uint256"
"github.com/stretchr/testify/assert"
libcommon "github.com/ledgerwatch/erigon-lib/common"
"github.com/ledgerwatch/erigon-lib/direct"
"github.com/ledgerwatch/erigon-lib/gointerfaces"
proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry"
"github.com/ledgerwatch/erigon/core/forkid"
"github.com/ledgerwatch/erigon/eth/protocols/eth"
"github.com/ledgerwatch/erigon/params"
)
func TestCheckPeerStatusCompatibility(t *testing.T) {
var version uint = direct.ETH66
networkID := params.MainnetChainConfig.ChainID.Uint64()
heightForks, timeForks := forkid.GatherForks(params.MainnetChainConfig, 0 /* genesisTime */)
goodReply := eth.StatusPacket{
ProtocolVersion: uint32(version),
NetworkID: networkID,
TD: big.NewInt(0),
Head: libcommon.Hash{},
Genesis: params.MainnetGenesisHash,
ForkID: forkid.NewIDFromForks(heightForks, timeForks, params.MainnetGenesisHash, 0, 0),
}
status := proto_sentry.StatusData{
NetworkId: networkID,
TotalDifficulty: gointerfaces.ConvertUint256IntToH256(new(uint256.Int)),
BestHash: nil,
ForkData: &proto_sentry.Forks{
Genesis: gointerfaces.ConvertHashToH256(params.MainnetGenesisHash),
HeightForks: heightForks,
TimeForks: timeForks,
},
MaxBlockHeight: 0,
}
t.Run("ok", func(t *testing.T) {
err := checkPeerStatusCompatibility(&goodReply, &status, version, version)
assert.Nil(t, err)
})
t.Run("network mismatch", func(t *testing.T) {
reply := goodReply
reply.NetworkID = 0
err := checkPeerStatusCompatibility(&reply, &status, version, version)
assert.NotNil(t, err)
assert.Contains(t, err.Error(), "network")
})
t.Run("version mismatch min", func(t *testing.T) {
reply := goodReply
reply.ProtocolVersion = direct.ETH66 - 1
err := checkPeerStatusCompatibility(&reply, &status, version, version)
assert.NotNil(t, err)
assert.Contains(t, err.Error(), "version is less")
})
t.Run("version mismatch max", func(t *testing.T) {
reply := goodReply
reply.ProtocolVersion = direct.ETH66 + 1
err := checkPeerStatusCompatibility(&reply, &status, version, version)
assert.NotNil(t, err)
assert.Contains(t, err.Error(), "version is more")
})
t.Run("genesis mismatch", func(t *testing.T) {
reply := goodReply
reply.Genesis = libcommon.Hash{}
err := checkPeerStatusCompatibility(&reply, &status, version, version)
assert.NotNil(t, err)
assert.Contains(t, err.Error(), "genesis")
})
t.Run("fork mismatch", func(t *testing.T) {
reply := goodReply
reply.ForkID = forkid.ID{}
err := checkPeerStatusCompatibility(&reply, &status, version, version)
assert.NotNil(t, err)
assert.ErrorIs(t, err, forkid.ErrLocalIncompatibleOrStale)
})
}