wormhole/node/pkg/watchers/evm/finalizers/moonbeam_test.go

133 lines
4.1 KiB
Go

package finalizers
import (
"context"
"encoding/json"
"fmt"
"math/big"
"testing"
"github.com/certusone/wormhole/node/pkg/watchers/evm/connectors"
ethAbi "github.com/certusone/wormhole/node/pkg/watchers/evm/connectors/ethabi"
ethereum "github.com/ethereum/go-ethereum"
ethCommon "github.com/ethereum/go-ethereum/common"
ethTypes "github.com/ethereum/go-ethereum/core/types"
ethEvent "github.com/ethereum/go-ethereum/event"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.uber.org/zap"
)
type moonbeamMockConnector struct {
isFinalized string
err error
}
func (e *moonbeamMockConnector) RawCallContext(ctx context.Context, result interface{}, method string, args ...interface{}) (err error) {
if method != "moon_isBlockFinalized" {
panic("method not implemented by moonbeamMockConnector")
}
err = json.Unmarshal([]byte(e.isFinalized), &result)
return
}
func (e *moonbeamMockConnector) NetworkName() string {
return "moonbeamMockConnector"
}
func (e *moonbeamMockConnector) ContractAddress() ethCommon.Address {
panic("not implemented by moonbeamMockConnector")
}
func (e *moonbeamMockConnector) GetCurrentGuardianSetIndex(ctx context.Context) (uint32, error) {
panic("not implemented by moonbeamMockConnector")
}
func (e *moonbeamMockConnector) GetGuardianSet(ctx context.Context, index uint32) (ethAbi.StructsGuardianSet, error) {
panic("not implemented by moonbeamMockConnector")
}
func (e *moonbeamMockConnector) WatchLogMessagePublished(ctx context.Context, errC chan error, sink chan<- *ethAbi.AbiLogMessagePublished) (ethEvent.Subscription, error) {
panic("not implemented by moonbeamMockConnector")
}
func (e *moonbeamMockConnector) TransactionReceipt(ctx context.Context, txHash ethCommon.Hash) (*ethTypes.Receipt, error) {
panic("not implemented by moonbeamMockConnector")
}
func (e *moonbeamMockConnector) TimeOfBlockByHash(ctx context.Context, hash ethCommon.Hash) (uint64, error) {
panic("not implemented by moonbeamMockConnector")
}
func (e *moonbeamMockConnector) ParseLogMessagePublished(log ethTypes.Log) (*ethAbi.AbiLogMessagePublished, error) {
panic("not implemented by moonbeamMockConnector")
}
func (e *moonbeamMockConnector) SubscribeForBlocks(ctx context.Context, errC chan error, sink chan<- *connectors.NewBlock) (ethereum.Subscription, error) {
panic("not implemented by moonbeamMockConnector")
}
func TestMoonbeamErrorReturnedIfBlockIsNil(t *testing.T) {
ctx := context.Background()
logger := zap.NewNop()
baseConnector := moonbeamMockConnector{isFinalized: "true", err: nil}
finalizer := NewMoonbeamFinalizer(logger, &baseConnector)
assert.NotNil(t, finalizer)
_, err := finalizer.IsBlockFinalized(ctx, nil)
require.Error(t, err)
}
func TestMoonbeamBlockNotFinalized(t *testing.T) {
ctx := context.Background()
logger := zap.NewNop()
baseConnector := moonbeamMockConnector{isFinalized: "false", err: nil}
finalizer := NewMoonbeamFinalizer(logger, &baseConnector)
assert.NotNil(t, finalizer)
block := &connectors.NewBlock{
Number: big.NewInt(125),
Hash: ethCommon.HexToHash("0x1076cd8c207f31e1638b37bb358c458f216f5451f06e2ccb4eb9db66ad669f30"),
}
finalized, err := finalizer.IsBlockFinalized(ctx, block)
require.NoError(t, err)
assert.Equal(t, false, finalized)
}
func TestMoonbeamBlockIsFinalized(t *testing.T) {
ctx := context.Background()
logger := zap.NewNop()
baseConnector := moonbeamMockConnector{isFinalized: "true", err: nil}
finalizer := NewMoonbeamFinalizer(logger, &baseConnector)
assert.NotNil(t, finalizer)
block := &connectors.NewBlock{
Number: big.NewInt(125),
Hash: ethCommon.HexToHash("0x1076cd8c207f31e1638b37bb358c458f216f5451f06e2ccb4eb9db66ad669f30"),
}
finalized, err := finalizer.IsBlockFinalized(ctx, block)
require.NoError(t, err)
assert.Equal(t, true, finalized)
}
func TestMoonbeamRpcError(t *testing.T) {
ctx := context.Background()
logger := zap.NewNop()
baseConnector := moonbeamMockConnector{isFinalized: "true", err: fmt.Errorf("RPC failed")}
finalizer := NewMoonbeamFinalizer(logger, &baseConnector)
assert.NotNil(t, finalizer)
_, err := finalizer.IsBlockFinalized(ctx, nil)
require.Error(t, err)
}