Files
chorus/portal/main_test.go
T

66 lines
1.5 KiB
Go

package main
import (
"context"
"errors"
"net/http"
"strings"
"testing"
"time"
)
func TestRunComponentsWaitsForInflightWorker(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
httpStopped := make(chan struct{})
workerStarted := make(chan struct{})
workerCanceled := make(chan struct{})
releaseWorker := make(chan struct{})
done := make(chan error, 1)
go func() {
done <- runComponents(ctx, func() error {
<-httpStopped
return http.ErrServerClosed
}, func(context.Context) error {
close(httpStopped)
return nil
}, func(workerCtx context.Context) error {
close(workerStarted)
<-workerCtx.Done()
close(workerCanceled)
<-releaseWorker
return nil
})
}()
<-workerStarted
cancel()
<-workerCanceled
select {
case err := <-done:
t.Fatalf("runComponents returned before inflight worker completed: %v", err)
case <-time.After(20 * time.Millisecond):
}
close(releaseWorker)
if err := <-done; err != nil {
t.Fatal(err)
}
}
func TestRunComponentsFailsClosedWhenWorkerStops(t *testing.T) {
httpStopped := make(chan struct{})
workerErr := errors.New("worker unavailable")
err := runComponents(context.Background(), func() error {
<-httpStopped
return http.ErrServerClosed
}, func(context.Context) error {
close(httpStopped)
return nil
}, func(context.Context) error {
return workerErr
})
if err == nil || !strings.Contains(err.Error(), workerErr.Error()) {
t.Fatalf("expected worker failure, got %v", err)
}
}