check / check (push) Canceled after 0s
The start hook now binds the listen port itself and serves on it in a goroutine. A bind failure, such as a port already in use or a privileged port without root, is returned to fx, which stops startup and exits 1 with an error like "starting http server: listen tcp :8080: bind: address already in use". Before, the bind happened inside the goroutine and its error was only logged while the watcher kept running without the dashboard, API or health check. The http.Server is now built before that goroutine starts, so Shutdown no longer reads a field another goroutine may still be writing. TestPortInUseStopsStartup holds a port and checks that starting the server on it fails with an error naming it. Model: opus-5-5
39 lines
1.0 KiB
Go
39 lines
1.0 KiB
Go
package server
|
|
|
|
import (
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/go-chi/chi/v5"
|
|
)
|
|
|
|
// RequestTimeout exports the handler execution budget applied by
|
|
// chimw.Timeout in SetupRoutes, so tests can assert the relationship
|
|
// between it and the server's WriteTimeout.
|
|
const RequestTimeout time.Duration = requestTimeout
|
|
|
|
// SetListenPort overrides the port Run binds. A test uses it to hand
|
|
// Run an unbindable port, so that Run stores its http.Server and then
|
|
// returns an error without listening.
|
|
func SetListenPort(s *Server, port int) {
|
|
s.port = port
|
|
}
|
|
|
|
// HTTPServerOf returns the http.Server that Run built and stored, so a
|
|
// test can inspect the timeouts the running server actually carries.
|
|
func HTTPServerOf(s *Server) *http.Server {
|
|
return s.httpServer
|
|
}
|
|
|
|
// EnableSentry runs the Sentry setup that the start hook runs, without
|
|
// starting the HTTP server.
|
|
func EnableSentry(s *Server) error {
|
|
return s.enableSentry()
|
|
}
|
|
|
|
// RouterOf returns the router SetupRoutes built, so a test can add a
|
|
// route that panics.
|
|
func RouterOf(s *Server) *chi.Mux {
|
|
return s.router
|
|
}
|