aboutsummaryrefslogblamecommitdiffstats
path: root/blockpool/peers_test.go
blob: 639abbc260b5dab894fd55baf8aeba572a504dba (plain) (tree)
1
2
3
4
5
6
7
8
9
10


                 
              

                  
              
 

                                                    







                                                     



                                
                                                 
                                                                   


                                                       






                               

                                                             

                                               

                                                        
         
                               


                              

                                                             

                                               

                                                        
         
                               


                              

                                                         

                                               

                                                                 
         


                                                                   

         

                              

                              

                                                             

                                               

                                                        
         


                                                                   
         
 

                              

                              

                                                                  

                                               

                                                                  

                                                         


                                                        





                                                         
                      


                                               

                                                                            
         




                                                         
                      


                                               

                                                                            
         



                                                         

                                             


                                      

                              

                              

                                                              


                                               

                                                              
         
                               
 

                                                                            



                                                                 
                      


                                        

                                                                                    
         
 

                              

                                                             




                                                           
                      


                        
 
 
                                                 







                                                            
 





                                                                  
                      



                                          
                              



                                                              
                      
         
                                     





                                                                      
package blockpool

import (
    "flag"
    "math/big"
    "testing"
    "time"

    "github.com/ethereum/go-ethereum/core"
    "github.com/ethereum/go-ethereum/core/types"
    "github.com/ethereum/go-ethereum/logger"
    "github.com/ethereum/go-ethereum/logger/glog"
)

var (
    _ = flag.Set("alsologtostderr", "true")
    // _ = flag.Set("log_dir", ".")
    _ = flag.Set("v", "5")
)

