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)) } }