150 lines
3.3 KiB
Go
150 lines
3.3 KiB
Go
package comet
|
||
|
||
import (
|
||
"context"
|
||
"errors"
|
||
"testing"
|
||
|
||
"github.com/cometbft/cometbft/mempool"
|
||
coretypes "github.com/cometbft/cometbft/rpc/core/types"
|
||
"github.com/stretchr/testify/require"
|
||
"go.uber.org/mock/gomock"
|
||
|
||
apiacbci "cosmossdk.io/api/cosmos/base/abci/v1beta1"
|
||
mockrpc "cosmossdk.io/client/v2/broadcast/comet/testutil"
|
||
|
||
"github.com/cosmos/cosmos-sdk/codec"
|
||
"github.com/cosmos/cosmos-sdk/codec/testutil"
|
||
)
|
||
|
||
var cdc = testutil.CodecOptions{}.NewCodec()
|
||
|
||
func TestNewCometBftBroadcaster(t *testing.T) {
|
||
tests := []struct {
|
||
name string
|
||
cdc codec.Codec
|
||
mode string
|
||
want *CometBFTBroadcaster
|
||
wantErr bool
|
||
}{
|
||
{
|
||
name: "constructor",
|
||
mode: BroadcastSync,
|
||
cdc: cdc,
|
||
want: &CometBFTBroadcaster{
|
||
mode: BroadcastSync,
|
||
cdc: cdc,
|
||
},
|
||
},
|
||
{
|
||
name: "nil codec",
|
||
mode: BroadcastSync,
|
||
cdc: nil,
|
||
wantErr: true,
|
||
},
|
||
}
|
||
for _, tt := range tests {
|
||
t.Run(tt.name, func(t *testing.T) {
|
||
got, err := NewCometBFTBroadcaster("localhost:26657", tt.mode, tt.cdc)
|
||
if tt.wantErr {
|
||
require.Error(t, err)
|
||
require.Nil(t, got)
|
||
} else {
|
||
require.Equal(t, got.mode, tt.want.mode)
|
||
require.Equal(t, got.cdc, tt.want.cdc)
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
func TestCometBftBroadcaster_Broadcast(t *testing.T) {
|
||
ctrl := gomock.NewController(t)
|
||
cometMock := mockrpc.NewMockCometRPC(ctrl)
|
||
c := CometBFTBroadcaster{
|
||
rpcClient: cometMock,
|
||
mode: BroadcastSync,
|
||
cdc: cdc,
|
||
}
|
||
tests := []struct {
|
||
name string
|
||
mode string
|
||
setupMock func(*mockrpc.MockCometRPC)
|
||
wantErr bool
|
||
}{
|
||
{
|
||
name: "sync",
|
||
mode: BroadcastSync,
|
||
setupMock: func(m *mockrpc.MockCometRPC) {
|
||
m.EXPECT().BroadcastTxSync(context.Background(), gomock.Any()).Return(&coretypes.ResultBroadcastTx{
|
||
Code: 0,
|
||
Data: []byte{},
|
||
Log: "",
|
||
Codespace: "",
|
||
Hash: []byte("%<25><><EFBFBD><EFBFBD><EFBFBD>\u0010\n<>T<EFBFBD>\u0017\u0016<31>N^H[5<>\u0006}<7D>n<EFBFBD>w<EFBFBD>/Vi<56> "),
|
||
}, nil)
|
||
},
|
||
},
|
||
{
|
||
name: "async",
|
||
mode: BroadcastAsync,
|
||
setupMock: func(m *mockrpc.MockCometRPC) {
|
||
m.EXPECT().BroadcastTxAsync(context.Background(), gomock.Any()).Return(&coretypes.ResultBroadcastTx{
|
||
Code: 0,
|
||
Data: []byte{},
|
||
Log: "",
|
||
Codespace: "",
|
||
Hash: []byte("%<25><><EFBFBD><EFBFBD><EFBFBD>\u0010\n<>T<EFBFBD>\u0017\u0016<31>N^H[5<>\u0006}<7D>n<EFBFBD>w<EFBFBD>/Vi<56> "),
|
||
}, nil)
|
||
},
|
||
},
|
||
}
|
||
for _, tt := range tests {
|
||
t.Run(tt.name, func(t *testing.T) {
|
||
c.mode = tt.mode
|
||
tt.setupMock(cometMock)
|
||
got, err := c.Broadcast(context.Background(), []byte{})
|
||
if tt.wantErr {
|
||
require.Error(t, err)
|
||
} else {
|
||
require.NotNil(t, got)
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
func Test_checkCometError(t *testing.T) {
|
||
tests := []struct {
|
||
name string
|
||
err error
|
||
want *apiacbci.TxResponse
|
||
}{
|
||
{
|
||
name: "tx already in cache",
|
||
err: errors.New("tx already exists in cache"),
|
||
want: &apiacbci.TxResponse{
|
||
Code: 19,
|
||
},
|
||
},
|
||
{
|
||
name: "mempool is full",
|
||
err: mempool.ErrMempoolIsFull{},
|
||
want: &apiacbci.TxResponse{
|
||
Code: 20,
|
||
},
|
||
},
|
||
{
|
||
name: "tx too large",
|
||
err: mempool.ErrTxTooLarge{},
|
||
want: &apiacbci.TxResponse{
|
||
Code: 21,
|
||
},
|
||
},
|
||
}
|
||
for _, tt := range tests {
|
||
t.Run(tt.name, func(t *testing.T) {
|
||
got := checkCometError(tt.err, []byte{})
|
||
require.Equal(t, got.Code, tt.want.Code)
|
||
})
|
||
}
|
||
}
|