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  }