OSDN Git Service

Merge pull request #207 from Bytom/edit_log
[bytom/vapor.git] / netsync / chainmgr / tx_keeper_test.go
1 package chainmgr
2
3 import (
4         "reflect"
5         "testing"
6         "time"
7
8         "github.com/davecgh/go-spew/spew"
9
10         "github.com/vapor/consensus"
11         "github.com/vapor/protocol"
12         "github.com/vapor/protocol/bc"
13         "github.com/vapor/protocol/bc/types"
14         "github.com/vapor/test/mock"
15 )
16
17 const txsNumber = 2000
18
19 func getTransactions() []*types.Tx {
20         txs := []*types.Tx{}
21         for i := 0; i < txsNumber; i++ {
22                 txInput := types.NewSpendInput(nil, bc.NewHash([32]byte{0x01}), *consensus.BTMAssetID, uint64(i), 1, []byte{0x51})
23                 txInput.CommitmentSuffix = []byte{0, 1, 2}
24                 txInput.WitnessSuffix = []byte{0, 1, 2}
25
26                 tx := &types.Tx{
27
28                         TxData: types.TxData{
29                                 //SerializedSize: uint64(i * 10),
30                                 Inputs: []*types.TxInput{
31                                         txInput,
32                                 },
33                                 Outputs: []*types.TxOutput{
34                                         types.NewIntraChainOutput(*consensus.BTMAssetID, uint64(i), []byte{0x6a}),
35                                 },
36                         },
37                         Tx: &bc.Tx{
38                                 ID: bc.Hash{V0: uint64(i), V1: uint64(i), V2: uint64(i), V3: uint64(i)},
39                         },
40                 }
41                 txs = append(txs, tx)
42         }
43         return txs
44 }
45
46 func TestSyncMempool(t *testing.T) {
47         blocks := mockBlocks(nil, 5)
48         a := mockSync(blocks, &mock.Mempool{})
49         b := mockSync(blocks, &mock.Mempool{})
50
51         netWork := NewNetWork()
52         netWork.Register(a, "192.168.0.1", "test node A", consensus.SFFullNode)
53         netWork.Register(b, "192.168.0.2", "test node B", consensus.SFFullNode)
54         if B2A, A2B, err := netWork.HandsShake(a, b); err != nil {
55                 t.Errorf("fail on peer hands shake %v", err)
56         } else {
57                 go B2A.postMan()
58                 go A2B.postMan()
59         }
60
61         go a.syncMempoolLoop()
62         a.syncMempool("test node B")
63         wantTxs := getTransactions()
64         a.txSyncCh <- &txSyncMsg{"test node B", wantTxs}
65
66         timeout := time.NewTimer(2 * time.Second)
67         defer timeout.Stop()
68         ticker := time.NewTicker(500 * time.Millisecond)
69         defer ticker.Stop()
70
71         gotTxs := []*protocol.TxDesc{}
72         for {
73                 select {
74                 case <-ticker.C:
75                         gotTxs = b.mempool.GetTransactions()
76                         if len(gotTxs) >= txsNumber {
77                                 goto out
78                         }
79                 case <-timeout.C:
80                         t.Fatalf("mempool sync timeout")
81                 }
82         }
83
84 out:
85         if len(gotTxs) != txsNumber {
86                 t.Fatalf("mempool sync txs num err. got:%d want:%d", len(gotTxs), txsNumber)
87         }
88
89         for i, gotTx := range gotTxs {
90                 index := gotTx.Tx.Inputs[0].Amount()
91                 if !reflect.DeepEqual(gotTx.Tx.Inputs[0].Amount(), wantTxs[index].Inputs[0].Amount()) {
92                         t.Fatalf("mempool tx err. index:%d\n,gotTx:%s\n,wantTx:%s", i, spew.Sdump(gotTx.Tx.Inputs), spew.Sdump(wantTxs[0].Inputs))
93                 }
94
95                 if !reflect.DeepEqual(gotTx.Tx.Outputs[0].AssetAmount(), wantTxs[index].Outputs[0].AssetAmount()) {
96                         t.Fatalf("mempool tx err. index:%d\n,gotTx:%s\n,wantTx:%s", i, spew.Sdump(gotTx.Tx.Outputs), spew.Sdump(wantTxs[0].Outputs))
97                 }
98
99         }
100
101 }