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)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
}
 |