@@ -369,6 +369,136 @@ func TestServerTrustedPeers(t *testing.T) {
369
369
}
370
370
}
371
371
372
+ // Tests that a failed dial will temporarily throttle a peer.
373
+ func TestServerMaxPendingDials (t * testing.T ) {
374
+ defer testlog (t ).detach ()
375
+
376
+ // Start a simple test server
377
+ server := & Server {
378
+ ListenAddr : "127.0.0.1:0" ,
379
+ PrivateKey : newkey (),
380
+ MaxPeers : 10 ,
381
+ MaxPendingPeers : 1 ,
382
+ }
383
+ if err := server .Start (); err != nil {
384
+ t .Fatal ("failed to start test server: %v" , err )
385
+ }
386
+ defer server .Stop ()
387
+
388
+ // Simulate two separate remote peers
389
+ peers := make (chan * discover.Node , 2 )
390
+ conns := make (chan net.Conn , 2 )
391
+ for i := 0 ; i < 2 ; i ++ {
392
+ listener , err := net .Listen ("tcp" , "127.0.0.1:0" )
393
+ if err != nil {
394
+ t .Fatalf ("listener %d: failed to setup: %v" , i , err )
395
+ }
396
+ defer listener .Close ()
397
+
398
+ addr := listener .Addr ().(* net.TCPAddr )
399
+ peers <- & discover.Node {
400
+ ID : discover .PubkeyID (& newkey ().PublicKey ),
401
+ IP : addr .IP ,
402
+ TCP : uint16 (addr .Port ),
403
+ }
404
+ go func () {
405
+ conn , err := listener .Accept ()
406
+ if err == nil {
407
+ conns <- conn
408
+ }
409
+ }()
410
+ }
411
+ // Request a dial for both peers
412
+ go func () {
413
+ for i := 0 ; i < 2 ; i ++ {
414
+ server .staticDial <- <- peers // hack piggybacking the static implementation
415
+ }
416
+ }()
417
+
418
+ // Make sure only one outbound connection goes through
419
+ var conn net.Conn
420
+
421
+ select {
422
+ case conn = <- conns :
423
+ case <- time .After (100 * time .Millisecond ):
424
+ t .Fatalf ("first dial timeout" )
425
+ }
426
+ select {
427
+ case conn = <- conns :
428
+ t .Fatalf ("second dial completed prematurely" )
429
+ case <- time .After (100 * time .Millisecond ):
430
+ }
431
+ // Finish the first dial, check the second
432
+ conn .Close ()
433
+ select {
434
+ case conn = <- conns :
435
+ conn .Close ()
436
+
437
+ case <- time .After (100 * time .Millisecond ):
438
+ t .Fatalf ("second dial timeout" )
439
+ }
440
+ }
441
+
442
+ func TestServerMaxPendingAccepts (t * testing.T ) {
443
+ defer testlog (t ).detach ()
444
+
445
+ // Start a test server and a peer sink for synchronization
446
+ started := make (chan * Peer )
447
+ server := & Server {
448
+ ListenAddr : "127.0.0.1:0" ,
449
+ PrivateKey : newkey (),
450
+ MaxPeers : 10 ,
451
+ MaxPendingPeers : 1 ,
452
+ NoDial : true ,
453
+ newPeerHook : func (p * Peer ) { started <- p },
454
+ }
455
+ if err := server .Start (); err != nil {
456
+ t .Fatal ("failed to start test server: %v" , err )
457
+ }
458
+ defer server .Stop ()
459
+
460
+ // Try and connect to the server on multiple threads concurrently
461
+ conns := make ([]net.Conn , 2 )
462
+ for i := 0 ; i < 2 ; i ++ {
463
+ dialer := & net.Dialer {Deadline : time .Now ().Add (3 * time .Second )}
464
+
465
+ conn , err := dialer .Dial ("tcp" , server .ListenAddr )
466
+ if err != nil {
467
+ t .Fatalf ("failed to dial server: %v" , err )
468
+ }
469
+ conns [i ] = conn
470
+ }
471
+ // Check that a handshake on the second doesn't pass
472
+ go func () {
473
+ key := newkey ()
474
+ shake := & protoHandshake {Version : baseProtocolVersion , ID : discover .PubkeyID (& key .PublicKey )}
475
+ if _ , err := setupConn (conns [1 ], key , shake , server .Self (), false , server .trustedNodes ); err != nil {
476
+ t .Fatalf ("failed to run handshake: %v" , err )
477
+ }
478
+ }()
479
+ select {
480
+ case <- started :
481
+ t .Fatalf ("handshake on second connection accepted" )
482
+
483
+ case <- time .After (time .Second ):
484
+ }
485
+ // Shake on first, check that both go through
486
+ go func () {
487
+ key := newkey ()
488
+ shake := & protoHandshake {Version : baseProtocolVersion , ID : discover .PubkeyID (& key .PublicKey )}
489
+ if _ , err := setupConn (conns [0 ], key , shake , server .Self (), false , server .trustedNodes ); err != nil {
490
+ t .Fatalf ("failed to run handshake: %v" , err )
491
+ }
492
+ }()
493
+ for i := 0 ; i < 2 ; i ++ {
494
+ select {
495
+ case <- started :
496
+ case <- time .After (time .Second ):
497
+ t .Fatalf ("peer %d: handshake timeout" , i )
498
+ }
499
+ }
500
+ }
501
+
372
502
func newkey () * ecdsa.PrivateKey {
373
503
key , err := crypto .GenerateKey ()
374
504
if err != nil {
0 commit comments