// the actual tests
func TestAddPeer(t *testing.T) {
    glog.V(logger.Error).Infoln("logging...")
    hashPool, blockPool, blockPoolTester := newTestBlockPool(t)
    peer0 := blockPoolTester.newPeer("peer0", 2, 2)
    peer1 := blockPoolTester.newPeer("peer1", 4, 4)
    peer2 := blockPoolTester.newPeer("peer2", 6, 6)
    var bestpeer *peer

    blockPool.Start()

    // pool
    best := peer0.AddPeer()
    if !best {
        t.Errorf("peer0 (TD=2) not accepted as best")
        return
    }
    if blockPool.peers.best.id != "peer0" {
        t.Errorf("peer0 (TD=2) not set as best")
        return
    }
    peer0.serveBlocks(1, 2)

    best = peer2.AddPeer()
    if !best {
        t.Errorf("peer2 (TD=6) not accepted as best")
        return
    }
    if blockPool.peers.best.id != "peer2" {
        t.Errorf("peer2 (TD=6) not set as best")
        return
    }
    peer2.serveBlocks(5, 6)

    best = peer1.AddPeer()
    if best {
        t.Errorf("peer1 (TD=4) accepted as best")
        return
    }
    if blockPool.peers.best.id != "peer2" {
        t.Errorf("peer2 (TD=6) not set any more as best")
        return
    }
    if blockPool.peers.best.td.Cmp(big.NewInt(int64(6))) != 0 {
        t.Errorf("peer2 TD=6 not set")
        return
    }

    peer2.td = 8
    peer2.currentBlock = 8
    best = peer2.AddPeer()
    if !best {
        t.Errorf("peer2 (TD=8) not accepted as best")
        return
    }
    if blockPool.peers.best.id != "peer2" {
        t.Errorf("peer2 (TD=8) not set as best")
        return
    }
    if blockPool.peers.best.td.Cmp(big.NewInt(int64(8))) != 0 {
        t.Errorf("peer2 TD = 8 not updated")
        return
    }

    peer1.td = 6
    peer1.currentBlock = 6
    best = peer1.AddPeer()
    if best {
        t.Errorf("peer1 (TD=6) should not be set as best")
        return
    }
    if blockPool.peers.best.id == "peer1" {
        t.Errorf("peer1 (TD=6) should not be set as best")
        return
    }
    bestpeer, best = blockPool.peers.getPeer("peer1")
    if bestpeer.td.Cmp(big.NewInt(int64(6))) != 0 {
        t.Errorf("peer1 TD=6 should be updated")
        return
    }

    blockPool.RemovePeer("peer2")
    bestpeer, best = blockPool.peers.getPeer("peer2")
    if bestpeer != nil {
        t.Errorf("peer2 not removed")
        return
    }

    if blockPool.peers.best.id != "peer1" {
        t.Errorf("existing peer1 (TD=6) should be set as best peer")
        return
    }

    blockPool.RemovePeer("peer1")
    bestpeer, best = blockPool.peers.getPeer("peer1")
    if bestpeer != nil {
        t.Errorf("peer1 not removed")
        return
    }

    if blockPool.peers.best.id != "peer0" {
        t.Errorf("existing peer0 (TD=2) should be set as best peer")
        return
    }

    blockPool.RemovePeer("peer0")
    bestpeer, best = blockPool.peers.getPeer("peer0")
    if bestpeer != nil {
        t.Errorf("peer0 not removed")
        return
    }

    // adding back earlier peer ok
    peer0.currentBlock = 5
    peer0.td = 5
    best = peer0.AddPeer()
    if !best {
        t.Errorf("peer0 (TD=5) should be set as best")
        return
    }

    if blockPool.peers.best.id != "peer0" {
        t.Errorf("peer0 (TD=5) should be set as best")
        return
    }
    peer0.serveBlocks(4, 5)

    hash := hashPool.IndexesToHashes([]int{6})[0]
    newblock := &types.Block{Td: big.NewInt(int64(6)), HeaderHash: hash}
    blockPool.chainEvents.Post(core.ChainHeadEvent{newblock})
    time.Sleep(100 * time.Millisecond)
    if blockPool.peers.best != nil {
        t.Errorf("no peer should be ahead of self")
        return
    }
    best = peer1.AddPeer()
    if blockPool.peers.best != nil {
        t.Errorf("after peer1 (TD=6) still no peer should be ahead of self")
        return
    }

    best = peer2.AddPeer()
    if !best {
        t.Errorf("peer2 (TD=8) not accepted as best")
        return
    }

    blockPool.RemovePeer("peer2")
    if blockPool.peers.best != nil {
        t.Errorf("no peer should be ahead of self")
        return
    }

    blockPool.Stop()
}

func TestPeerPromotionByTdOnBlock(t *testing.T) {
    _, blockPool, blockPoolTester := newTestBlockPool(t)
    blockPoolTester.blockChain[0] = nil
    blockPoolTester.initRefBlockChain(4)
    peer0 := blockPoolTester.newPeer("peer0", 2, 2)
    peer1 := blockPoolTester.newPeer("peer1", 1, 1)
    peer2 := blockPoolTester.newPeer("peer2", 4, 4)

    blockPool.Start()

    peer0.AddPeer()
    peer0.serveBlocks(1, 2)
    best := peer1.AddPeer()
    // this tests that peer1 is not promoted over peer0 yet
    if best {
        t.Errorf("peer1 (TD=1) should not be set as best")
        return
    }
    best = peer2.AddPeer()
    peer2.serveBlocks(3, 4)
    peer2.serveBlockHashes(4, 3, 2, 1)
    peer1.sendBlocks(3, 4)

    blockPool.RemovePeer("peer2")
    if blockPool.peers.best.id != "peer1" {
        t.Errorf("peer1 (TD=3) should be set as best")
        return
    }
    peer1.serveBlocks(0, 1, 2, 3)

    blockPool.Wait(waitTimeout)
    blockPool.Stop()
    blockPoolTester.refBlockChain[4] = []int{}
    blockPoolTester.checkBlockChain(blockPoolTester.refBlockChain)
}