From 1ad4c2aa7280afd5445a124415f15386ba237a38 Mon Sep 17 00:00:00 2001 From: Virgil Date: Fri, 3 Apr 2026 23:13:57 +0000 Subject: [PATCH] fix(process): guard runner without service --- runner.go | 19 +++++++++++++++++++ runner_test.go | 16 ++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/runner.go b/runner.go index 4fd8eb7..4fa91f8 100644 --- a/runner.go +++ b/runner.go @@ -13,6 +13,9 @@ type Runner struct { service *Service } +// ErrRunnerNoService is returned when a runner was created without a service. +var ErrRunnerNoService = core.E("", "runner service is nil", nil) + // NewRunner creates a runner for the given service. func NewRunner(svc *Service) *Runner { return &Runner{service: svc} @@ -68,6 +71,9 @@ func (r RunAllResult) Success() bool { // RunAll executes specs respecting dependencies, parallelising where possible. func (r *Runner) RunAll(ctx context.Context, specs []RunSpec) (*RunAllResult, error) { + if err := r.ensureService(); err != nil { + return nil, err + } start := time.Now() // Build dependency graph @@ -226,6 +232,9 @@ func (r *Runner) runSpec(ctx context.Context, spec RunSpec) RunResult { // RunSequential executes specs one after another, stopping on first failure. func (r *Runner) RunSequential(ctx context.Context, specs []RunSpec) (*RunAllResult, error) { + if err := r.ensureService(); err != nil { + return nil, err + } start := time.Now() results := make([]RunResult, 0, len(specs)) @@ -266,6 +275,9 @@ func (r *Runner) RunSequential(ctx context.Context, specs []RunSpec) (*RunAllRes // RunParallel executes all specs concurrently, regardless of dependencies. func (r *Runner) RunParallel(ctx context.Context, specs []RunSpec) (*RunAllResult, error) { + if err := r.ensureService(); err != nil { + return nil, err + } start := time.Now() results := make([]RunResult, len(specs)) @@ -296,3 +308,10 @@ func (r *Runner) RunParallel(ctx context.Context, specs []RunSpec) (*RunAllResul return aggResult, nil } + +func (r *Runner) ensureService() error { + if r == nil || r.service == nil { + return ErrRunnerNoService + } + return nil +} diff --git a/runner_test.go b/runner_test.go index 02f6abb..0e1ea42 100644 --- a/runner_test.go +++ b/runner_test.go @@ -203,3 +203,19 @@ func TestRunResult_Passed_Good(t *testing.T) { assert.False(t, r.Passed()) }) } + +func TestRunner_NilService_Bad(t *testing.T) { + runner := NewRunner(nil) + + _, err := runner.RunAll(context.Background(), nil) + require.Error(t, err) + assert.ErrorIs(t, err, ErrRunnerNoService) + + _, err = runner.RunSequential(context.Background(), nil) + require.Error(t, err) + assert.ErrorIs(t, err, ErrRunnerNoService) + + _, err = runner.RunParallel(context.Background(), nil) + require.Error(t, err) + assert.ErrorIs(t, err, ErrRunnerNoService) +}