Files

64 lines
1.7 KiB
Go

package controller
import (
"context"
"errors"
"sync"
"testing"
)
func TestParseSelectionDefaultsToAll(t *testing.T) {
for _, input := range []string{"", "all"} {
selection, err := ParseSelection(input)
if err != nil {
t.Fatal(err)
}
if len(selection) != 3 || selection[0] != Scheduler || selection[1] != PodWorker || selection[2] != VMWorker {
t.Fatalf("selection = %v", selection)
}
}
}
func TestParseSelectionAllowsOneOrMoreComponents(t *testing.T) {
selection, err := ParseSelection("vm-worker,scheduler,vm-worker")
if err != nil {
t.Fatal(err)
}
if len(selection) != 2 || selection[0] != VMWorker || selection[1] != Scheduler {
t.Fatalf("selection = %v", selection)
}
if _, err := ParseSelection("webhook"); err == nil {
t.Fatal("expected obsolete component to be rejected")
}
}
type componentFunc func(context.Context) error
func (f componentFunc) Run(ctx context.Context) error { return f(ctx) }
func TestRunStartsSelectedComponentsAndCancelsPeers(t *testing.T) {
started := make(chan ComponentName, 2)
peerStopped := make(chan struct{})
var once sync.Once
registry := Registry{
Scheduler: componentFunc(func(context.Context) error {
started <- Scheduler
return errors.New("poll failed")
}),
PodWorker: componentFunc(func(ctx context.Context) error {
started <- PodWorker
<-ctx.Done()
once.Do(func() { close(peerStopped) })
return ctx.Err()
}),
}
err := Run(context.Background(), Selection{Scheduler, PodWorker}, registry)
if err == nil || !errors.Is(err, context.Canceled) && err.Error() != "component scheduler: poll failed" {
t.Fatalf("Run() error = %v", err)
}
<-peerStopped
if len(started) != 2 {
t.Fatalf("started components = %d", len(started))
}
}