Skip to content

Commit a1afdb7

Browse files
committed
Add multi-listener test for HTTP
1 parent d4aae2b commit a1afdb7

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

net/multi_listen_test.go

+47
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ package net
1919
import (
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+
485532
func 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

Comments
 (0)