package server_test import ( "context" "net" "testing" "git.eeqj.de/sneak/routewatch/internal/config" "git.eeqj.de/sneak/routewatch/internal/logger" "git.eeqj.de/sneak/routewatch/internal/metrics" "git.eeqj.de/sneak/routewatch/internal/server" "git.eeqj.de/sneak/routewatch/internal/streamer" ) // TestStartFailsWhenPortIsHeld holds a port with a listener of its own and // checks that Start on that port returns an error. Before the fix Start // listened in a goroutine, only logged the failure and returned nil, so the // daemon kept running without its web server. func TestStartFailsWhenPortIsHeld(t *testing.T) { t.Parallel() var listenConfig net.ListenConfig held, err := listenConfig.Listen(t.Context(), "tcp", ":0") if err != nil { t.Fatalf("failed to open the test listener: %v", err) } defer func() { _ = held.Close() }() addr, ok := held.Addr().(*net.TCPAddr) if !ok { t.Fatalf("test listener address %v is not a TCP address", held.Addr()) } port := addr.Port log := logger.New() s := server.New(nil, streamer.New(log, metrics.New()), log, &config.Config{Port: port}) defer func() { _ = s.Stop(context.Background()) }() err = s.Start(t.Context()) if err == nil { t.Fatalf("Start returned nil while port %d was held by another listener", port) } }