37 lines
1.1 KiB
Go
37 lines
1.1 KiB
Go
|
package lib
|
||
|
|
||
|
import (
|
||
|
"net/http"
|
||
|
|
||
|
"github.com/hashicorp/consul/ipaddr"
|
||
|
"github.com/hashicorp/consul/sdk/freeport"
|
||
|
"github.com/mitchellh/go-testing-interface"
|
||
|
)
|
||
|
|
||
|
// StartTestServer fires up a web server on a random unused port to serve the
|
||
|
// given handler body. The address it is listening on is returned. When the
|
||
|
// test case terminates the server will be stopped via cleanup functions.
|
||
|
//
|
||
|
// We can't directly use httptest.Server here because that only thinks a port
|
||
|
// is free if it's not bound. Consul tests frequently reserve ports via
|
||
|
// `sdk/freeport` so you can have one part of the test try to use a port and
|
||
|
// _know_ nothing is listening. If you simply assumed unbound ports were free
|
||
|
// you'd end up with test cross-talk and weirdness.
|
||
|
func StartTestServer(t testing.T, handler http.Handler) string {
|
||
|
ports := freeport.MustTake(1)
|
||
|
t.Cleanup(func() {
|
||
|
freeport.Return(ports)
|
||
|
})
|
||
|
|
||
|
addr := ipaddr.FormatAddressPort("127.0.0.1", ports[0])
|
||
|
|
||
|
server := &http.Server{Addr: addr, Handler: handler}
|
||
|
t.Cleanup(func() {
|
||
|
server.Close()
|
||
|
})
|
||
|
|
||
|
go server.ListenAndServe()
|
||
|
|
||
|
return addr
|
||
|
}
|