github.com/letterj/go-ethereum@v1.8.22-0.20190204142846-520024dfd689/les/peer_test.go (about) 1 package les 2 3 import ( 4 "math/big" 5 "testing" 6 7 "github.com/ethereum/go-ethereum/common" 8 "github.com/ethereum/go-ethereum/les/flowcontrol" 9 "github.com/ethereum/go-ethereum/p2p" 10 "github.com/ethereum/go-ethereum/p2p/enode" 11 "github.com/ethereum/go-ethereum/rlp" 12 ) 13 14 const ( 15 test_networkid = 10 16 protocol_version = 2123 17 ) 18 19 var ( 20 hash = common.HexToHash("some string") 21 genesis = common.HexToHash("genesis hash") 22 headNum = uint64(1234) 23 td = big.NewInt(123) 24 ) 25 26 //ulc connects to trusted peer and send announceType=announceTypeSigned 27 func TestPeerHandshakeSetAnnounceTypeToAnnounceTypeSignedForTrustedPeer(t *testing.T) { 28 29 var id enode.ID = newNodeID(t).ID() 30 31 //peer to connect(on ulc side) 32 p := peer{ 33 Peer: p2p.NewPeer(id, "test peer", []p2p.Cap{}), 34 version: protocol_version, 35 isTrusted: true, 36 rw: &rwStub{ 37 WriteHook: func(recvList keyValueList) { 38 //checking that ulc sends to peer allowedRequests=onlyAnnounceRequests and announceType = announceTypeSigned 39 recv := recvList.decode() 40 var reqType uint64 41 42 err := recv.get("announceType", &reqType) 43 if err != nil { 44 t.Fatal(err) 45 } 46 47 if reqType != announceTypeSigned { 48 t.Fatal("Expected announceTypeSigned") 49 } 50 }, 51 ReadHook: func(l keyValueList) keyValueList { 52 l = l.add("serveHeaders", nil) 53 l = l.add("serveChainSince", uint64(0)) 54 l = l.add("serveStateSince", uint64(0)) 55 l = l.add("txRelay", nil) 56 l = l.add("flowControl/BL", uint64(0)) 57 l = l.add("flowControl/MRR", uint64(0)) 58 l = l.add("flowControl/MRC", RequestCostList{}) 59 60 return l 61 }, 62 }, 63 network: test_networkid, 64 } 65 66 err := p.Handshake(td, hash, headNum, genesis, nil) 67 if err != nil { 68 t.Fatalf("Handshake error: %s", err) 69 } 70 71 if p.announceType != announceTypeSigned { 72 t.Fatal("Incorrect announceType") 73 } 74 } 75 76 func TestPeerHandshakeAnnounceTypeSignedForTrustedPeersPeerNotInTrusted(t *testing.T) { 77 var id enode.ID = newNodeID(t).ID() 78 p := peer{ 79 Peer: p2p.NewPeer(id, "test peer", []p2p.Cap{}), 80 version: protocol_version, 81 rw: &rwStub{ 82 WriteHook: func(recvList keyValueList) { 83 //checking that ulc sends to peer allowedRequests=noRequests and announceType != announceTypeSigned 84 recv := recvList.decode() 85 var reqType uint64 86 87 err := recv.get("announceType", &reqType) 88 if err != nil { 89 t.Fatal(err) 90 } 91 92 if reqType == announceTypeSigned { 93 t.Fatal("Expected not announceTypeSigned") 94 } 95 }, 96 ReadHook: func(l keyValueList) keyValueList { 97 l = l.add("serveHeaders", nil) 98 l = l.add("serveChainSince", uint64(0)) 99 l = l.add("serveStateSince", uint64(0)) 100 l = l.add("txRelay", nil) 101 l = l.add("flowControl/BL", uint64(0)) 102 l = l.add("flowControl/MRR", uint64(0)) 103 l = l.add("flowControl/MRC", RequestCostList{}) 104 105 return l 106 }, 107 }, 108 network: test_networkid, 109 } 110 111 err := p.Handshake(td, hash, headNum, genesis, nil) 112 if err != nil { 113 t.Fatal(err) 114 } 115 if p.announceType == announceTypeSigned { 116 t.Fatal("Incorrect announceType") 117 } 118 } 119 120 func TestPeerHandshakeDefaultAllRequests(t *testing.T) { 121 var id enode.ID = newNodeID(t).ID() 122 123 s := generateLesServer() 124 125 p := peer{ 126 Peer: p2p.NewPeer(id, "test peer", []p2p.Cap{}), 127 version: protocol_version, 128 rw: &rwStub{ 129 ReadHook: func(l keyValueList) keyValueList { 130 l = l.add("announceType", uint64(announceTypeSigned)) 131 l = l.add("allowedRequests", uint64(0)) 132 133 return l 134 }, 135 }, 136 network: test_networkid, 137 } 138 139 err := p.Handshake(td, hash, headNum, genesis, s) 140 if err != nil { 141 t.Fatal(err) 142 } 143 144 if p.isOnlyAnnounce { 145 t.Fatal("Incorrect announceType") 146 } 147 } 148 149 func TestPeerHandshakeServerSendOnlyAnnounceRequestsHeaders(t *testing.T) { 150 var id enode.ID = newNodeID(t).ID() 151 152 s := generateLesServer() 153 s.onlyAnnounce = true 154 155 p := peer{ 156 Peer: p2p.NewPeer(id, "test peer", []p2p.Cap{}), 157 version: protocol_version, 158 rw: &rwStub{ 159 ReadHook: func(l keyValueList) keyValueList { 160 l = l.add("announceType", uint64(announceTypeSigned)) 161 162 return l 163 }, 164 WriteHook: func(l keyValueList) { 165 for _, v := range l { 166 if v.Key == "serveHeaders" || 167 v.Key == "serveChainSince" || 168 v.Key == "serveStateSince" || 169 v.Key == "txRelay" { 170 t.Fatalf("%v exists", v.Key) 171 } 172 } 173 }, 174 }, 175 network: test_networkid, 176 } 177 178 err := p.Handshake(td, hash, headNum, genesis, s) 179 if err != nil { 180 t.Fatal(err) 181 } 182 } 183 func TestPeerHandshakeClientReceiveOnlyAnnounceRequestsHeaders(t *testing.T) { 184 var id enode.ID = newNodeID(t).ID() 185 186 p := peer{ 187 Peer: p2p.NewPeer(id, "test peer", []p2p.Cap{}), 188 version: protocol_version, 189 rw: &rwStub{ 190 ReadHook: func(l keyValueList) keyValueList { 191 l = l.add("flowControl/BL", uint64(0)) 192 l = l.add("flowControl/MRR", uint64(0)) 193 l = l.add("flowControl/MRC", RequestCostList{}) 194 195 l = l.add("announceType", uint64(announceTypeSigned)) 196 197 return l 198 }, 199 }, 200 network: test_networkid, 201 isTrusted: true, 202 } 203 204 err := p.Handshake(td, hash, headNum, genesis, nil) 205 if err != nil { 206 t.Fatal(err) 207 } 208 209 if !p.isOnlyAnnounce { 210 t.Fatal("isOnlyAnnounce must be true") 211 } 212 } 213 214 func TestPeerHandshakeClientReturnErrorOnUselessPeer(t *testing.T) { 215 var id enode.ID = newNodeID(t).ID() 216 217 p := peer{ 218 Peer: p2p.NewPeer(id, "test peer", []p2p.Cap{}), 219 version: protocol_version, 220 rw: &rwStub{ 221 ReadHook: func(l keyValueList) keyValueList { 222 l = l.add("flowControl/BL", uint64(0)) 223 l = l.add("flowControl/MRR", uint64(0)) 224 l = l.add("flowControl/MRC", RequestCostList{}) 225 226 l = l.add("announceType", uint64(announceTypeSigned)) 227 228 return l 229 }, 230 }, 231 network: test_networkid, 232 } 233 234 err := p.Handshake(td, hash, headNum, genesis, nil) 235 if err == nil { 236 t.FailNow() 237 } 238 } 239 240 func generateLesServer() *LesServer { 241 s := &LesServer{ 242 defParams: &flowcontrol.ServerParams{ 243 BufLimit: uint64(300000000), 244 MinRecharge: uint64(50000), 245 }, 246 fcManager: flowcontrol.NewClientManager(1, 2, 3), 247 fcCostStats: &requestCostStats{ 248 stats: make(map[uint64]*linReg, len(reqList)), 249 }, 250 } 251 for _, code := range reqList { 252 s.fcCostStats.stats[code] = &linReg{cnt: 100} 253 } 254 return s 255 } 256 257 type rwStub struct { 258 ReadHook func(l keyValueList) keyValueList 259 WriteHook func(l keyValueList) 260 } 261 262 func (s *rwStub) ReadMsg() (p2p.Msg, error) { 263 payload := keyValueList{} 264 payload = payload.add("protocolVersion", uint64(protocol_version)) 265 payload = payload.add("networkId", uint64(test_networkid)) 266 payload = payload.add("headTd", td) 267 payload = payload.add("headHash", hash) 268 payload = payload.add("headNum", headNum) 269 payload = payload.add("genesisHash", genesis) 270 271 if s.ReadHook != nil { 272 payload = s.ReadHook(payload) 273 } 274 275 size, p, err := rlp.EncodeToReader(payload) 276 if err != nil { 277 return p2p.Msg{}, err 278 } 279 280 return p2p.Msg{ 281 Size: uint32(size), 282 Payload: p, 283 }, nil 284 } 285 286 func (s *rwStub) WriteMsg(m p2p.Msg) error { 287 recvList := keyValueList{} 288 if err := m.Decode(&recvList); err != nil { 289 return err 290 } 291 292 if s.WriteHook != nil { 293 s.WriteHook(recvList) 294 } 295 296 return nil 297 }