--- /dev/null
+package chainmgr
+
+import (
+ "reflect"
+ "testing"
+ "time"
+
+ "github.com/davecgh/go-spew/spew"
+
+ "github.com/vapor/consensus"
+ "github.com/vapor/protocol"
+ "github.com/vapor/protocol/bc"
+ "github.com/vapor/protocol/bc/types"
+ "github.com/vapor/test/mock"
+)
+
+const txsNumber = 2000
+
+func getTransactions() []*types.Tx {
+ txs := []*types.Tx{}
+ for i := 0; i < txsNumber; i++ {
+ txInput := types.NewSpendInput(nil, bc.NewHash([32]byte{0x01}), *consensus.BTMAssetID, uint64(i), 1, []byte{0x51})
+ txInput.CommitmentSuffix = []byte{0, 1, 2}
+ txInput.WitnessSuffix = []byte{0, 1, 2}
+
+ tx := &types.Tx{
+
+ TxData: types.TxData{
+ //SerializedSize: uint64(i * 10),
+ Inputs: []*types.TxInput{
+ txInput,
+ },
+ Outputs: []*types.TxOutput{
+ types.NewIntraChainOutput(*consensus.BTMAssetID, uint64(i), []byte{0x6a}),
+ },
+ },
+ Tx: &bc.Tx{
+ ID: bc.Hash{V0: uint64(i), V1: uint64(i), V2: uint64(i), V3: uint64(i)},
+ },
+ }
+ txs = append(txs, tx)
+ }
+ return txs
+}
+
+func TestSyncMempool(t *testing.T) {
+ blocks := mockBlocks(nil, 5)
+ a := mockSync(blocks, &mock.Mempool{})
+ b := mockSync(blocks, &mock.Mempool{})
+
+ netWork := NewNetWork()
+ netWork.Register(a, "192.168.0.1", "test node A", consensus.SFFullNode)
+ netWork.Register(b, "192.168.0.2", "test node B", consensus.SFFullNode)
+ if B2A, A2B, err := netWork.HandsShake(a, b); err != nil {
+ t.Errorf("fail on peer hands shake %v", err)
+ } else {
+ go B2A.postMan()
+ go A2B.postMan()
+ }
+
+ go a.syncMempoolLoop()
+ a.syncMempool("test node B")
+ wantTxs := getTransactions()
+ a.txSyncCh <- &txSyncMsg{"test node B", wantTxs}
+
+ timeout := time.NewTimer(2 * time.Second)
+ defer timeout.Stop()
+ ticker := time.NewTicker(500 * time.Millisecond)
+ defer ticker.Stop()
+
+ gotTxs := []*protocol.TxDesc{}
+ for {
+ select {
+ case <-ticker.C:
+ gotTxs = b.mempool.GetTransactions()
+ if len(gotTxs) >= txsNumber {
+ goto out
+ }
+ case <-timeout.C:
+ t.Fatalf("mempool sync timeout")
+ }
+ }
+
+out:
+ if len(gotTxs) != txsNumber {
+ t.Fatalf("mempool sync txs num err. got:%d want:%d", len(gotTxs), txsNumber)
+ }
+
+ for i, gotTx := range gotTxs {
+ index := gotTx.Tx.Inputs[0].Amount()
+ if !reflect.DeepEqual(gotTx.Tx.Inputs[0].Amount(), wantTxs[index].Inputs[0].Amount()) {
+ t.Fatalf("mempool tx err. index:%d\n,gotTx:%s\n,wantTx:%s", i, spew.Sdump(gotTx.Tx.Inputs), spew.Sdump(wantTxs[0].Inputs))
+ }
+
+ if !reflect.DeepEqual(gotTx.Tx.Outputs[0].AssetAmount(), wantTxs[index].Outputs[0].AssetAmount()) {
+ t.Fatalf("mempool tx err. index:%d\n,gotTx:%s\n,wantTx:%s", i, spew.Sdump(gotTx.Tx.Outputs), spew.Sdump(wantTxs[0].Outputs))
+ }
+
+ }
+
+}