gitlab.com/lightnet1/evrynet-node@v1.1.0/evr/handler_for_tendermint_test.go (about) 1 package evr 2 3 import ( 4 "encoding/hex" 5 "fmt" 6 "math/big" 7 "testing" 8 "time" 9 10 "github.com/stretchr/testify/assert" 11 12 "gitlab.com/lightnet1/evrynet-node/common" 13 "gitlab.com/lightnet1/evrynet-node/consensus/tendermint" 14 tendermintBackend "gitlab.com/lightnet1/evrynet-node/consensus/tendermint/backend" 15 "gitlab.com/lightnet1/evrynet-node/consensus/tendermint/validator" 16 "gitlab.com/lightnet1/evrynet-node/core/types" 17 "gitlab.com/lightnet1/evrynet-node/crypto" 18 "gitlab.com/lightnet1/evrynet-node/p2p" 19 "gitlab.com/lightnet1/evrynet-node/p2p/enode" 20 ) 21 22 //TestTendermintBroadcast setup a test to broadcast a message from a node 23 //Broadcast included Gossip hence Gossip is not required to test separately 24 //Expectation: the MessageEvent is shown for consensus/tendermint/core.handleEvents (internal events) 25 //And the Message's Hash is shown for consensus/tendermint/backend.HandleMsg (external message from peers) 26 func TestTendermintBroadcast(t *testing.T) { 27 t.Skip() 28 //TODO: fix and move this test also 29 var ( 30 nodePk1 = mustGeneratePrivateKey(t) 31 nodePk2 = mustGeneratePrivateKey(t) 32 tbe1 = tendermintBackend.New(tendermint.DefaultConfig, nodePk1) 33 addrs = []common.Address{ 34 crypto.PubkeyToAddress(nodePk1.PublicKey), 35 crypto.PubkeyToAddress(nodePk2.PublicKey), 36 } 37 validatorSet = validator.NewSet(addrs, tendermint.RoundRobin, 0) 38 totalPeers = 2 39 n1 = enode.MustParseV4("enode://" + hex.EncodeToString(crypto.FromECDSAPub(&nodePk1.PublicKey)[1:]) + "@0.0.0.0:30303") 40 n2 = enode.MustParseV4("enode://" + hex.EncodeToString(crypto.FromECDSAPub(&nodePk2.PublicKey)[1:]) + "@0.0.0.0:30304") 41 //chain = tests_utils.MockBlockChain{} 42 ) 43 assert.NoError(t, tbe1.Start(nil, func() *types.Block { 44 return types.NewBlock(&types.Header{ 45 GasLimit: 1000000000, 46 Number: big.NewInt(1), 47 }, nil, nil, nil) 48 }, nil)) 49 pm1, err := NewTestProtocolManagerWithConsensus(tbe1) 50 time.Sleep(2 * time.Second) 51 assert.NoError(t, err) 52 defer pm1.Stop() 53 54 //Create 2 Pipe for read and write. These are full duplex 55 io1, io2 := p2p.MsgPipe() 56 57 //p1 will write to io2, p2 will receive from io1 and vice versal. 58 p1 := pm1.NewPeer(63, p2p.NewPeerFromNode(n1, fmt.Sprintf("Peer %d", 0), nil), io2) 59 p2 := pm1.NewPeer(63, p2p.NewPeerFromNode(n2, fmt.Sprintf("Peer %d", 1), nil), io1) 60 assert.NoError(t, RegisterNewPeer(pm1, p1)) 61 assert.NoError(t, RegisterNewPeer(pm1, p2)) 62 63 // assert it back to tendermint Backend to call Gossip. 64 bc, ok := tbe1.(tendermint.Backend) 65 assert.Equal(t, true, ok) 66 67 payload := []byte("vote message") 68 assert.NoError(t, bc.Broadcast(validatorSet, big.NewInt(0), 0, 0, payload)) 69 time.Sleep(2 * time.Second) 70 71 //Making sure that the handlingMsg is done by calling pm.HandleMsg 72 var ( 73 errCh = make(chan error, totalPeers) 74 doneCh = make(chan struct{}, totalPeers) 75 receivedCount int 76 expectedCount = 1 77 ) 78 timeout := time.After(20 * time.Second) 79 for _, p := range []*Peer{p1, p2} { 80 go func(p *Peer) { 81 for { 82 if err := pm1.HandleMsg(p); err != nil { 83 errCh <- err 84 } else { 85 doneCh <- struct{}{} 86 } 87 } 88 }(p) 89 } 90 outer: 91 for { 92 select { 93 case err = <-errCh: 94 fmt.Printf("handling error %v\n", err) 95 break outer 96 case <-doneCh: 97 receivedCount++ 98 if receivedCount >= expectedCount { 99 fmt.Printf("handling done ") 100 break outer 101 } 102 103 case <-timeout: 104 fmt.Printf("timdeout") 105 106 t.Fail() 107 break outer 108 } 109 110 } 111 if err != nil { 112 t.Errorf("error handling msg by Peer: %v", err) 113 } 114 }