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

     1  package enodes
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/ethereum/go-ethereum/common"
     7  	"github.com/ethereum/go-ethereum/p2p/enode"
     8  	"github.com/ethereum/go-ethereum/rlp"
     9  	"github.com/syndtr/goleveldb/leveldb"
    10  )
    11  
    12  var (
    13  	addressA  = common.HexToAddress("0x00Ce0d46d924CC8437c806721496599FC3FFA268")
    14  	addressB  = common.HexToAddress("0xFFFFFF46d924CCFFFFc806721496599FC3FFFFFF")
    15  	enodeURLA = "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@127.0.0.1:52150"
    16  	enodeURLB = "enode://38b219b54ed49cf7d802e8add586fc75b531ed2c31e43b5da71c35982b2e6f5c56fa9cfbe39606fe71fbee2566b94c2874e950b1ec88323103c835246e3d0023@127.0.0.1:37303"
    17  	nodeA, _  = enode.ParseV4(enodeURLA)
    18  	nodeB, _  = enode.ParseV4(enodeURLB)
    19  )
    20  
    21  type mockListener struct{}
    22  
    23  func (ml *mockListener) AddValidatorPeer(node *enode.Node, address common.Address) {}
    24  func (ml *mockListener) RemoveValidatorPeer(node *enode.Node)                      {}
    25  func (ml *mockListener) ReplaceValidatorPeers(nodeNodes []*enode.Node)             {}
    26  func (ml *mockListener) ClearValidatorPeers()                                      {}
    27  
    28  func TestSimpleCase(t *testing.T) {
    29  	vet, err := OpenValidatorEnodeDB("", &mockListener{})
    30  	if err != nil {
    31  		t.Fatal("Failed to open DB")
    32  	}
    33  
    34  	addressEntry := &AddressEntry{Node: nodeA, Timestamp: 1}
    35  
    36  	err = vet.Upsert(map[common.Address]*AddressEntry{addressA: addressEntry})
    37  	if err != nil {
    38  		t.Fatal("Failed to upsert")
    39  	}
    40  
    41  	addr, err := vet.GetAddressFromNodeID(nodeA.ID())
    42  	if err != nil {
    43  		t.Errorf("got %v", err)
    44  	}
    45  	if addr != addressA {
    46  		t.Error("Invalid address saved")
    47  	}
    48  
    49  	node, err := vet.GetNodeFromAddress(addressA)
    50  	if err != nil {
    51  		t.Errorf("got %v", err)
    52  	}
    53  	if node.String() != enodeURLA {
    54  		t.Error("Invalid enode saved")
    55  	}
    56  }
    57  
    58  func TestDeleteEntry(t *testing.T) {
    59  	vet, err := OpenValidatorEnodeDB("", &mockListener{})
    60  	if err != nil {
    61  		t.Fatal("Failed to open DB")
    62  	}
    63  
    64  	addressEntry := &AddressEntry{Node: nodeA, Timestamp: 2}
    65  
    66  	err = vet.Upsert(map[common.Address]*AddressEntry{addressA: addressEntry})
    67  	if err != nil {
    68  		t.Fatal("Failed to upsert")
    69  	}
    70  
    71  	err = vet.RemoveEntry(addressA)
    72  	if err != nil {
    73  		t.Fatal("Failed to delete")
    74  	}
    75  
    76  	if _, err := vet.GetNodeFromAddress(addressA); err != nil {
    77  		if err != leveldb.ErrNotFound {
    78  			t.Fatalf("Can't get, different error: %v", err)
    79  		}
    80  	} else {
    81  		t.Fatalf("Delete didn't work")
    82  	}
    83  
    84  }
    85  
    86  func TestPruneEntries(t *testing.T) {
    87  	vet, err := OpenValidatorEnodeDB("", &mockListener{})
    88  	if err != nil {
    89  		t.Fatal("Failed to open DB")
    90  	}
    91  
    92  	batch := make(map[common.Address]*AddressEntry)
    93  
    94  	batch[addressA] = &AddressEntry{Node: nodeA, Timestamp: 2}
    95  	batch[addressB] = &AddressEntry{Node: nodeB, Timestamp: 2}
    96  
    97  	vet.Upsert(batch)
    98  
    99  	addressesToKeep := make(map[common.Address]bool)
   100  	addressesToKeep[addressB] = true
   101  
   102  	vet.PruneEntries(addressesToKeep)
   103  
   104  	_, err = vet.GetNodeFromAddress(addressB)
   105  	if err != nil {
   106  		t.Errorf("It should have found %s after prune", addressB.Hex())
   107  	}
   108  	_, err = vet.GetNodeFromAddress(addressA)
   109  	if err == nil {
   110  		t.Errorf("It should have NOT found %s after prune", addressA.Hex())
   111  	}
   112  
   113  }
   114  
   115  func TestRLPEntries(t *testing.T) {
   116  	original := AddressEntry{Node: nodeA, Timestamp: 1}
   117  
   118  	rawEntry, err := rlp.EncodeToBytes(&original)
   119  	if err != nil {
   120  		t.Errorf("Error %v", err)
   121  	}
   122  
   123  	var result AddressEntry
   124  	if err = rlp.DecodeBytes(rawEntry, &result); err != nil {
   125  		t.Errorf("Error %v", err)
   126  	}
   127  
   128  	if result.Node.String() != original.Node.String() {
   129  		t.Errorf("node doesn't match: got: %s expected: %s", result.Node.String(), original.Node.String())
   130  	}
   131  	if result.Timestamp != original.Timestamp {
   132  		t.Errorf("timestamp doesn't match: got: %v expected: %v", result.Timestamp, original.Timestamp)
   133  	}
   134  }
   135  
   136  func TestTableToString(t *testing.T) {
   137  	vet, err := OpenValidatorEnodeDB("", &mockListener{})
   138  	if err != nil {
   139  		t.Fatal("Failed to open DB")
   140  	}
   141  
   142  	batch := make(map[common.Address]*AddressEntry)
   143  
   144  	batch[addressA] = &AddressEntry{Node: nodeA, Timestamp: 2}
   145  	batch[addressB] = &AddressEntry{Node: nodeB, Timestamp: 2}
   146  
   147  	vet.Upsert(batch)
   148  
   149  	expected := "ValEnodeTable: [0x00Ce0d46d924CC8437c806721496599FC3FFA268 => {enodeURL: enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@127.0.0.1:52150, timestamp: 2}] [0xfFFFff46D924CCfffFc806721496599fC3FFffff => {enodeURL: enode://38b219b54ed49cf7d802e8add586fc75b531ed2c31e43b5da71c35982b2e6f5c56fa9cfbe39606fe71fbee2566b94c2874e950b1ec88323103c835246e3d0023@127.0.0.1:37303, timestamp: 2}]"
   150  
   151  	if vet.String() != expected {
   152  		t.Errorf("String() error: got: %s", vet.String())
   153  	}
   154  }