-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcancel_test.go
More file actions
68 lines (64 loc) · 1.87 KB
/
Copy pathcancel_test.go
File metadata and controls
68 lines (64 loc) · 1.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package taskrun
import (
"context"
"errors"
"testing"
"time"
)
// ignore_error tolerates a non-zero exit or a handler business error only. It
// must never absorb cancellation, a timeout or a start failure.
func TestIgnoreErrorDoesNotAbsorbCancel(t *testing.T) {
r := newTestRunner(t, Definition{
Tasks: map[string]Task{"t": {Steps: []Step{{IgnoreError: true, Exec: sleepExec(5)}}}},
})
ctx, cancel := context.WithCancel(context.Background())
go func() {
time.Sleep(200 * time.Millisecond)
cancel()
}()
result, err := r.Run(ctx, Request{Task: "t"})
if err == nil || !errors.Is(err, context.Canceled) {
t.Fatalf("err=%v", err)
}
if result.Status != StatusCanceled {
t.Fatalf("status=%s", result.Status)
}
}
func TestIgnoreErrorDoesNotAbsorbTimeout(t *testing.T) {
r := newTestRunner(t, Definition{
Tasks: map[string]Task{"t": {Timeout: 300 * time.Millisecond, Steps: []Step{{IgnoreError: true, Exec: sleepExec(5)}}}},
})
result, err := r.Run(context.Background(), Request{Task: "t"})
if err == nil || !errors.Is(err, context.DeadlineExceeded) {
t.Fatalf("err=%v", err)
}
if result.Status != StatusTimedOut {
t.Fatalf("status=%s", result.Status)
}
}
func TestCancellationBlocksParent(t *testing.T) {
var after int
r := newTestRunner(t, Definition{
Tasks: map[string]Task{
"root": {Steps: []Step{
{Task: &TaskCall{Name: "slow"}},
{Host: &HostSpec{Name: "after"}},
}},
"slow": {Steps: []Step{{Exec: sleepExec(5)}}},
},
}, WithHandler("after", func(_ context.Context, _ HostCall) (ActionResult, error) {
after++
return ActionResult{}, nil
}))
ctx, cancel := context.WithCancel(context.Background())
go func() {
time.Sleep(200 * time.Millisecond)
cancel()
}()
if _, err := r.Run(ctx, Request{Task: "root"}); err == nil {
t.Fatal("expected cancellation")
}
if after != 0 {
t.Fatal("parent continued after a dependency was canceled")
}
}