@@ -19,7 +19,9 @@ package net
19
19
import (
20
20
"context"
21
21
"fmt"
22
+ "io"
22
23
"net"
24
+ "net/http"
23
25
"strconv"
24
26
"sync/atomic"
25
27
"testing"
@@ -482,6 +484,51 @@ func TestMultiListen_Accept(t *testing.T) {
482
484
}
483
485
}
484
486
487
+ func TestMultiListen_HTTP (t * testing.T ) {
488
+ ctx := context .TODO ()
489
+ ml , err := MultiListen (ctx , "tcp" , ":0" , ":0" , ":0" )
490
+ if err != nil {
491
+ t .Fatalf ("unexpected error: %v" , err )
492
+ }
493
+
494
+ addrs := ml .(* multiListener ).Addrs ()
495
+ if len (addrs ) != 3 {
496
+ t .Fatalf ("expected 3 listeners, got %v" , addrs )
497
+ }
498
+
499
+ // serve http on multi-listener
500
+ handler := func (w http.ResponseWriter , _ * http.Request ) {
501
+ io .WriteString (w , "hello" )
502
+ }
503
+ server := http.Server {
504
+ Handler : http .HandlerFunc (handler ),
505
+ }
506
+ go func () { _ = server .Serve (ml ) }()
507
+ defer server .Close ()
508
+
509
+ // Wait for server
510
+ awake := false
511
+ for i := 0 ; i < 5 ; i ++ {
512
+ _ , err = http .Get ("http://" + addrs [0 ].String ())
513
+ if err == nil {
514
+ awake = true
515
+ break
516
+ }
517
+ time .Sleep (50 * time .Millisecond )
518
+ }
519
+ if ! awake {
520
+ t .Fatalf ("http server did not respond in time" )
521
+ }
522
+
523
+ // HTTP GET on each address.
524
+ for _ , addr := range addrs {
525
+ _ , err = http .Get ("http://" + addr .String ())
526
+ if err != nil {
527
+ t .Errorf ("error connecting to %q: %v" , addr .String (), err )
528
+ }
529
+ }
530
+ }
531
+
485
532
func assertError (t * testing.T , errString string , err error ) {
486
533
if err == nil {
487
534
t .Errorf ("Expected error '%s' but got none" , errString )
0 commit comments