@@ -19,7 +19,9 @@ package net
1919import (
2020 "context"
2121 "fmt"
22+ "io"
2223 "net"
24+ "net/http"
2325 "strconv"
2426 "sync/atomic"
2527 "testing"
@@ -482,6 +484,51 @@ func TestMultiListen_Accept(t *testing.T) {
482484 }
483485}
484486
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+
485532func assertError (t * testing.T , errString string , err error ) {
486533 if err == nil {
487534 t .Errorf ("Expected error '%s' but got none" , errString )
0 commit comments