8 "github.com/bytom/bytom/consensus"
9 "github.com/bytom/bytom/p2p/security"
10 "github.com/bytom/bytom/protocol/bc"
11 "github.com/bytom/bytom/protocol/bc/types"
12 "github.com/davecgh/go-spew/spew"
13 "github.com/tendermint/tmlibs/flowrate"
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) Moniker() string {
45 func (bp *basePeer) RemoteAddrHost() string {
59 func (bp *basePeer) ServiceFlag() consensus.ServiceFlag {
63 func (bp *basePeer) TrafficStatus() (*flowrate.Status, *flowrate.Status) {
67 func (bp *basePeer) TrySend(byte, interface{}) bool {
71 func (bp *basePeer) IsLAN() bool {
75 func TestSetPeerStatus(t *testing.T) {
76 peer := newPeer(&basePeer{})
78 hash := bc.NewHash([32]byte{0x1, 0x2})
79 peer.SetBestStatus(height, &hash)
80 if peer.Height() != height {
81 t.Fatalf("test set best status err. got %d want %d", peer.Height(), height)
85 func TestSetIrreversibleStatus(t *testing.T) {
86 peer := newPeer(&basePeer{})
88 hash := bc.NewHash([32]byte{0x1, 0x2})
89 peer.SetIrreversibleStatus(height, &hash)
90 if peer.IrreversibleHeight() != height {
91 t.Fatalf("test set Irreversible status err. got %d want %d", peer.Height(), height)
95 func TestAddFilterAddresses(t *testing.T) {
96 peer := newPeer(&basePeer{})
97 tx := types.NewTx(types.TxData{
98 Inputs: []*types.TxInput{
99 types.NewSpendInput(nil, bc.Hash{}, bc.NewAssetID([32]byte{1}), 5, 1, []byte("spendProgram"), [][]byte{}),
101 Outputs: []*types.TxOutput{
102 types.NewOriginalTxOutput(bc.NewAssetID([32]byte{3}), 8, []byte("outProgram"), [][]byte{}),
106 peer.AddFilterAddresses([][]byte{[]byte("spendProgram")})
107 if !peer.isRelatedTx(tx) {
108 t.Fatal("test filter addresses error.")
111 peer.AddFilterAddresses([][]byte{[]byte("testProgram")})
112 if peer.isRelatedTx(tx) {
113 t.Fatal("test filter addresses error.")
117 func TestFilterClear(t *testing.T) {
118 peer := newPeer(&basePeer{})
119 tx := types.NewTx(types.TxData{
120 Inputs: []*types.TxInput{
121 types.NewSpendInput(nil, bc.Hash{}, bc.NewAssetID([32]byte{1}), 5, 1, []byte("spendProgram"), [][]byte{}),
123 Outputs: []*types.TxOutput{
124 types.NewOriginalTxOutput(bc.NewAssetID([32]byte{3}), 8, []byte("outProgram"), [][]byte{}),
128 peer.AddFilterAddresses([][]byte{[]byte("spendProgram")})
129 if !peer.isRelatedTx(tx) {
130 t.Fatal("test filter addresses error.")
134 if peer.isRelatedTx(tx) {
135 t.Fatal("test filter addresses error.")
139 func TestGetRelatedTxAndStatus(t *testing.T) {
140 peer := newPeer(&basePeer{})
142 types.NewTx(types.TxData{
143 Inputs: []*types.TxInput{
144 types.NewSpendInput(nil, bc.Hash{}, bc.NewAssetID([32]byte{1}), 5, 1, []byte("spendProgram1"), [][]byte{}),
146 Outputs: []*types.TxOutput{
147 types.NewOriginalTxOutput(bc.NewAssetID([32]byte{3}), 8, []byte("outProgram1"), [][]byte{}),
150 types.NewTx(types.TxData{
151 Inputs: []*types.TxInput{
152 types.NewSpendInput(nil, bc.Hash{}, bc.NewAssetID([32]byte{1}), 5, 1, []byte("spendProgram2"), [][]byte{}),
154 Outputs: []*types.TxOutput{
155 types.NewOriginalTxOutput(bc.NewAssetID([32]byte{3}), 8, []byte("outProgram2"), [][]byte{}),
158 types.NewTx(types.TxData{
159 Inputs: []*types.TxInput{
160 types.NewSpendInput(nil, bc.Hash{}, bc.NewAssetID([32]byte{1}), 5, 1, []byte("spendProgram3"), [][]byte{}),
162 Outputs: []*types.TxOutput{
163 types.NewOriginalTxOutput(bc.NewAssetID([32]byte{3}), 8, []byte("outProgram3"), [][]byte{}),
168 peer.AddFilterAddresses([][]byte{[]byte("spendProgram1"), []byte("outProgram3")})
169 gotTxs := peer.getRelatedTxs(txs)
170 if len(gotTxs) != 2 {
171 t.Error("TestGetRelatedTxAndStatus txs size error")
174 if !reflect.DeepEqual(*gotTxs[0].Tx, *txs[0].Tx) {
175 t.Errorf("txs msg test err: got %s\nwant %s", spew.Sdump(gotTxs[0].Tx), spew.Sdump(txs[0].Tx))
178 if !reflect.DeepEqual(*gotTxs[1].Tx, *txs[2].Tx) {
179 t.Errorf("txs msg test err: got %s\nwant %s", spew.Sdump(gotTxs[1].Tx), spew.Sdump(txs[2].Tx))
183 type basePeerSet struct {
186 func (bp *basePeerSet) StopPeerGracefully(string) {
190 func (bp *basePeerSet) IsBanned(ip string, level byte, reason string) bool {
204 func TestMarkBlock(t *testing.T) {
205 ps := NewPeerSet(&basePeerSet{})
206 ps.AddPeer(&basePeer{id: peer1ID})
207 ps.AddPeer(&basePeer{id: peer2ID})
208 ps.AddPeer(&basePeer{id: peer3ID})
210 blockHash := bc.NewHash([32]byte{0x01, 0x02})
211 ps.MarkBlock(peer1ID, &blockHash)
212 targetPeers := []string{peer2ID, peer3ID}
214 peers := ps.PeersWithoutBlock(blockHash)
215 if len(peers) != len(targetPeers) {
216 t.Fatalf("test mark block err. Number of target peers %d got %d", 1, len(peers))
219 for _, targetPeer := range targetPeers {
221 for _, gotPeer := range peers {
222 if gotPeer == targetPeer {
228 t.Errorf("test mark block err. can't found target peer %s ", targetPeer)
233 func TestMarkStatus(t *testing.T) {
234 ps := NewPeerSet(&basePeerSet{})
235 ps.AddPeer(&basePeer{id: peer1ID})
236 ps.AddPeer(&basePeer{id: peer2ID})
237 ps.AddPeer(&basePeer{id: peer3ID})
239 height := uint64(1024)
240 ps.MarkStatus(peer1ID, height)
241 targetPeers := []string{peer2ID, peer3ID}
243 peers := ps.peersWithoutNewStatus(height)
244 if len(peers) != len(targetPeers) {
245 t.Fatalf("test mark status err. Number of target peers %d got %d", 1, len(peers))
248 for _, targetPeer := range targetPeers {
250 for _, gotPeer := range peers {
251 if gotPeer.ID() == targetPeer {
257 t.Errorf("test mark status err. can't found target peer %s ", targetPeer)
262 func TestMarkBlockSignature(t *testing.T) {
263 ps := NewPeerSet(&basePeerSet{})
264 ps.AddPeer(&basePeer{id: peer1ID})
265 ps.AddPeer(&basePeer{id: peer2ID})
266 ps.AddPeer(&basePeer{id: peer3ID})
268 signature := []byte{0x01, 0x02}
269 ps.MarkBlockSignature(peer1ID, signature)
270 targetPeers := []string{peer2ID, peer3ID}
272 peers := ps.PeersWithoutSignature(signature)
273 if len(peers) != len(targetPeers) {
274 t.Fatalf("test mark block signature err. Number of target peers %d got %d", 1, len(peers))
277 for _, targetPeer := range targetPeers {
279 for _, gotPeer := range peers {
280 if gotPeer == targetPeer {
286 t.Errorf("test mark block signature err. can't found target peer %s ", targetPeer)
291 func TestMarkTx(t *testing.T) {
292 ps := NewPeerSet(&basePeerSet{})
293 ps.AddPeer(&basePeer{id: peer1ID})
294 ps.AddPeer(&basePeer{id: peer2ID})
295 ps.AddPeer(&basePeer{id: peer3ID})
297 txHash := bc.NewHash([32]byte{0x01, 0x02})
298 ps.MarkTx(peer1ID, txHash)
299 peers := ps.peersWithoutTx(&txHash)
300 targetPeers := []string{peer2ID, peer3ID}
301 if len(peers) != len(targetPeers) {
302 t.Fatalf("test mark tx err. Number of target peers %d got %d", 1, len(peers))
305 for _, targetPeer := range targetPeers {
307 for _, gotPeer := range peers {
308 if gotPeer.ID() == targetPeer {
314 t.Errorf("test mark tx err. can't found target peer %s ", targetPeer)
319 func TestSetStatus(t *testing.T) {
320 ps := NewPeerSet(&basePeerSet{})
321 ps.AddPeer(&basePeer{id: peer1ID, serviceFlag: consensus.SFFullNode})
322 ps.AddPeer(&basePeer{id: peer2ID, serviceFlag: consensus.SFFullNode})
323 ps.AddPeer(&basePeer{id: peer3ID, serviceFlag: consensus.SFFastSync})
324 ps.AddPeer(&basePeer{id: peer4ID, serviceFlag: consensus.SFFullNode, isLan: true})
325 ps.SetStatus(peer1ID, 1000, &block1000Hash)
326 ps.SetStatus(peer2ID, 2000, &block2000Hash)
327 ps.SetStatus(peer3ID, 3000, &block3000Hash)
328 ps.SetStatus(peer4ID, 2000, &block2000Hash)
329 targetPeer := peer4ID
331 peer := ps.BestPeer(consensus.SFFullNode)
333 if peer.ID() != targetPeer {
334 t.Fatalf("test set status err. Name of target peer %s got %s", peer4ID, peer.ID())
338 func TestIrreversibleStatus(t *testing.T) {
339 ps := NewPeerSet(&basePeerSet{})
340 ps.AddPeer(&basePeer{id: peer1ID, serviceFlag: consensus.SFFullNode})
341 ps.AddPeer(&basePeer{id: peer2ID, serviceFlag: consensus.SFFullNode})
342 ps.AddPeer(&basePeer{id: peer3ID, serviceFlag: consensus.SFFastSync})
343 ps.AddPeer(&basePeer{id: peer4ID, serviceFlag: consensus.SFFastSync, isLan: true})
344 ps.SetIrreversibleStatus(peer1ID, 1000, &block1000Hash)
345 ps.SetIrreversibleStatus(peer2ID, 2000, &block2000Hash)
346 ps.SetIrreversibleStatus(peer3ID, 3000, &block3000Hash)
347 ps.SetIrreversibleStatus(peer4ID, 3000, &block3000Hash)
348 targetPeer := peer4ID
349 peer := ps.BestIrreversiblePeer(consensus.SFFastSync)
351 if peer.ID() != targetPeer {
352 t.Fatalf("test set status err. Name of target peer %s got %s", peer4ID, peer.ID())
356 func TestGetPeersByHeight(t *testing.T) {
357 ps := NewPeerSet(&basePeerSet{})
358 ps.AddPeer(&basePeer{id: peer1ID, serviceFlag: consensus.SFFullNode})
359 ps.AddPeer(&basePeer{id: peer2ID, serviceFlag: consensus.SFFullNode})
360 ps.AddPeer(&basePeer{id: peer3ID, serviceFlag: consensus.SFFastSync})
361 ps.AddPeer(&basePeer{id: peer4ID, serviceFlag: consensus.SFFullNode, isLan: true})
362 ps.SetStatus(peer1ID, 1000, &block1000Hash)
363 ps.SetStatus(peer2ID, 2000, &block2000Hash)
364 ps.SetStatus(peer3ID, 3000, &block3000Hash)
365 ps.SetStatus(peer4ID, 2000, &block2000Hash)
366 peers := ps.GetPeersByHeight(2000)
367 targetPeers := []string{peer2ID, peer3ID, peer4ID}
368 if len(peers) != len(targetPeers) {
369 t.Fatalf("test get peers by height err. Number of target peers %d got %d", 3, len(peers))
372 for _, targetPeer := range targetPeers {
374 for _, gotPeer := range peers {
375 if gotPeer.ID() == targetPeer {
381 t.Errorf("test get peers by height err. can't found target peer %s ", targetPeer)
386 func TestRemovePeer(t *testing.T) {
387 ps := NewPeerSet(&basePeerSet{})
388 ps.AddPeer(&basePeer{id: peer1ID})
389 ps.AddPeer(&basePeer{id: peer2ID})
391 ps.RemovePeer(peer1ID)
392 if peer := ps.GetPeer(peer1ID); peer != nil {
393 t.Fatalf("remove peer %s err", peer1ID)
396 if peer := ps.GetPeer(peer2ID); peer == nil {
397 t.Fatalf("Error remove peer %s err", peer2ID)
401 func TestProcessIllegal(t *testing.T) {
402 ps := NewPeerSet(&basePeerSet{})
403 ps.AddPeer(&basePeer{id: peer1ID})
404 ps.AddPeer(&basePeer{id: peer2ID})
406 ps.ProcessIllegal(peer1ID, security.LevelMsgIllegal, "test")
407 if peer := ps.GetPeer(peer1ID); peer != nil {
408 t.Fatalf("remove peer %s err", peer1ID)
411 ps.ProcessIllegal(peer2ID, security.LevelMsgIllegal, "test")
412 if peer := ps.GetPeer(peer2ID); peer == nil {
413 t.Fatalf("Error remove peer %s err", peer2ID)