184 lines
6.2 KiB
Go
184 lines
6.2 KiB
Go
package mempool
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/meshplus/bitxhub-kit/types"
|
|
"github.com/meshplus/bitxhub-model/pb"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestGetBlock(t *testing.T) {
|
|
ast := assert.New(t)
|
|
mpi, _ := mockMempoolImpl()
|
|
privKey1 := genPrivKey()
|
|
privKey2 := genPrivKey()
|
|
tx1 := constructTx(uint64(1), &privKey1)
|
|
tx2 := constructTx(uint64(2), &privKey1)
|
|
tx3 := constructTx(uint64(2), &privKey2)
|
|
tx4 := constructTx(uint64(4), &privKey2)
|
|
var txList []*pb.Transaction
|
|
txList = append(txList, tx1, tx2, tx3, tx4)
|
|
// mock follower
|
|
batch := mpi.ProcessTransactions(txList, false)
|
|
ast.Nil(batch)
|
|
// mock leader
|
|
batch = mpi.ProcessTransactions(txList, true)
|
|
ast.Nil(batch)
|
|
|
|
// mock leader to getBlock
|
|
txList = make([]*pb.Transaction,0)
|
|
tx5 := constructTx(uint64(1), &privKey2)
|
|
txList = append(txList, tx5)
|
|
batch = mpi.ProcessTransactions(txList, true)
|
|
ast.Equal(4, len(batch.TxList))
|
|
}
|
|
|
|
func TestGetPendingNonceByAccount(t *testing.T) {
|
|
ast := assert.New(t)
|
|
mpi, _ := mockMempoolImpl()
|
|
privKey1 := genPrivKey()
|
|
account1, _ := privKey1.PublicKey().Address()
|
|
nonce := mpi.GetPendingNonceByAccount(account1.String())
|
|
ast.Equal(uint64(1), nonce)
|
|
|
|
privKey2 := genPrivKey()
|
|
account2, _ := privKey2.PublicKey().Address()
|
|
tx1 := constructTx(uint64(1), &privKey1)
|
|
tx2 := constructTx(uint64(2), &privKey1)
|
|
tx3 := constructTx(uint64(1), &privKey2)
|
|
tx4 := constructTx(uint64(2), &privKey2)
|
|
tx5 := constructTx(uint64(4), &privKey2)
|
|
var txList []*pb.Transaction
|
|
txList = append(txList, tx1, tx2, tx3, tx4, tx5)
|
|
batch := mpi.ProcessTransactions(txList, false)
|
|
ast.Nil(batch)
|
|
nonce = mpi.GetPendingNonceByAccount(account1.String())
|
|
ast.Equal(uint64(3), nonce)
|
|
nonce = mpi.GetPendingNonceByAccount(account2.String())
|
|
ast.Equal(uint64(3), nonce, "not 4")
|
|
}
|
|
|
|
func TestCommitTransactions(t *testing.T) {
|
|
ast := assert.New(t)
|
|
mpi, batchC := mockMempoolImpl()
|
|
privKey1 := genPrivKey()
|
|
account1, _ := privKey1.PublicKey().Address()
|
|
nonce := mpi.GetPendingNonceByAccount(account1.String())
|
|
ast.Equal(uint64(1), nonce)
|
|
privKey2 := genPrivKey()
|
|
tx1 := constructTx(uint64(1), &privKey1)
|
|
tx2 := constructTx(uint64(2), &privKey1)
|
|
tx3 := constructTx(uint64(1), &privKey2)
|
|
tx4 := constructTx(uint64(4), &privKey2)
|
|
var txList []*pb.Transaction
|
|
txList = append(txList, tx1, tx2, tx3, tx4)
|
|
batch := mpi.ProcessTransactions(txList, true)
|
|
ast.Nil(batch)
|
|
ast.Equal(3, mpi.txStore.priorityIndex.size())
|
|
ast.Equal(1, mpi.txStore.parkingLotIndex.size())
|
|
|
|
go func() {
|
|
<-batchC
|
|
}()
|
|
tx5 := constructTx(uint64(2), &privKey2)
|
|
txList = []*pb.Transaction{}
|
|
txList = append(txList, tx5)
|
|
batch = mpi.ProcessTransactions(txList, true)
|
|
ast.Equal(4, len(batch.TxList))
|
|
ast.Equal(4, mpi.txStore.priorityIndex.size())
|
|
ast.Equal(1, mpi.txStore.parkingLotIndex.size())
|
|
ast.Equal(uint64(2), mpi.batchSeqNo)
|
|
|
|
var txHashList []*types.Hash
|
|
txHashList = append(txHashList, tx1.TransactionHash, tx2.TransactionHash, tx3.TransactionHash, tx5.TransactionHash)
|
|
state := &ChainState{
|
|
TxHashList: txHashList,
|
|
Height: uint64(2),
|
|
}
|
|
mpi.CommitTransactions(state)
|
|
time.Sleep(100 * time.Millisecond)
|
|
ast.Equal(0, mpi.txStore.priorityIndex.size())
|
|
ast.Equal(1, mpi.txStore.parkingLotIndex.size())
|
|
}
|
|
|
|
func TestIncreaseChainHeight(t *testing.T) {
|
|
ast := assert.New(t)
|
|
mpi, _ := mockMempoolImpl()
|
|
ast.Equal(uint64(1), mpi.batchSeqNo)
|
|
mpi.batchSeqNo++
|
|
mpi.SetBatchSeqNo(mpi.batchSeqNo)
|
|
ast.Equal(uint64(2), mpi.batchSeqNo)
|
|
}
|
|
|
|
func TestProcessTransactions(t *testing.T) {
|
|
ast := assert.New(t)
|
|
mpi, _ := mockMempoolImpl()
|
|
txList := make([]*pb.Transaction, 0)
|
|
privKey1 := genPrivKey()
|
|
account1, _ := privKey1.PublicKey().Address()
|
|
privKey2 := genPrivKey()
|
|
account2, _ := privKey2.PublicKey().Address()
|
|
tx1 := constructTx(uint64(1), &privKey1)
|
|
tx2 := constructTx(uint64(2), &privKey1)
|
|
tx3 := constructTx(uint64(1), &privKey2)
|
|
tx4 := constructTx(uint64(2), &privKey2)
|
|
tx5 := constructTx(uint64(4), &privKey2)
|
|
txList = append(txList, tx1, tx2, tx3, tx4, tx5)
|
|
batch := mpi.ProcessTransactions(txList, false)
|
|
ast.Nil(batch)
|
|
ast.Equal(4, mpi.txStore.priorityIndex.size())
|
|
ast.Equal(1, mpi.txStore.parkingLotIndex.size())
|
|
ast.Equal(5, len(mpi.txStore.txHashMap))
|
|
ast.Equal(2, mpi.txStore.allTxs[account1.String()].index.size())
|
|
ast.Equal(3, mpi.txStore.allTxs[account2.String()].index.size())
|
|
ast.Equal(uint64(1), mpi.txStore.nonceCache.getCommitNonce(account1.String()))
|
|
ast.Equal(uint64(3), mpi.txStore.nonceCache.getPendingNonce(account1.String()))
|
|
ast.Equal(uint64(1), mpi.txStore.nonceCache.getCommitNonce(account2.String()))
|
|
ast.Equal(uint64(3), mpi.txStore.nonceCache.getPendingNonce(account2.String()))
|
|
|
|
mpi.batchSize = 4
|
|
tx6 := constructTx(uint64(3), &privKey1)
|
|
tx7 := constructTx(uint64(5), &privKey2)
|
|
txList = make([]*pb.Transaction, 0)
|
|
txList = append(txList, tx6, tx7)
|
|
batch = mpi.ProcessTransactions(txList, true)
|
|
ast.Equal(4, len(batch.TxList))
|
|
ast.Equal(uint64(2), batch.Height)
|
|
ast.Equal(uint64(1), mpi.txStore.priorityNonBatchSize)
|
|
ast.Equal(5, mpi.txStore.priorityIndex.size())
|
|
ast.Equal(2, mpi.txStore.parkingLotIndex.size())
|
|
ast.Equal(7, len(mpi.txStore.txHashMap))
|
|
ast.Equal(3, mpi.txStore.allTxs[account1.String()].index.size())
|
|
ast.Equal(4, mpi.txStore.allTxs[account2.String()].index.size())
|
|
ast.Equal(uint64(4), mpi.txStore.nonceCache.getPendingNonce(account1.String()))
|
|
ast.Equal(uint64(3), mpi.txStore.nonceCache.getPendingNonce(account2.String()))
|
|
}
|
|
|
|
|
|
func TestForward(t *testing.T) {
|
|
ast := assert.New(t)
|
|
mpi, _ := mockMempoolImpl()
|
|
txList := make([]*pb.Transaction, 0)
|
|
privKey1 := genPrivKey()
|
|
account1, _ := privKey1.PublicKey().Address()
|
|
tx1 := constructTx(uint64(1), &privKey1)
|
|
tx2 := constructTx(uint64(2), &privKey1)
|
|
tx3 := constructTx(uint64(3), &privKey1)
|
|
tx4 := constructTx(uint64(4), &privKey1)
|
|
tx5 := constructTx(uint64(6), &privKey1)
|
|
txList = append(txList, tx1, tx2, tx3, tx4, tx5)
|
|
batch := mpi.ProcessTransactions(txList, false)
|
|
ast.Nil(batch)
|
|
list := mpi.txStore.allTxs[account1.String()]
|
|
ast.Equal(5, list.index.size())
|
|
ast.Equal(4, mpi.txStore.priorityIndex.size())
|
|
ast.Equal(1, mpi.txStore.parkingLotIndex.size())
|
|
|
|
removeList := list.forward(uint64(3))
|
|
ast.Equal(1, len(removeList))
|
|
ast.Equal(2, len(removeList[account1.String()]))
|
|
ast.Equal(uint64(1), removeList[account1.String()][0].Nonce)
|
|
ast.Equal(uint64(2), removeList[account1.String()][1].Nonce)
|
|
} |