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 }