github.com/okex/exchain@v1.8.0/libs/tendermint/p2p/transport_test.go (about) 1 package p2p 2 3 import ( 4 "fmt" 5 "math/rand" 6 "net" 7 "reflect" 8 "testing" 9 "time" 10 11 "github.com/okex/exchain/libs/tendermint/crypto/ed25519" 12 "github.com/okex/exchain/libs/tendermint/p2p/conn" 13 ) 14 15 var defaultNodeName = "host_peer" 16 17 func emptyNodeInfo() NodeInfo { 18 return DefaultNodeInfo{} 19 } 20 21 // newMultiplexTransport returns a tcp connected multiplexed peer 22 // using the default MConnConfig. It's a convenience function used 23 // for testing. 24 func newMultiplexTransport( 25 nodeInfo NodeInfo, 26 nodeKey NodeKey, 27 ) *MultiplexTransport { 28 return NewMultiplexTransport( 29 nodeInfo, nodeKey, conn.DefaultMConnConfig(), 30 ) 31 } 32 33 func TestTransportMultiplexConnFilter(t *testing.T) { 34 mt := newMultiplexTransport( 35 emptyNodeInfo(), 36 NodeKey{ 37 PrivKey: ed25519.GenPrivKey(), 38 }, 39 ) 40 id := mt.nodeKey.ID() 41 42 MultiplexTransportConnFilters( 43 func(_ ConnSet, _ net.Conn, _ []net.IP) error { return nil }, 44 func(_ ConnSet, _ net.Conn, _ []net.IP) error { return nil }, 45 func(_ ConnSet, _ net.Conn, _ []net.IP) error { 46 return fmt.Errorf("rejected") 47 }, 48 )(mt) 49 50 addr, err := NewNetAddressString(IDAddressString(id, "127.0.0.1:0")) 51 if err != nil { 52 t.Fatal(err) 53 } 54 55 if err := mt.Listen(*addr); err != nil { 56 t.Fatal(err) 57 } 58 59 errc := make(chan error) 60 61 go func() { 62 addr := NewNetAddress(id, mt.listener.Addr()) 63 64 _, err := addr.Dial() 65 if err != nil { 66 errc <- err 67 return 68 } 69 70 close(errc) 71 }() 72 73 if err := <-errc; err != nil { 74 t.Errorf("connection failed: %v", err) 75 } 76 77 _, err = mt.Accept(peerConfig{}) 78 if err, ok := err.(ErrRejected); ok { 79 if !err.IsFiltered() { 80 t.Errorf("expected peer to be filtered") 81 } 82 } else { 83 t.Errorf("expected ErrRejected") 84 } 85 } 86 87 func TestTransportMultiplexConnFilterTimeout(t *testing.T) { 88 mt := newMultiplexTransport( 89 emptyNodeInfo(), 90 NodeKey{ 91 PrivKey: ed25519.GenPrivKey(), 92 }, 93 ) 94 id := mt.nodeKey.ID() 95 96 MultiplexTransportFilterTimeout(5 * time.Millisecond)(mt) 97 MultiplexTransportConnFilters( 98 func(_ ConnSet, _ net.Conn, _ []net.IP) error { 99 time.Sleep(10 * time.Millisecond) 100 return nil 101 }, 102 )(mt) 103 104 addr, err := NewNetAddressString(IDAddressString(id, "127.0.0.1:0")) 105 if err != nil { 106 t.Fatal(err) 107 } 108 109 if err := mt.Listen(*addr); err != nil { 110 t.Fatal(err) 111 } 112 113 errc := make(chan error) 114 115 go func() { 116 addr := NewNetAddress(id, mt.listener.Addr()) 117 118 _, err := addr.Dial() 119 if err != nil { 120 errc <- err 121 return 122 } 123 124 close(errc) 125 }() 126 127 if err := <-errc; err != nil { 128 t.Errorf("connection failed: %v", err) 129 } 130 131 _, err = mt.Accept(peerConfig{}) 132 if _, ok := err.(ErrFilterTimeout); !ok { 133 t.Errorf("expected ErrFilterTimeout") 134 } 135 } 136 137 func TestTransportMultiplexMaxIncomingConnections(t *testing.T) { 138 mt := newMultiplexTransport( 139 emptyNodeInfo(), 140 NodeKey{ 141 PrivKey: ed25519.GenPrivKey(), 142 }, 143 ) 144 id := mt.nodeKey.ID() 145 146 MultiplexTransportMaxIncomingConnections(0)(mt) 147 148 addr, err := NewNetAddressString(IDAddressString(id, "127.0.0.1:0")) 149 if err != nil { 150 t.Fatal(err) 151 } 152 153 if err := mt.Listen(*addr); err != nil { 154 t.Fatal(err) 155 } 156 157 errc := make(chan error) 158 go func() { 159 addr := NewNetAddress(id, mt.listener.Addr()) 160 time.Sleep(300 * time.Millisecond) 161 _, err := addr.Dial() 162 if err != nil { 163 errc <- err 164 return 165 } 166 close(errc) 167 }() 168 169 if err := <-errc; err != nil { 170 t.Errorf("connection failed: %v", err) 171 } 172 173 _, err = mt.Accept(peerConfig{}) 174 if err == nil { 175 t.Errorf("expected connection reset by peer error, got nil") 176 } 177 } 178 179 func TestTransportMultiplexAcceptMultiple(t *testing.T) { 180 mt := testSetupMultiplexTransport(t) 181 laddr := NewNetAddress(mt.nodeKey.ID(), mt.listener.Addr()) 182 183 var ( 184 seed = rand.New(rand.NewSource(time.Now().UnixNano())) 185 nDialers = seed.Intn(64) + 64 186 errc = make(chan error, nDialers) 187 ) 188 189 // Setup dialers. 190 for i := 0; i < nDialers; i++ { 191 go testDialer(*laddr, errc) 192 } 193 194 // Catch connection errors. 195 for i := 0; i < nDialers; i++ { 196 if err := <-errc; err != nil { 197 t.Fatal(err) 198 } 199 } 200 201 ps := []Peer{} 202 203 // Accept all peers. 204 for i := 0; i < cap(errc); i++ { 205 p, err := mt.Accept(peerConfig{}) 206 if err != nil { 207 t.Fatal(err) 208 } 209 210 if err := p.Start(); err != nil { 211 t.Fatal(err) 212 } 213 214 ps = append(ps, p) 215 } 216 217 if have, want := len(ps), cap(errc); have != want { 218 t.Errorf("have %v, want %v", have, want) 219 } 220 221 // Stop all peers. 222 for _, p := range ps { 223 if err := p.Stop(); err != nil { 224 t.Fatal(err) 225 } 226 } 227 228 if err := mt.Close(); err != nil { 229 t.Errorf("close errored: %v", err) 230 } 231 } 232 233 func testDialer(dialAddr NetAddress, errc chan error) { 234 var ( 235 pv = ed25519.GenPrivKey() 236 dialer = newMultiplexTransport( 237 testNodeInfo(PubKeyToID(pv.PubKey()), defaultNodeName), 238 NodeKey{ 239 PrivKey: pv, 240 }, 241 ) 242 ) 243 244 _, err := dialer.Dial(dialAddr, peerConfig{}) 245 if err != nil { 246 errc <- err 247 return 248 } 249 250 // Signal that the connection was established. 251 errc <- nil 252 } 253 254 func TestTransportMultiplexAcceptNonBlocking(t *testing.T) { 255 mt := testSetupMultiplexTransport(t) 256 257 var ( 258 fastNodePV = ed25519.GenPrivKey() 259 fastNodeInfo = testNodeInfo(PubKeyToID(fastNodePV.PubKey()), "fastnode") 260 done = make(chan error) 261 fastc = make(chan struct{}) 262 slowc = make(chan struct{}) 263 ) 264 265 // Simulate slow Peer. 266 go func() { 267 addr := NewNetAddress(mt.nodeKey.ID(), mt.listener.Addr()) 268 269 c, err := addr.Dial() 270 if err != nil { 271 t.Errorf("slow_peer dial err, err: %s", err.Error()) 272 return 273 } 274 275 close(slowc) 276 277 select { 278 case <-fastc: 279 // Fast peer connected. 280 case <-time.After(500 * time.Millisecond): 281 // We error if the fast peer didn't succeed. 282 t.Errorf("slow_peer recv timed out") 283 return 284 } 285 286 sc, err := upgradeSecretConn(c, 500*time.Millisecond, ed25519.GenPrivKey()) 287 if err != nil { 288 t.Errorf("slow_peer upgradeSecretConn err: %s", err.Error()) 289 return 290 } 291 292 _, err = handshake(sc, 500*time.Millisecond, 293 testNodeInfo( 294 PubKeyToID(ed25519.GenPrivKey().PubKey()), 295 "slow_peer", 296 )) 297 if err != nil { 298 t.Errorf("slow_peer handshake err: %s", err.Error()) 299 return 300 } 301 }() 302 303 // Simulate fast Peer. 304 go func() { 305 <-slowc 306 307 var ( 308 dialer = newMultiplexTransport( 309 fastNodeInfo, 310 NodeKey{ 311 PrivKey: fastNodePV, 312 }, 313 ) 314 ) 315 addr := NewNetAddress(mt.nodeKey.ID(), mt.listener.Addr()) 316 317 _, err := dialer.Dial(*addr, peerConfig{}) 318 if err != nil { 319 t.Errorf("fast_peer Dial err: %s", err.Error()) 320 return 321 } 322 close(fastc) 323 close(done) 324 325 }() 326 327 <-done 328 p, err := mt.Accept(peerConfig{}) 329 if err != nil { 330 t.Fatal(err) 331 } 332 333 if have, want := p.NodeInfo(), fastNodeInfo; !reflect.DeepEqual(have, want) { 334 t.Errorf("have %v, want %v", have, want) 335 } 336 } 337 338 func TestTransportMultiplexValidateNodeInfo(t *testing.T) { 339 mt := testSetupMultiplexTransport(t) 340 341 errc := make(chan error) 342 343 go func() { 344 var ( 345 pv = ed25519.GenPrivKey() 346 dialer = newMultiplexTransport( 347 testNodeInfo(PubKeyToID(pv.PubKey()), ""), // Should not be empty 348 NodeKey{ 349 PrivKey: pv, 350 }, 351 ) 352 ) 353 354 addr := NewNetAddress(mt.nodeKey.ID(), mt.listener.Addr()) 355 356 _, err := dialer.Dial(*addr, peerConfig{}) 357 if err != nil { 358 errc <- err 359 return 360 } 361 362 close(errc) 363 }() 364 365 if err := <-errc; err != nil { 366 t.Errorf("connection failed: %v", err) 367 } 368 369 _, err := mt.Accept(peerConfig{}) 370 if err, ok := err.(ErrRejected); ok { 371 if !err.IsNodeInfoInvalid() { 372 t.Errorf("expected NodeInfo to be invalid") 373 } 374 } else { 375 t.Errorf("expected ErrRejected") 376 } 377 } 378 379 func TestTransportMultiplexRejectMissmatchID(t *testing.T) { 380 mt := testSetupMultiplexTransport(t) 381 382 errc := make(chan error) 383 384 go func() { 385 dialer := newMultiplexTransport( 386 testNodeInfo( 387 PubKeyToID(ed25519.GenPrivKey().PubKey()), "dialer", 388 ), 389 NodeKey{ 390 PrivKey: ed25519.GenPrivKey(), 391 }, 392 ) 393 addr := NewNetAddress(mt.nodeKey.ID(), mt.listener.Addr()) 394 395 _, err := dialer.Dial(*addr, peerConfig{}) 396 if err != nil { 397 errc <- err 398 return 399 } 400 401 close(errc) 402 }() 403 404 if err := <-errc; err != nil { 405 t.Errorf("connection failed: %v", err) 406 } 407 408 _, err := mt.Accept(peerConfig{}) 409 if err, ok := err.(ErrRejected); ok { 410 if !err.IsAuthFailure() { 411 t.Errorf("expected auth failure") 412 } 413 } else { 414 t.Errorf("expected ErrRejected") 415 } 416 } 417 418 func TestTransportMultiplexDialRejectWrongID(t *testing.T) { 419 mt := testSetupMultiplexTransport(t) 420 421 var ( 422 pv = ed25519.GenPrivKey() 423 dialer = newMultiplexTransport( 424 testNodeInfo(PubKeyToID(pv.PubKey()), ""), // Should not be empty 425 NodeKey{ 426 PrivKey: pv, 427 }, 428 ) 429 ) 430 431 wrongID := PubKeyToID(ed25519.GenPrivKey().PubKey()) 432 addr := NewNetAddress(wrongID, mt.listener.Addr()) 433 434 _, err := dialer.Dial(*addr, peerConfig{}) 435 if err != nil { 436 t.Logf("connection failed: %v", err) 437 if err, ok := err.(ErrRejected); ok { 438 if !err.IsAuthFailure() { 439 t.Errorf("expected auth failure") 440 } 441 } else { 442 t.Errorf("expected ErrRejected") 443 } 444 } 445 } 446 447 func TestTransportMultiplexRejectIncompatible(t *testing.T) { 448 mt := testSetupMultiplexTransport(t) 449 450 errc := make(chan error) 451 452 go func() { 453 var ( 454 pv = ed25519.GenPrivKey() 455 dialer = newMultiplexTransport( 456 testNodeInfoWithNetwork(PubKeyToID(pv.PubKey()), "dialer", "incompatible-network"), 457 NodeKey{ 458 PrivKey: pv, 459 }, 460 ) 461 ) 462 addr := NewNetAddress(mt.nodeKey.ID(), mt.listener.Addr()) 463 464 _, err := dialer.Dial(*addr, peerConfig{}) 465 if err != nil { 466 errc <- err 467 return 468 } 469 470 close(errc) 471 }() 472 473 _, err := mt.Accept(peerConfig{}) 474 if err, ok := err.(ErrRejected); ok { 475 if !err.IsIncompatible() { 476 t.Errorf("expected to reject incompatible") 477 } 478 } else { 479 t.Errorf("expected ErrRejected") 480 } 481 } 482 483 func TestTransportMultiplexRejectSelf(t *testing.T) { 484 mt := testSetupMultiplexTransport(t) 485 486 errc := make(chan error) 487 488 go func() { 489 addr := NewNetAddress(mt.nodeKey.ID(), mt.listener.Addr()) 490 491 _, err := mt.Dial(*addr, peerConfig{}) 492 if err != nil { 493 errc <- err 494 return 495 } 496 497 close(errc) 498 }() 499 500 if err := <-errc; err != nil { 501 if err, ok := err.(ErrRejected); ok { 502 if !err.IsSelf() { 503 t.Errorf("expected to reject self, got: %v", err) 504 } 505 } else { 506 t.Errorf("expected ErrRejected") 507 } 508 } else { 509 t.Errorf("expected connection failure") 510 } 511 512 _, err := mt.Accept(peerConfig{}) 513 if err, ok := err.(ErrRejected); ok { 514 if !err.IsSelf() { 515 t.Errorf("expected to reject self, got: %v", err) 516 } 517 } else { 518 t.Errorf("expected ErrRejected") 519 } 520 } 521 522 func TestTransportConnDuplicateIPFilter(t *testing.T) { 523 filter := ConnDuplicateIPFilter() 524 525 if err := filter(nil, &testTransportConn{}, nil); err != nil { 526 t.Fatal(err) 527 } 528 529 var ( 530 c = &testTransportConn{} 531 cs = NewConnSet() 532 ) 533 534 cs.Set(c, []net.IP{ 535 {10, 0, 10, 1}, 536 {10, 0, 10, 2}, 537 {10, 0, 10, 3}, 538 }) 539 540 if err := filter(cs, c, []net.IP{ 541 {10, 0, 10, 2}, 542 }); err == nil { 543 t.Errorf("expected Peer to be rejected as duplicate") 544 } 545 } 546 547 func TestTransportHandshake(t *testing.T) { 548 ln, err := net.Listen("tcp", "127.0.0.1:0") 549 if err != nil { 550 t.Fatal(err) 551 } 552 553 var ( 554 peerPV = ed25519.GenPrivKey() 555 peerNodeInfo = testNodeInfo(PubKeyToID(peerPV.PubKey()), defaultNodeName) 556 ) 557 558 go func() { 559 c, err := net.Dial(ln.Addr().Network(), ln.Addr().String()) 560 if err != nil { 561 t.Error(err) 562 return 563 } 564 565 go func(c net.Conn) { 566 _, err := cdc.MarshalBinaryLengthPrefixedWriter(c, peerNodeInfo.(DefaultNodeInfo)) 567 if err != nil { 568 t.Error(err) 569 } 570 }(c) 571 go func(c net.Conn) { 572 var ni DefaultNodeInfo 573 574 _, err := cdc.UnmarshalBinaryLengthPrefixedReader( 575 c, 576 &ni, 577 int64(MaxNodeInfoSize()), 578 ) 579 if err != nil { 580 t.Error(err) 581 } 582 }(c) 583 }() 584 585 c, err := ln.Accept() 586 if err != nil { 587 t.Fatal(err) 588 } 589 590 ni, err := handshake(c, 500*time.Millisecond, emptyNodeInfo()) 591 if err != nil { 592 t.Fatal(err) 593 } 594 595 if have, want := ni, peerNodeInfo; !reflect.DeepEqual(have, want) { 596 t.Errorf("have %v, want %v", have, want) 597 } 598 } 599 600 // create listener 601 func testSetupMultiplexTransport(t *testing.T) *MultiplexTransport { 602 var ( 603 pv = ed25519.GenPrivKey() 604 id = PubKeyToID(pv.PubKey()) 605 mt = newMultiplexTransport( 606 testNodeInfo( 607 id, "transport", 608 ), 609 NodeKey{ 610 PrivKey: pv, 611 }, 612 ) 613 ) 614 615 addr, err := NewNetAddressString(IDAddressString(id, "127.0.0.1:0")) 616 if err != nil { 617 t.Fatal(err) 618 } 619 620 if err := mt.Listen(*addr); err != nil { 621 t.Fatal(err) 622 } 623 624 return mt 625 } 626 627 type testTransportAddr struct{} 628 629 func (a *testTransportAddr) Network() string { return "tcp" } 630 func (a *testTransportAddr) String() string { return "test.local:1234" } 631 632 type testTransportConn struct{} 633 634 func (c *testTransportConn) Close() error { 635 return fmt.Errorf("close() not implemented") 636 } 637 638 func (c *testTransportConn) LocalAddr() net.Addr { 639 return &testTransportAddr{} 640 } 641 642 func (c *testTransportConn) RemoteAddr() net.Addr { 643 return &testTransportAddr{} 644 } 645 646 func (c *testTransportConn) Read(_ []byte) (int, error) { 647 return -1, fmt.Errorf("read() not implemented") 648 } 649 650 func (c *testTransportConn) SetDeadline(_ time.Time) error { 651 return fmt.Errorf("setDeadline() not implemented") 652 } 653 654 func (c *testTransportConn) SetReadDeadline(_ time.Time) error { 655 return fmt.Errorf("setReadDeadline() not implemented") 656 } 657 658 func (c *testTransportConn) SetWriteDeadline(_ time.Time) error { 659 return fmt.Errorf("setWriteDeadline() not implemented") 660 } 661 662 func (c *testTransportConn) Write(_ []byte) (int, error) { 663 return -1, fmt.Errorf("write() not implemented") 664 }