package health

import (
	"context"
	"net/http"
	"net/http/httptest"
	"net/url"
	"testing"
	"time"
)

func Test_health_overloaded_cancellation(t *testing.T) {
	started := make(chan struct{}, 1)
	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _r *http.Request) {
		select {
		case started <- struct{}{}:
		default:
		}
		time.Sleep(1 * time.Second)
		w.WriteHeader(http.StatusOK)
	}))
	defer ts.Close()

	ctx := context.Background()
	ctx, cancel := context.WithCancel(ctx)
	h := &health{
		Addr: ts.URL,
		stop: cancel,
	}

	var err error
	h.healthURI, err = url.Parse(ts.URL)
	if err != nil {
		t.Fatal(err)
	}
	h.healthURI.Path = "/health"

	stopped := make(chan struct{})
	go func() {
		h.overloaded(ctx)
		stopped <- struct{}{}
	}()

	select {
	case <-started:
	case <-time.After(5 * time.Second):
		t.Fatal("overloaded function did not start")
	}

	cancel()

	select {
	case <-stopped:
	case <-time.After(5 * time.Second):
		t.Fatal("overloaded function should have been cancelled")
	}
}
