github.com/Blockdaemon/celo-blockchain@v0.0.0-20200129231733-e667f6b08419/consensus/istanbul/backend/val_enodes_share_test.go (about)

     1  package backend
     2  
     3  import (
     4  	"net"
     5  	"testing"
     6  
     7  	"github.com/ethereum/go-ethereum/common"
     8  	vet "github.com/ethereum/go-ethereum/consensus/istanbul/backend/internal/enodes"
     9  	"github.com/ethereum/go-ethereum/p2p/enode"
    10  )
    11  
    12  func TestHandleValEnodeShareMsg(t *testing.T) {
    13  	_, b := newBlockChain(4, true)
    14  	for b == nil || b.Address() == getAddress() {
    15  		_, b = newBlockChain(4, true)
    16  	}
    17  
    18  	senderAddress := b.Address()
    19  	privateKey, _ := generatePrivateKey()
    20  
    21  	// Tests that a validator enode share message without any validator info
    22  	// in the payload will not result in errors
    23  	msg, err := b.generateValEnodesShareMsg()
    24  	if err != nil {
    25  		t.Errorf("error %v", err)
    26  	}
    27  
    28  	msg.Sign(b.Sign)
    29  	payload, err := msg.Payload()
    30  
    31  	b.Authorize(getAddress(), signerFn, signerBLSHashFn, signerBLSMessageFn)
    32  
    33  	// Set the backend's proxied validator address to itself
    34  	b.config.ProxiedValidatorAddress = senderAddress
    35  
    36  	if err = b.handleValEnodesShareMsg(payload); err != nil {
    37  		t.Errorf("error %v", err)
    38  	}
    39  
    40  	if entries, err := b.valEnodeTable.GetAllValEnodes(); err != nil {
    41  		t.Errorf("Error in calling GetAllValEndoes: %v", err)
    42  	} else {
    43  		if len(entries) > 0 {
    44  			t.Errorf("The valEnodeTable should be empty")
    45  		}
    46  	}
    47  
    48  	testAddress := getAddress()
    49  	testNode := enode.NewV4(&privateKey.PublicKey, net.ParseIP("0.0.0.0"), 0, 0)
    50  
    51  	// Test that a validator enode share message will result in the enode
    52  	// being inserted into the valEnodeTable
    53  	b.valEnodeTable.Upsert(map[common.Address]*vet.AddressEntry{testAddress: {
    54  		Node:      testNode,
    55  		Timestamp: 0,
    56  	}})
    57  	senderAddress = b.Address()
    58  	newMsg, err := b.generateValEnodesShareMsg()
    59  	if err != nil {
    60  		t.Errorf("error %v", err)
    61  	}
    62  
    63  	newMsg.Sign(b.Sign)
    64  	newPayload, err := newMsg.Payload()
    65  
    66  	// Delete the entry in the valEnodeTable so that we can check if it's been
    67  	// created after handling
    68  	b.valEnodeTable.RemoveEntry(testAddress)
    69  
    70  	b.config.ProxiedValidatorAddress = senderAddress
    71  	if err = b.handleValEnodesShareMsg(newPayload); err != nil {
    72  		t.Errorf("error %v", err)
    73  	}
    74  
    75  	if node, err := b.valEnodeTable.GetNodeFromAddress(testAddress); err != nil || node == nil {
    76  		t.Errorf("Failed to save enode entry. err: %v, node: %s", err, node)
    77  	} else if node.String() != testNode.String() {
    78  		t.Errorf("Expected %v, but got %v instead", testNode.String(), node.String())
    79  	}
    80  }