fix(process): guard runner without service

This commit is contained in:
Virgil 2026-04-03 23:13:57 +00:00
parent e2f84b69e1
commit 1ad4c2aa72
2 changed files with 35 additions and 0 deletions

View file

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

View file

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