github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/p2p/server_test.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:41</date> 10 //</624450106472534016> 11 12 13 package p2p 14 15 import ( 16 "crypto/ecdsa" 17 "errors" 18 "math/rand" 19 "net" 20 "reflect" 21 "testing" 22 "time" 23 24 "github.com/ethereum/go-ethereum/crypto" 25 "github.com/ethereum/go-ethereum/log" 26 "github.com/ethereum/go-ethereum/p2p/enode" 27 "github.com/ethereum/go-ethereum/p2p/enr" 28 "golang.org/x/crypto/sha3" 29 ) 30 31 //函数() 32 //log.root().sethandler(log.lvlfilterhandler(log.lvltrace,log.streamhandler(os.stderr,log.terminalformat(false))) 33 //} 34 35 type testTransport struct { 36 rpub *ecdsa.PublicKey 37 *rlpx 38 39 closeErr error 40 } 41 42 func newTestTransport(rpub *ecdsa.PublicKey, fd net.Conn) transport { 43 wrapped := newRLPX(fd).(*rlpx) 44 wrapped.rw = newRLPXFrameRW(fd, secrets{ 45 MAC: zero16, 46 AES: zero16, 47 IngressMAC: sha3.NewLegacyKeccak256(), 48 EgressMAC: sha3.NewLegacyKeccak256(), 49 }) 50 return &testTransport{rpub: rpub, rlpx: wrapped} 51 } 52 53 func (c *testTransport) doEncHandshake(prv *ecdsa.PrivateKey, dialDest *ecdsa.PublicKey) (*ecdsa.PublicKey, error) { 54 return c.rpub, nil 55 } 56 57 func (c *testTransport) doProtoHandshake(our *protoHandshake) (*protoHandshake, error) { 58 pubkey := crypto.FromECDSAPub(c.rpub)[1:] 59 return &protoHandshake{ID: pubkey, Name: "test"}, nil 60 } 61 62 func (c *testTransport) close(err error) { 63 c.rlpx.fd.Close() 64 c.closeErr = err 65 } 66 67 func startTestServer(t *testing.T, remoteKey *ecdsa.PublicKey, pf func(*Peer)) *Server { 68 config := Config{ 69 Name: "test", 70 MaxPeers: 10, 71 ListenAddr: "127.0.0.1:0", 72 PrivateKey: newkey(), 73 } 74 server := &Server{ 75 Config: config, 76 newPeerHook: pf, 77 newTransport: func(fd net.Conn) transport { return newTestTransport(remoteKey, fd) }, 78 } 79 if err := server.Start(); err != nil { 80 t.Fatalf("Could not start server: %v", err) 81 } 82 return server 83 } 84 85 func TestServerListen(t *testing.T) { 86 //启动测试服务器 87 connected := make(chan *Peer) 88 remid := &newkey().PublicKey 89 srv := startTestServer(t, remid, func(p *Peer) { 90 if p.ID() != enode.PubkeyToIDV4(remid) { 91 t.Error("peer func called with wrong node id") 92 } 93 connected <- p 94 }) 95 defer close(connected) 96 defer srv.Stop() 97 98 //拨号测试服务器 99 conn, err := net.DialTimeout("tcp", srv.ListenAddr, 5*time.Second) 100 if err != nil { 101 t.Fatalf("could not dial: %v", err) 102 } 103 defer conn.Close() 104 105 select { 106 case peer := <-connected: 107 if peer.LocalAddr().String() != conn.RemoteAddr().String() { 108 t.Errorf("peer started with wrong conn: got %v, want %v", 109 peer.LocalAddr(), conn.RemoteAddr()) 110 } 111 peers := srv.Peers() 112 if !reflect.DeepEqual(peers, []*Peer{peer}) { 113 t.Errorf("Peers mismatch: got %v, want %v", peers, []*Peer{peer}) 114 } 115 case <-time.After(1 * time.Second): 116 t.Error("server did not accept within one second") 117 } 118 } 119 120 func TestServerDial(t *testing.T) { 121 //运行一次性TCP服务器来处理连接。 122 listener, err := net.Listen("tcp", "127.0.0.1:0") 123 if err != nil { 124 t.Fatalf("could not setup listener: %v", err) 125 } 126 defer listener.Close() 127 accepted := make(chan net.Conn) 128 go func() { 129 conn, err := listener.Accept() 130 if err != nil { 131 t.Error("accept error:", err) 132 return 133 } 134 accepted <- conn 135 }() 136 137 //启动服务器 138 connected := make(chan *Peer) 139 remid := &newkey().PublicKey 140 srv := startTestServer(t, remid, func(p *Peer) { connected <- p }) 141 defer close(connected) 142 defer srv.Stop() 143 144 //告诉服务器连接 145 tcpAddr := listener.Addr().(*net.TCPAddr) 146 node := enode.NewV4(remid, tcpAddr.IP, tcpAddr.Port, 0) 147 srv.AddPeer(node) 148 149 select { 150 case conn := <-accepted: 151 defer conn.Close() 152 153 select { 154 case peer := <-connected: 155 if peer.ID() != enode.PubkeyToIDV4(remid) { 156 t.Errorf("peer has wrong id") 157 } 158 if peer.Name() != "test" { 159 t.Errorf("peer has wrong name") 160 } 161 if peer.RemoteAddr().String() != conn.LocalAddr().String() { 162 t.Errorf("peer started with wrong conn: got %v, want %v", 163 peer.RemoteAddr(), conn.LocalAddr()) 164 } 165 peers := srv.Peers() 166 if !reflect.DeepEqual(peers, []*Peer{peer}) { 167 t.Errorf("Peers mismatch: got %v, want %v", peers, []*Peer{peer}) 168 } 169 170 //测试addtrustedpeer/removetrustedpeer并更改可信标志 171 //尤其是在改变旗国的比赛条件下。 172 if peer := srv.Peers()[0]; peer.Info().Network.Trusted { 173 t.Errorf("peer is trusted prematurely: %v", peer) 174 } 175 done := make(chan bool) 176 go func() { 177 srv.AddTrustedPeer(node) 178 if peer := srv.Peers()[0]; !peer.Info().Network.Trusted { 179 t.Errorf("peer is not trusted after AddTrustedPeer: %v", peer) 180 } 181 srv.RemoveTrustedPeer(node) 182 if peer := srv.Peers()[0]; peer.Info().Network.Trusted { 183 t.Errorf("peer is trusted after RemoveTrustedPeer: %v", peer) 184 } 185 done <- true 186 }() 187 //触发潜在的竞争条件 188 peer = srv.Peers()[0] 189 _ = peer.Inbound() 190 _ = peer.Info() 191 <-done 192 case <-time.After(1 * time.Second): 193 t.Error("server did not launch peer within one second") 194 } 195 196 case <-time.After(1 * time.Second): 197 t.Error("server did not connect within one second") 198 } 199 } 200 201 //此测试检查由拨号状态生成的任务是否 202 //实际执行并调用taskdone。 203 func TestServerTaskScheduling(t *testing.T) { 204 var ( 205 done = make(chan *testTask) 206 quit, returned = make(chan struct{}), make(chan struct{}) 207 tc = 0 208 tg = taskgen{ 209 newFunc: func(running int, peers map[enode.ID]*Peer) []task { 210 tc++ 211 return []task{&testTask{index: tc - 1}} 212 }, 213 doneFunc: func(t task) { 214 select { 215 case done <- t.(*testTask): 216 case <-quit: 217 } 218 }, 219 } 220 ) 221 222 //此测试中的服务器没有实际运行 223 //因为我们只对Run的功能感兴趣。 224 db, _ := enode.OpenDB("") 225 srv := &Server{ 226 Config: Config{MaxPeers: 10}, 227 localnode: enode.NewLocalNode(db, newkey()), 228 nodedb: db, 229 quit: make(chan struct{}), 230 ntab: fakeTable{}, 231 running: true, 232 log: log.New(), 233 } 234 srv.loopWG.Add(1) 235 go func() { 236 srv.run(tg) 237 close(returned) 238 }() 239 240 var gotdone []*testTask 241 for i := 0; i < 100; i++ { 242 gotdone = append(gotdone, <-done) 243 } 244 for i, task := range gotdone { 245 if task.index != i { 246 t.Errorf("task %d has wrong index, got %d", i, task.index) 247 break 248 } 249 if !task.called { 250 t.Errorf("task %d was not called", i) 251 break 252 } 253 } 254 255 close(quit) 256 srv.Stop() 257 select { 258 case <-returned: 259 case <-time.After(500 * time.Millisecond): 260 t.Error("Server.run did not return within 500ms") 261 } 262 } 263 264 //此测试检查服务器是否不删除任务, 265 //即使newtasks返回的任务数超过最大值。 266 func TestServerManyTasks(t *testing.T) { 267 alltasks := make([]task, 300) 268 for i := range alltasks { 269 alltasks[i] = &testTask{index: i} 270 } 271 272 var ( 273 db, _ = enode.OpenDB("") 274 srv = &Server{ 275 quit: make(chan struct{}), 276 localnode: enode.NewLocalNode(db, newkey()), 277 nodedb: db, 278 ntab: fakeTable{}, 279 running: true, 280 log: log.New(), 281 } 282 done = make(chan *testTask) 283 start, end = 0, 0 284 ) 285 defer srv.Stop() 286 srv.loopWG.Add(1) 287 go srv.run(taskgen{ 288 newFunc: func(running int, peers map[enode.ID]*Peer) []task { 289 start, end = end, end+maxActiveDialTasks+10 290 if end > len(alltasks) { 291 end = len(alltasks) 292 } 293 return alltasks[start:end] 294 }, 295 doneFunc: func(tt task) { 296 done <- tt.(*testTask) 297 }, 298 }) 299 300 doneset := make(map[int]bool) 301 timeout := time.After(2 * time.Second) 302 for len(doneset) < len(alltasks) { 303 select { 304 case tt := <-done: 305 if doneset[tt.index] { 306 t.Errorf("task %d got done more than once", tt.index) 307 } else { 308 doneset[tt.index] = true 309 } 310 case <-timeout: 311 t.Errorf("%d of %d tasks got done within 2s", len(doneset), len(alltasks)) 312 for i := 0; i < len(alltasks); i++ { 313 if !doneset[i] { 314 t.Logf("task %d not done", i) 315 } 316 } 317 return 318 } 319 } 320 } 321 322 type taskgen struct { 323 newFunc func(running int, peers map[enode.ID]*Peer) []task 324 doneFunc func(task) 325 } 326 327 func (tg taskgen) newTasks(running int, peers map[enode.ID]*Peer, now time.Time) []task { 328 return tg.newFunc(running, peers) 329 } 330 func (tg taskgen) taskDone(t task, now time.Time) { 331 tg.doneFunc(t) 332 } 333 func (tg taskgen) addStatic(*enode.Node) { 334 } 335 func (tg taskgen) removeStatic(*enode.Node) { 336 } 337 338 type testTask struct { 339 index int 340 called bool 341 } 342 343 func (t *testTask) Do(srv *Server) { 344 t.called = true 345 } 346 347 //此测试检查连接是否断开 348 //当服务器处于 349 //按容量计算。仍应接受可信连接。 350 func TestServerAtCap(t *testing.T) { 351 trustedNode := newkey() 352 trustedID := enode.PubkeyToIDV4(&trustedNode.PublicKey) 353 srv := &Server{ 354 Config: Config{ 355 PrivateKey: newkey(), 356 MaxPeers: 10, 357 NoDial: true, 358 TrustedNodes: []*enode.Node{newNode(trustedID, nil)}, 359 }, 360 } 361 if err := srv.Start(); err != nil { 362 t.Fatalf("could not start: %v", err) 363 } 364 defer srv.Stop() 365 366 newconn := func(id enode.ID) *conn { 367 fd, _ := net.Pipe() 368 tx := newTestTransport(&trustedNode.PublicKey, fd) 369 node := enode.SignNull(new(enr.Record), id) 370 return &conn{fd: fd, transport: tx, flags: inboundConn, node: node, cont: make(chan error)} 371 } 372 373 //注入一些连接以填充对等集。 374 for i := 0; i < 10; i++ { 375 c := newconn(randomID()) 376 if err := srv.checkpoint(c, srv.addpeer); err != nil { 377 t.Fatalf("could not add conn %d: %v", i, err) 378 } 379 } 380 //尝试插入不受信任的连接。 381 anotherID := randomID() 382 c := newconn(anotherID) 383 if err := srv.checkpoint(c, srv.posthandshake); err != DiscTooManyPeers { 384 t.Error("wrong error for insert:", err) 385 } 386 //尝试插入可信连接。 387 c = newconn(trustedID) 388 if err := srv.checkpoint(c, srv.posthandshake); err != nil { 389 t.Error("unexpected error for trusted conn @posthandshake:", err) 390 } 391 if !c.is(trustedConn) { 392 t.Error("Server did not set trusted flag") 393 } 394 395 //从受信任集中删除,然后重试 396 srv.RemoveTrustedPeer(newNode(trustedID, nil)) 397 c = newconn(trustedID) 398 if err := srv.checkpoint(c, srv.posthandshake); err != DiscTooManyPeers { 399 t.Error("wrong error for insert:", err) 400 } 401 402 //将另一个ID添加到可信集,然后重试 403 srv.AddTrustedPeer(newNode(anotherID, nil)) 404 c = newconn(anotherID) 405 if err := srv.checkpoint(c, srv.posthandshake); err != nil { 406 t.Error("unexpected error for trusted conn @posthandshake:", err) 407 } 408 if !c.is(trustedConn) { 409 t.Error("Server did not set trusted flag") 410 } 411 } 412 413 func TestServerPeerLimits(t *testing.T) { 414 srvkey := newkey() 415 clientkey := newkey() 416 clientnode := enode.NewV4(&clientkey.PublicKey, nil, 0, 0) 417 418 var tp = &setupTransport{ 419 pubkey: &clientkey.PublicKey, 420 phs: protoHandshake{ 421 ID: crypto.FromECDSAPub(&clientkey.PublicKey)[1:], 422 //由于未匹配的大写字母而强制使用“discuselesspeer” 423 //大写:[]Cap Discard.Cap(), 424 }, 425 } 426 427 srv := &Server{ 428 Config: Config{ 429 PrivateKey: srvkey, 430 MaxPeers: 0, 431 NoDial: true, 432 Protocols: []Protocol{discard}, 433 }, 434 newTransport: func(fd net.Conn) transport { return tp }, 435 log: log.New(), 436 } 437 if err := srv.Start(); err != nil { 438 t.Fatalf("couldn't start server: %v", err) 439 } 440 defer srv.Stop() 441 442 //检查服务器是否已满(maxpeers=0) 443 flags := dynDialedConn 444 dialDest := clientnode 445 conn, _ := net.Pipe() 446 srv.SetupConn(conn, flags, dialDest) 447 if tp.closeErr != DiscTooManyPeers { 448 t.Errorf("unexpected close error: %q", tp.closeErr) 449 } 450 conn.Close() 451 452 srv.AddTrustedPeer(clientnode) 453 454 //检查服务器是否允许受信任的对等机(尽管已满)。 455 conn, _ = net.Pipe() 456 srv.SetupConn(conn, flags, dialDest) 457 if tp.closeErr == DiscTooManyPeers { 458 t.Errorf("failed to bypass MaxPeers with trusted node: %q", tp.closeErr) 459 } 460 461 if tp.closeErr != DiscUselessPeer { 462 t.Errorf("unexpected close error: %q", tp.closeErr) 463 } 464 conn.Close() 465 466 srv.RemoveTrustedPeer(clientnode) 467 468 //再次检查服务器是否已满。 469 conn, _ = net.Pipe() 470 srv.SetupConn(conn, flags, dialDest) 471 if tp.closeErr != DiscTooManyPeers { 472 t.Errorf("unexpected close error: %q", tp.closeErr) 473 } 474 conn.Close() 475 } 476 477 func TestServerSetupConn(t *testing.T) { 478 var ( 479 clientkey, srvkey = newkey(), newkey() 480 clientpub = &clientkey.PublicKey 481 srvpub = &srvkey.PublicKey 482 ) 483 tests := []struct { 484 dontstart bool 485 tt *setupTransport 486 flags connFlag 487 dialDest *enode.Node 488 489 wantCloseErr error 490 wantCalls string 491 }{ 492 { 493 dontstart: true, 494 tt: &setupTransport{pubkey: clientpub}, 495 wantCalls: "close,", 496 wantCloseErr: errServerStopped, 497 }, 498 { 499 tt: &setupTransport{pubkey: clientpub, encHandshakeErr: errors.New("read error")}, 500 flags: inboundConn, 501 wantCalls: "doEncHandshake,close,", 502 wantCloseErr: errors.New("read error"), 503 }, 504 { 505 tt: &setupTransport{pubkey: clientpub}, 506 dialDest: enode.NewV4(&newkey().PublicKey, nil, 0, 0), 507 flags: dynDialedConn, 508 wantCalls: "doEncHandshake,close,", 509 wantCloseErr: DiscUnexpectedIdentity, 510 }, 511 { 512 tt: &setupTransport{pubkey: clientpub, phs: protoHandshake{ID: randomID().Bytes()}}, 513 dialDest: enode.NewV4(clientpub, nil, 0, 0), 514 flags: dynDialedConn, 515 wantCalls: "doEncHandshake,doProtoHandshake,close,", 516 wantCloseErr: DiscUnexpectedIdentity, 517 }, 518 { 519 tt: &setupTransport{pubkey: clientpub, protoHandshakeErr: errors.New("foo")}, 520 dialDest: enode.NewV4(clientpub, nil, 0, 0), 521 flags: dynDialedConn, 522 wantCalls: "doEncHandshake,doProtoHandshake,close,", 523 wantCloseErr: errors.New("foo"), 524 }, 525 { 526 tt: &setupTransport{pubkey: srvpub, phs: protoHandshake{ID: crypto.FromECDSAPub(srvpub)[1:]}}, 527 flags: inboundConn, 528 wantCalls: "doEncHandshake,close,", 529 wantCloseErr: DiscSelf, 530 }, 531 { 532 tt: &setupTransport{pubkey: clientpub, phs: protoHandshake{ID: crypto.FromECDSAPub(clientpub)[1:]}}, 533 flags: inboundConn, 534 wantCalls: "doEncHandshake,doProtoHandshake,close,", 535 wantCloseErr: DiscUselessPeer, 536 }, 537 } 538 539 for i, test := range tests { 540 srv := &Server{ 541 Config: Config{ 542 PrivateKey: srvkey, 543 MaxPeers: 10, 544 NoDial: true, 545 Protocols: []Protocol{discard}, 546 }, 547 newTransport: func(fd net.Conn) transport { return test.tt }, 548 log: log.New(), 549 } 550 if !test.dontstart { 551 if err := srv.Start(); err != nil { 552 t.Fatalf("couldn't start server: %v", err) 553 } 554 } 555 p1, _ := net.Pipe() 556 srv.SetupConn(p1, test.flags, test.dialDest) 557 if !reflect.DeepEqual(test.tt.closeErr, test.wantCloseErr) { 558 t.Errorf("test %d: close error mismatch: got %q, want %q", i, test.tt.closeErr, test.wantCloseErr) 559 } 560 if test.tt.calls != test.wantCalls { 561 t.Errorf("test %d: calls mismatch: got %q, want %q", i, test.tt.calls, test.wantCalls) 562 } 563 } 564 } 565 566 type setupTransport struct { 567 pubkey *ecdsa.PublicKey 568 encHandshakeErr error 569 phs protoHandshake 570 protoHandshakeErr error 571 572 calls string 573 closeErr error 574 } 575 576 func (c *setupTransport) doEncHandshake(prv *ecdsa.PrivateKey, dialDest *ecdsa.PublicKey) (*ecdsa.PublicKey, error) { 577 c.calls += "doEncHandshake," 578 return c.pubkey, c.encHandshakeErr 579 } 580 581 func (c *setupTransport) doProtoHandshake(our *protoHandshake) (*protoHandshake, error) { 582 c.calls += "doProtoHandshake," 583 if c.protoHandshakeErr != nil { 584 return nil, c.protoHandshakeErr 585 } 586 return &c.phs, nil 587 } 588 func (c *setupTransport) close(err error) { 589 c.calls += "close," 590 c.closeErr = err 591 } 592 593 //SetupConn不应写入/读取连接。 594 func (c *setupTransport) WriteMsg(Msg) error { 595 panic("WriteMsg called on setupTransport") 596 } 597 func (c *setupTransport) ReadMsg() (Msg, error) { 598 panic("ReadMsg called on setupTransport") 599 } 600 601 func newkey() *ecdsa.PrivateKey { 602 key, err := crypto.GenerateKey() 603 if err != nil { 604 panic("couldn't generate key: " + err.Error()) 605 } 606 return key 607 } 608 609 func randomID() (id enode.ID) { 610 for i := range id { 611 id[i] = byte(rand.Intn(255)) 612 } 613 return id 614 } 615