package agent import ( "context" "fmt" "net" "testing" "time" "github.com/hashicorp/go-hclog" "github.com/stretchr/testify/require" ) func TestAPIServers_WithServiceRunError(t *testing.T) { servers := NewAPIServers(hclog.New(nil)) server1, chErr1 := newAPIServerStub() server2, _ := newAPIServerStub() t.Run("Start", func(t *testing.T) { servers.Start(server1) servers.Start(server2) select { case <-servers.failed: t.Fatalf("expected servers to still be running") case <-time.After(5 * time.Millisecond): } }) err := fmt.Errorf("oops, I broke") t.Run("server exit non-nil error", func(t *testing.T) { chErr1 <- err select { case <-servers.failed: case <-time.After(time.Second): t.Fatalf("expected failed channel to be closed") } }) t.Run("shutdown remaining services", func(t *testing.T) { servers.Shutdown(context.Background()) require.Equal(t, err, servers.WaitForShutdown()) }) } func newAPIServerStub() (apiServer, chan error) { chErr := make(chan error) return apiServer{ Protocol: "http", Addr: &net.TCPAddr{ IP: net.ParseIP("127.0.0.11"), Port: 5505, }, Run: func() error { return <-chErr }, Shutdown: func(ctx context.Context) error { close(chErr) return nil }, }, chErr }