225 lines
5.3 KiB
Go
225 lines
5.3 KiB
Go
|
//stm: #unit
|
||
|
package messagepool
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/ipfs/go-datastore"
|
||
|
logging "github.com/ipfs/go-log/v2"
|
||
|
"github.com/stretchr/testify/assert"
|
||
|
|
||
|
"github.com/filecoin-project/lotus/api"
|
||
|
"github.com/filecoin-project/lotus/chain/consensus/filcns"
|
||
|
"github.com/filecoin-project/lotus/chain/types"
|
||
|
"github.com/filecoin-project/lotus/chain/types/mock"
|
||
|
"github.com/filecoin-project/lotus/chain/wallet"
|
||
|
_ "github.com/filecoin-project/lotus/lib/sigs/bls"
|
||
|
_ "github.com/filecoin-project/lotus/lib/sigs/secp"
|
||
|
)
|
||
|
|
||
|
func init() {
|
||
|
_ = logging.SetLogLevel("*", "INFO")
|
||
|
}
|
||
|
|
||
|
func getCheckMessageStatus(statusCode api.CheckStatusCode, msgStatuses []api.MessageCheckStatus) (*api.MessageCheckStatus, error) {
|
||
|
for i := 0; i < len(msgStatuses); i++ {
|
||
|
iMsgStatuses := msgStatuses[i]
|
||
|
if iMsgStatuses.CheckStatus.Code == statusCode {
|
||
|
return &iMsgStatuses, nil
|
||
|
}
|
||
|
}
|
||
|
return nil, fmt.Errorf("Could not find CheckStatusCode %s", statusCode)
|
||
|
}
|
||
|
|
||
|
func TestCheckMessages(t *testing.T) {
|
||
|
//stm: @CHAIN_MEMPOOL_CHECK_MESSAGES_001
|
||
|
tma := newTestMpoolAPI()
|
||
|
|
||
|
w, err := wallet.NewWallet(wallet.NewMemKeyStore())
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
ds := datastore.NewMapDatastore()
|
||
|
|
||
|
mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
sender, err := w.WalletNew(context.Background(), types.KTSecp256k1)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
tma.setBalance(sender, 1000e15)
|
||
|
target := mock.Address(1001)
|
||
|
|
||
|
var protos []*api.MessagePrototype
|
||
|
for i := 0; i < 5; i++ {
|
||
|
msg := &types.Message{
|
||
|
To: target,
|
||
|
From: sender,
|
||
|
Value: types.NewInt(1),
|
||
|
Nonce: uint64(i),
|
||
|
GasLimit: 50000000,
|
||
|
GasFeeCap: types.NewInt(minimumBaseFee.Uint64()),
|
||
|
GasPremium: types.NewInt(1),
|
||
|
Params: make([]byte, 2<<10),
|
||
|
}
|
||
|
proto := &api.MessagePrototype{
|
||
|
Message: *msg,
|
||
|
ValidNonce: true,
|
||
|
}
|
||
|
protos = append(protos, proto)
|
||
|
}
|
||
|
|
||
|
messageStatuses, err := mp.CheckMessages(context.TODO(), protos)
|
||
|
assert.NoError(t, err)
|
||
|
for i := 0; i < len(messageStatuses); i++ {
|
||
|
iMsgStatuses := messageStatuses[i]
|
||
|
for j := 0; j < len(iMsgStatuses); j++ {
|
||
|
jStatus := iMsgStatuses[i]
|
||
|
assert.True(t, jStatus.OK)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestCheckPendingMessages(t *testing.T) {
|
||
|
//stm: @CHAIN_MEMPOOL_CHECK_PENDING_MESSAGES_001
|
||
|
tma := newTestMpoolAPI()
|
||
|
|
||
|
w, err := wallet.NewWallet(wallet.NewMemKeyStore())
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
ds := datastore.NewMapDatastore()
|
||
|
|
||
|
mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
sender, err := w.WalletNew(context.Background(), types.KTSecp256k1)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
tma.setBalance(sender, 1000e15)
|
||
|
target := mock.Address(1001)
|
||
|
|
||
|
// add a valid message to the pool
|
||
|
msg := &types.Message{
|
||
|
To: target,
|
||
|
From: sender,
|
||
|
Value: types.NewInt(1),
|
||
|
Nonce: 0,
|
||
|
GasLimit: 50000000,
|
||
|
GasFeeCap: types.NewInt(minimumBaseFee.Uint64()),
|
||
|
GasPremium: types.NewInt(1),
|
||
|
Params: make([]byte, 2<<10),
|
||
|
}
|
||
|
|
||
|
sig, err := w.WalletSign(context.TODO(), sender, msg.Cid().Bytes(), api.MsgMeta{})
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
sm := &types.SignedMessage{
|
||
|
Message: *msg,
|
||
|
Signature: *sig,
|
||
|
}
|
||
|
mustAdd(t, mp, sm)
|
||
|
|
||
|
messageStatuses, err := mp.CheckPendingMessages(context.TODO(), sender)
|
||
|
assert.NoError(t, err)
|
||
|
for i := 0; i < len(messageStatuses); i++ {
|
||
|
iMsgStatuses := messageStatuses[i]
|
||
|
for j := 0; j < len(iMsgStatuses); j++ {
|
||
|
jStatus := iMsgStatuses[i]
|
||
|
assert.True(t, jStatus.OK)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestCheckReplaceMessages(t *testing.T) {
|
||
|
//stm: @CHAIN_MEMPOOL_CHECK_REPLACE_MESSAGES_001
|
||
|
tma := newTestMpoolAPI()
|
||
|
|
||
|
w, err := wallet.NewWallet(wallet.NewMemKeyStore())
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
ds := datastore.NewMapDatastore()
|
||
|
|
||
|
mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
sender, err := w.WalletNew(context.Background(), types.KTSecp256k1)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
tma.setBalance(sender, 1000e15)
|
||
|
target := mock.Address(1001)
|
||
|
|
||
|
// add a valid message to the pool
|
||
|
msg := &types.Message{
|
||
|
To: target,
|
||
|
From: sender,
|
||
|
Value: types.NewInt(1),
|
||
|
Nonce: 0,
|
||
|
GasLimit: 50000000,
|
||
|
GasFeeCap: types.NewInt(minimumBaseFee.Uint64()),
|
||
|
GasPremium: types.NewInt(1),
|
||
|
Params: make([]byte, 2<<10),
|
||
|
}
|
||
|
|
||
|
sig, err := w.WalletSign(context.TODO(), sender, msg.Cid().Bytes(), api.MsgMeta{})
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
sm := &types.SignedMessage{
|
||
|
Message: *msg,
|
||
|
Signature: *sig,
|
||
|
}
|
||
|
mustAdd(t, mp, sm)
|
||
|
|
||
|
// create a new message with the same data, except that it is too big
|
||
|
var msgs []*types.Message
|
||
|
invalidmsg := &types.Message{
|
||
|
To: target,
|
||
|
From: sender,
|
||
|
Value: types.NewInt(1),
|
||
|
Nonce: 0,
|
||
|
GasLimit: 50000000,
|
||
|
GasFeeCap: types.NewInt(minimumBaseFee.Uint64()),
|
||
|
GasPremium: types.NewInt(1),
|
||
|
Params: make([]byte, 128<<10),
|
||
|
}
|
||
|
msgs = append(msgs, invalidmsg)
|
||
|
|
||
|
{
|
||
|
messageStatuses, err := mp.CheckReplaceMessages(context.TODO(), msgs)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
for i := 0; i < len(messageStatuses); i++ {
|
||
|
iMsgStatuses := messageStatuses[i]
|
||
|
|
||
|
status, err := getCheckMessageStatus(api.CheckStatusMessageSize, iMsgStatuses)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
// the replacement message should cause a status error
|
||
|
assert.False(t, status.OK)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|