forked from taskcluster/taskcluster
-
Notifications
You must be signed in to change notification settings - Fork 0
/
intermittent_task_test.go
124 lines (108 loc) · 3.1 KB
/
intermittent_task_test.go
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package main
import (
"strings"
"testing"
)
// Exit codes specified in OnExitStatus should resolve as itermittent
func TestIntermittentCodeCommandIntermittent(t *testing.T) {
defer setup(t)()
payload := GenericWorkerPayload{
Command: returnExitCode(123),
MaxRunTime: 30,
OnExitStatus: ExitCodeHandling{
Retry: []int64{123},
},
}
td := testTask(t)
_ = submitAndAssert(t, td, payload, "exception", "intermittent-task")
// Note this will cause the queue to schedule a new task run that won't get
// claimed - but let's not waste resources by claiming it, and leave it to
// exceed deadline.
}
// Exit codes _not_ specified in OnExitStatus should resolve normally
func TestIntermittentCodeCommandFailure(t *testing.T) {
defer setup(t)()
payload := GenericWorkerPayload{
Command: returnExitCode(456),
MaxRunTime: 30,
OnExitStatus: ExitCodeHandling{
Retry: []int64{123},
},
}
td := testTask(t)
_ = submitAndAssert(t, td, payload, "failed", "failed")
}
// Exit codes should not override success
func TestIntermittentCodeCommandSuccess(t *testing.T) {
defer setup(t)()
payload := GenericWorkerPayload{
Command: returnExitCode(0),
MaxRunTime: 30,
OnExitStatus: ExitCodeHandling{
Retry: []int64{780},
},
}
td := testTask(t)
_ = submitAndAssert(t, td, payload, "completed", "completed")
}
// Exit codes as a list
func TestIntermittentListCommandIntermittent(t *testing.T) {
defer setup(t)()
payload := GenericWorkerPayload{
Command: returnExitCode(10),
MaxRunTime: 30,
OnExitStatus: ExitCodeHandling{
Retry: []int64{780, 10, 2},
},
}
td := testTask(t)
_ = submitAndAssert(t, td, payload, "exception", "intermittent-task")
// Note this will cause the queue to schedule a new task run that won't get
// claimed - but let's not waste resources by claiming it, and leave it to
// exceed deadline.
}
// Exit codes with empty list are fine
func TestIntermittentEmptyListCommandSuccess(t *testing.T) {
defer setup(t)()
payload := GenericWorkerPayload{
Command: returnExitCode(0),
MaxRunTime: 30,
OnExitStatus: ExitCodeHandling{
Retry: []int64{},
},
}
td := testTask(t)
_ = submitAndAssert(t, td, payload, "completed", "completed")
}
// Exit codes with empty list are fine (failure)
func TestIntermittentEmptyListCommandFailure(t *testing.T) {
defer setup(t)()
payload := GenericWorkerPayload{
Command: returnExitCode(1),
MaxRunTime: 30,
OnExitStatus: ExitCodeHandling{
Retry: []int64{},
},
}
td := testTask(t)
_ = submitAndAssert(t, td, payload, "failed", "failed")
}
// Not allowed to specify negative exit code
func TestIntermittentNegativeExitCode(t *testing.T) {
defer setup(t)()
payload := GenericWorkerPayload{
Command: returnExitCode(1),
MaxRunTime: 30,
OnExitStatus: ExitCodeHandling{
Retry: []int64{-1},
},
}
td := testTask(t)
_ = submitAndAssert(t, td, payload, "exception", "malformed-payload")
logtext := LogText(t)
substring := "onExitStatus.retry.0: Must be greater than or equal to 1"
if !strings.Contains(logtext, substring) {
t.Log(logtext)
t.Fatalf("Was expecting log to contain string %v.", substring)
}
}