Skip to content

Commit 0807544

Browse files
authored
Merge pull request #121 from linuxboot/fix/wait_stepstate_to_process_result
Fix the case when step generates an error which is passed to a step state, but test runner exits first
2 parents 927ea7f + b3a0339 commit 0807544

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

pkg/runner/step_state.go

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package runner
22

33
import (
4+
"context"
45
"encoding/json"
56
"fmt"
67
"strconv"
@@ -56,6 +57,21 @@ func (ss *stepState) Started() bool {
5657
return ss.stepRunner.Started()
5758
}
5859

60+
func (ss *stepState) WaitResults(ctx context.Context) (stepResult StepResult, err error) {
61+
// should wait for stepState to process a possible error code from stepRunner
62+
select {
63+
case <-ctx.Done():
64+
// Give priority to success path
65+
select {
66+
case <-ss.stopped:
67+
default:
68+
return StepResult{}, ctx.Err()
69+
}
70+
case <-ss.stopped:
71+
}
72+
return ss.stepRunner.WaitResults(ctx)
73+
}
74+
5975
func (ss *stepState) Stop() {
6076
ss.stepRunner.Stop()
6177
}
@@ -152,24 +168,24 @@ func (ss *stepState) String() string {
152168
return fmt.Sprintf("[#%d %s]", ss.stepIndex, ss.sb.TestStepLabel)
153169
}
154170

155-
func (ss *stepState) SetError(ctx xcontext.Context, err error) {
171+
func (ss *stepState) SetError(ctx xcontext.Context, runErr error) {
156172
ss.mu.Lock()
157173
defer ss.mu.Unlock()
158174

159-
if err == nil || ss.runErr != nil {
175+
if runErr == nil || ss.runErr != nil {
160176
return
161177
}
162-
ctx.Errorf("Step '%s' failed with error: %v", ss.sb.TestStepLabel, err)
163-
ss.runErr = err
178+
ctx.Errorf("Step '%s' failed with error: %v", ss.sb.TestStepLabel, runErr)
179+
ss.runErr = runErr
164180

165181
if ss.runErr != xcontext.ErrPaused && ss.runErr != xcontext.ErrCanceled {
166-
if err := emitEvent(ctx, ss.ev, EventTestError, nil, err.Error()); err != nil {
182+
if err := emitEvent(ctx, ss.ev, EventTestError, nil, runErr.Error()); err != nil {
167183
ctx.Errorf("failed to emit event: %s", err)
168184
}
169185
}
170186

171187
// notify last as callback may use GetError or cancel context
172188
go func() {
173-
ss.onError(err)
189+
ss.onError(runErr)
174190
}()
175191
}

pkg/runner/test_runner.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ func (tr *TestRunner) waitSteps(ctx xcontext.Context) ([]json.RawMessage, error)
271271
resumeStates = append(resumeStates, ss.GetInitResumeState())
272272
continue
273273
}
274-
result, err := ss.stepRunner.WaitResults(shutdownCtx)
274+
result, err := ss.WaitResults(shutdownCtx)
275275
if err != nil {
276276
stepsNeverReturned = append(stepsNeverReturned, ss.GetTestStepLabel())
277277
ss.SetError(ctx, &cerrors.ErrTestStepsNeverReturned{StepNames: []string{ss.GetTestStepLabel()}})

0 commit comments

Comments
 (0)