8 "github.com/davecgh/go-spew/spew"
9 "github.com/tendermint/tmlibs/flowrate"
10 "github.com/vapor/consensus"
11 "github.com/vapor/p2p/security"
12 "github.com/vapor/protocol/bc"
13 "github.com/vapor/protocol/bc/types"
22 block1000Hash = bc.NewHash([32]byte{0x01, 0x02})
23 block2000Hash = bc.NewHash([32]byte{0x02, 0x03})
24 block3000Hash = bc.NewHash([32]byte{0x03, 0x04})
27 type basePeer struct {
29 serviceFlag consensus.ServiceFlag
33 func (bp *basePeer) Addr() net.Addr {
37 func (bp *basePeer) ID() string {
41 func (bp *basePeer) RemoteAddrHost() string {
55 func (bp *basePeer) ServiceFlag() consensus.ServiceFlag {
59 func (bp *basePeer) TrafficStatus() (*flowrate.Status, *flowrate.Status) {
63 func (bp *basePeer) TrySend(byte, interface{}) bool {
67 func (bp *basePeer) IsLAN() bool {
71 func TestSetPeerStatus(t *testing.T) {
72 peer := newPeer(&basePeer{})
74 hash := bc.NewHash([32]byte{0x1, 0x2})
75 peer.SetBestStatus(height, &hash)
76 if peer.Height() != height {
77 t.Fatalf("test set best status err. got %d want %d", peer.Height(), height)
81 func TestSetIrreversibleStatus(t *testing.T) {
82 peer := newPeer(&basePeer{})
84 hash := bc.NewHash([32]byte{0x1, 0x2})
85 peer.SetIrreversibleStatus(height, &hash)
86 if peer.IrreversibleHeight() != height {
87 t.Fatalf("test set Irreversible status err. got %d want %d", peer.Height(), height)
91 func TestAddFilterAddresses(t *testing.T) {
92 peer := newPeer(&basePeer{})
93 tx := types.NewTx(types.TxData{
94 Inputs: []*types.TxInput{
95 types.NewSpendInput(nil, bc.Hash{}, bc.NewAssetID([32]byte{1}), 5, 1, []byte("spendProgram")),
97 Outputs: []*types.TxOutput{
98 types.NewIntraChainOutput(bc.NewAssetID([32]byte{3}), 8, []byte("outProgram")),
102 peer.AddFilterAddresses([][]byte{[]byte("spendProgram")})
103 if !peer.isRelatedTx(tx) {
104 t.Fatal("test filter addresses error.")
107 peer.AddFilterAddresses([][]byte{[]byte("testProgram")})
108 if peer.isRelatedTx(tx) {
109 t.Fatal("test filter addresses error.")
113 func TestFilterClear(t *testing.T) {
114 peer := newPeer(&basePeer{})
115 tx := types.NewTx(types.TxData{
116 Inputs: []*types.TxInput{
117 types.NewSpendInput(nil, bc.Hash{}, bc.NewAssetID([32]byte{1}), 5, 1, []byte("spendProgram")),
119 Outputs: []*types.TxOutput{
120 types.NewIntraChainOutput(bc.NewAssetID([32]byte{3}), 8, []byte("outProgram")),
124 peer.AddFilterAddresses([][]byte{[]byte("spendProgram")})
125 if !peer.isRelatedTx(tx) {
126 t.Fatal("test filter addresses error.")
130 if peer.isRelatedTx(tx) {
131 t.Fatal("test filter addresses error.")
135 func TestGetRelatedTxAndStatus(t *testing.T) {
136 peer := newPeer(&basePeer{})
138 types.NewTx(types.TxData{
139 Inputs: []*types.TxInput{
140 types.NewSpendInput(nil, bc.Hash{}, bc.NewAssetID([32]byte{1}), 5, 1, []byte("spendProgram1")),
142 Outputs: []*types.TxOutput{
143 types.NewIntraChainOutput(bc.NewAssetID([32]byte{3}), 8, []byte("outProgram1")),
146 types.NewTx(types.TxData{
147 Inputs: []*types.TxInput{
148 types.NewSpendInput(nil, bc.Hash{}, bc.NewAssetID([32]byte{1}), 5, 1, []byte("spendProgram2")),
150 Outputs: []*types.TxOutput{
151 types.NewIntraChainOutput(bc.NewAssetID([32]byte{3}), 8, []byte("outProgram2")),
154 types.NewTx(types.TxData{
155 Inputs: []*types.TxInput{
156 types.NewSpendInput(nil, bc.Hash{}, bc.NewAssetID([32]byte{1}), 5, 1, []byte("spendProgram3")),
158 Outputs: []*types.TxOutput{
159 types.NewIntraChainOutput(bc.NewAssetID([32]byte{3}), 8, []byte("outProgram3")),
163 txStatuses := &bc.TransactionStatus{
164 VerifyStatus: []*bc.TxVerifyResult{{StatusFail: true}, {StatusFail: false}, {StatusFail: false}},
166 peer.AddFilterAddresses([][]byte{[]byte("spendProgram1"), []byte("outProgram3")})
167 gotTxs, gotStatus := peer.getRelatedTxAndStatus(txs, txStatuses)
168 if len(gotTxs) != 2 {
169 t.Error("TestGetRelatedTxAndStatus txs size error")
172 if !reflect.DeepEqual(*gotTxs[0].Tx, *txs[0].Tx) {
173 t.Errorf("txs msg test err: got %s\nwant %s", spew.Sdump(gotTxs[0].Tx), spew.Sdump(txs[0].Tx))
176 if !reflect.DeepEqual(*gotTxs[1].Tx, *txs[2].Tx) {
177 t.Errorf("txs msg test err: got %s\nwant %s", spew.Sdump(gotTxs[1].Tx), spew.Sdump(txs[2].Tx))
180 if gotStatus[0].StatusFail != true || gotStatus[1].StatusFail != false {
181 t.Error("TestGetRelatedTxAndStatus txs status error")
185 type basePeerSet struct {
188 func (bp *basePeerSet) StopPeerGracefully(string) {
192 func (bp *basePeerSet) IsBanned(ip string, level byte, reason string) bool {
206 func TestMarkBlock(t *testing.T) {
207 ps := NewPeerSet(&basePeerSet{})
208 ps.AddPeer(&basePeer{id: peer1ID})
209 ps.AddPeer(&basePeer{id: peer2ID})
210 ps.AddPeer(&basePeer{id: peer3ID})
212 blockHash := bc.NewHash([32]byte{0x01, 0x02})
213 ps.MarkBlock(peer1ID, &blockHash)
214 targetPeers := []string{peer2ID, peer3ID}
216 peers := ps.PeersWithoutBlock(blockHash)
217 if len(peers) != len(targetPeers) {
218 t.Fatalf("test mark block err. Number of target peers %d got %d", 1, len(peers))
221 for _, targetPeer := range targetPeers {
223 for _, gotPeer := range peers {
224 if gotPeer == targetPeer {
230 t.Errorf("test mark block err. can't found target peer %s ", targetPeer)
235 func TestMarkStatus(t *testing.T) {
236 ps := NewPeerSet(&basePeerSet{})
237 ps.AddPeer(&basePeer{id: peer1ID})
238 ps.AddPeer(&basePeer{id: peer2ID})
239 ps.AddPeer(&basePeer{id: peer3ID})
241 height := uint64(1024)
242 ps.MarkStatus(peer1ID, height)
243 targetPeers := []string{peer2ID, peer3ID}
245 peers := ps.peersWithoutNewStatus(height)
246 if len(peers) != len(targetPeers) {
247 t.Fatalf("test mark status err. Number of target peers %d got %d", 1, len(peers))
250 for _, targetPeer := range targetPeers {
252 for _, gotPeer := range peers {
253 if gotPeer.ID() == targetPeer {
259 t.Errorf("test mark status err. can't found target peer %s ", targetPeer)
264 func TestMarkBlockSignature(t *testing.T) {
265 ps := NewPeerSet(&basePeerSet{})
266 ps.AddPeer(&basePeer{id: peer1ID})
267 ps.AddPeer(&basePeer{id: peer2ID})
268 ps.AddPeer(&basePeer{id: peer3ID})
270 signature := []byte{0x01, 0x02}
271 ps.MarkBlockSignature(peer1ID, signature)
272 targetPeers := []string{peer2ID, peer3ID}
274 peers := ps.PeersWithoutSignature(signature)
275 if len(peers) != len(targetPeers) {
276 t.Fatalf("test mark block signature err. Number of target peers %d got %d", 1, len(peers))
279 for _, targetPeer := range targetPeers {
281 for _, gotPeer := range peers {
282 if gotPeer == targetPeer {
288 t.Errorf("test mark block signature err. can't found target peer %s ", targetPeer)
293 func TestMarkTx(t *testing.T) {
294 ps := NewPeerSet(&basePeerSet{})
295 ps.AddPeer(&basePeer{id: peer1ID})
296 ps.AddPeer(&basePeer{id: peer2ID})
297 ps.AddPeer(&basePeer{id: peer3ID})
299 txHash := bc.NewHash([32]byte{0x01, 0x02})
300 ps.MarkTx(peer1ID, txHash)
301 peers := ps.peersWithoutTx(&txHash)
302 targetPeers := []string{peer2ID, peer3ID}
303 if len(peers) != len(targetPeers) {
304 t.Fatalf("test mark tx err. Number of target peers %d got %d", 1, len(peers))
307 for _, targetPeer := range targetPeers {
309 for _, gotPeer := range peers {
310 if gotPeer.ID() == targetPeer {
316 t.Errorf("test mark tx err. can't found target peer %s ", targetPeer)
321 func TestSetStatus(t *testing.T) {
322 ps := NewPeerSet(&basePeerSet{})
323 ps.AddPeer(&basePeer{id: peer1ID, serviceFlag: consensus.SFFullNode})
324 ps.AddPeer(&basePeer{id: peer2ID, serviceFlag: consensus.SFFullNode})
325 ps.AddPeer(&basePeer{id: peer3ID, serviceFlag: consensus.SFFastSync})
326 ps.AddPeer(&basePeer{id: peer4ID, serviceFlag: consensus.SFFullNode, isLan: true})
327 ps.SetStatus(peer1ID, 1000, &block1000Hash)
328 ps.SetStatus(peer2ID, 2000, &block2000Hash)
329 ps.SetStatus(peer3ID, 3000, &block3000Hash)
330 ps.SetStatus(peer4ID, 2000, &block2000Hash)
331 targetPeer := peer4ID
333 peer := ps.BestPeer(consensus.SFFullNode)
335 if peer.ID() != targetPeer {
336 t.Fatalf("test set status err. Name of target peer %s got %s", peer4ID, peer.ID())
340 func TestIrreversibleStatus(t *testing.T) {
341 ps := NewPeerSet(&basePeerSet{})
342 ps.AddPeer(&basePeer{id: peer1ID, serviceFlag: consensus.SFFullNode})
343 ps.AddPeer(&basePeer{id: peer2ID, serviceFlag: consensus.SFFullNode})
344 ps.AddPeer(&basePeer{id: peer3ID, serviceFlag: consensus.SFFastSync})
345 ps.AddPeer(&basePeer{id: peer4ID, serviceFlag: consensus.SFFastSync, isLan: true})
346 ps.SetIrreversibleStatus(peer1ID, 1000, &block1000Hash)
347 ps.SetIrreversibleStatus(peer2ID, 2000, &block2000Hash)
348 ps.SetIrreversibleStatus(peer3ID, 3000, &block3000Hash)
349 ps.SetIrreversibleStatus(peer4ID, 3000, &block3000Hash)
350 targetPeer := peer4ID
351 peer := ps.BestIrreversiblePeer(consensus.SFFastSync)
353 if peer.ID() != targetPeer {
354 t.Fatalf("test set status err. Name of target peer %s got %s", peer4ID, peer.ID())
358 func TestGetPeersByHeight(t *testing.T) {
359 ps := NewPeerSet(&basePeerSet{})
360 ps.AddPeer(&basePeer{id: peer1ID, serviceFlag: consensus.SFFullNode})
361 ps.AddPeer(&basePeer{id: peer2ID, serviceFlag: consensus.SFFullNode})
362 ps.AddPeer(&basePeer{id: peer3ID, serviceFlag: consensus.SFFastSync})
363 ps.AddPeer(&basePeer{id: peer4ID, serviceFlag: consensus.SFFullNode, isLan: true})
364 ps.SetStatus(peer1ID, 1000, &block1000Hash)
365 ps.SetStatus(peer2ID, 2000, &block2000Hash)
366 ps.SetStatus(peer3ID, 3000, &block3000Hash)
367 ps.SetStatus(peer4ID, 2000, &block2000Hash)
368 peers := ps.GetPeersByHeight(2000)
369 targetPeers := []string{peer2ID, peer3ID, peer4ID}
370 if len(peers) != len(targetPeers) {
371 t.Fatalf("test get peers by height err. Number of target peers %d got %d", 3, len(peers))
374 for _, targetPeer := range targetPeers {
376 for _, gotPeer := range peers {
377 if gotPeer.ID() == targetPeer {
383 t.Errorf("test get peers by height err. can't found target peer %s ", targetPeer)
388 func TestRemovePeer(t *testing.T) {
389 ps := NewPeerSet(&basePeerSet{})
390 ps.AddPeer(&basePeer{id: peer1ID})
391 ps.AddPeer(&basePeer{id: peer2ID})
393 ps.RemovePeer(peer1ID)
394 if peer := ps.GetPeer(peer1ID); peer != nil {
395 t.Fatalf("remove peer %s err", peer1ID)
398 if peer := ps.GetPeer(peer2ID); peer == nil {
399 t.Fatalf("Error remove peer %s err", peer2ID)
403 func TestProcessIllegal(t *testing.T) {
404 ps := NewPeerSet(&basePeerSet{})
405 ps.AddPeer(&basePeer{id: peer1ID})
406 ps.AddPeer(&basePeer{id: peer2ID})
408 ps.ProcessIllegal(peer1ID, security.LevelMsgIllegal, "test")
409 if peer := ps.GetPeer(peer1ID); peer != nil {
410 t.Fatalf("remove peer %s err", peer1ID)
413 ps.ProcessIllegal(peer2ID, security.LevelMsgIllegal, "test")
414 if peer := ps.GetPeer(peer2ID); peer == nil {
415 t.Fatalf("Error remove peer %s err", peer2ID)