...
1 package integration_test
2
3 import (
4 "fmt"
5 "runtime"
6 "strings"
7
8 . "github.com/onsi/ginkgo/v2"
9 . "github.com/onsi/gomega"
10 "github.com/onsi/gomega/gbytes"
11 "github.com/onsi/gomega/gexec"
12 )
13
14 var _ = Describe("Timeline output", func() {
15 denoter := "•"
16 retryDenoter := "↺"
17 if runtime.GOOS == "windows" {
18 denoter = "+"
19 retryDenoter = "R"
20 }
21 BeforeEach(func() {
22 fm.MountFixture("timeline")
23 })
24
25 Context("when running with succinct and normal verbosity", func() {
26 argGroups := [][]string{
27 {"--no-color", "--seed=17"},
28 {"--no-color", "--seed=17", "--nodes=2"},
29 {"--no-color", "--seed=17", "--succinct"},
30 {"--no-color", "--seed=17", "--nodes=2", "--succinct"},
31 }
32 for _, args := range argGroups {
33 args := args
34 It(fmt.Sprintf("should emit a timeline (%s)", strings.Join(args, " ")), func() {
35 session := startGinkgo(fm.PathTo("timeline"), args...)
36 Eventually(session).Should(gexec.Exit(1))
37
38 Ω(session).Should(gbytes.Say(`3 specs`))
39 Ω(session).Should(gbytes.Say(`Automatically polling progress`))
40 Ω(session).Should(gbytes.Say(`>\s*time\.Sleep\(time\.Millisecond \* 200\)`))
41 Ω(session).Should(gbytes.Say(retryDenoter + ` \[FLAKEY TEST - TOOK 3 ATTEMPTS TO PASS\]`))
42 Ω(session).Should(gbytes.Say(`a full timeline a flaky test retries a few times`))
43 Ω(session).Should(gbytes.Say(`Report Entries >>`))
44 Ω(session).Should(gbytes.Say(`a report! - `))
45 Ω(session).Should(gbytes.Say(` Of great value`))
46 Ω(session).Should(gbytes.Say(`a report! - `))
47 Ω(session).Should(gbytes.Say(` Of great value`))
48 Ω(session).Should(gbytes.Say(`a report! - `))
49 Ω(session).Should(gbytes.Say(` Of great value`))
50 Ω(session).Should(gbytes.Say(`<< Report Entries`))
51 Ω(session).Should(gbytes.Say(denoter + ` \[TIMEDOUT\]`))
52 Ω(session).Should(gbytes.Say(`a full timeline a test with multiple failures \[It\] times out`))
53 Ω(session).Should(gbytes.Say(`Timeline >>`))
54 Ω(session).Should(gbytes.Say(`STEP: waiting...`))
55 Ω(session).Should(gbytes.Say(`\[TIMEDOUT] in \[It\]`))
56 Ω(session).Should(gbytes.Say(`then failing!`))
57 Ω(session).Should(gbytes.Say(`\[FAILED\] in \[It\]`))
58 Ω(session).Should(gbytes.Say(`\[PANICKED\] in \[AfterEach\]`))
59 Ω(session).Should(gbytes.Say(`<< Timeline`))
60 Ω(session).Should(gbytes.Say(`\[TIMEDOUT\] A node timeout occurred`))
61 Ω(session).Should(gbytes.Say(`This is the Progress Report generated when the node timeout occurred:`))
62 Ω(session).Should(gbytes.Say(`>.*<-ctx.Done\(\)`))
63 Ω(session).Should(gbytes.Say(`\[FAILED\] A node timeout occurred and then the following failure was recorded in the timedout node before it exited:`))
64 Ω(session).Should(gbytes.Say(`welp`))
65 Ω(session).Should(gbytes.Say(`In \[It\] at:`))
66 Ω(session).Should(gbytes.Say(`There were additional failures detected. To view them in detail run ginkgo -vv`))
67 Ω(session).Should(gbytes.Say(denoter))
68 Ω(session).Should(gbytes.Say(`Summarizing 1 Failure:`))
69 Ω(session).Should(gbytes.Say(`\[TIMEDOUT\]`))
70 })
71 }
72 })
73
74 Context("when running with -v", func() {
75 It("should emit a timeline", func() {
76 session := startGinkgo(fm.PathTo("timeline"), "--no-color", "--seed=17", "-v")
77 Eventually(session).Should(gexec.Exit(1))
78
79 Ω(session).Should(gbytes.Say(`3 specs`))
80
81 Ω(session).Should(gbytes.Say(`a full timeline a flaky test retries a few times`))
82 Ω(session).Should(gbytes.Say(`STEP: logging some events`))
83 Ω(session).Should(gbytes.Say(`hello!`))
84 Ω(session).Should(gbytes.Say(`a report!`))
85 Ω(session).Should(gbytes.Say(` Of great value`))
86 Ω(session).Should(gbytes.Say(`let's try...`))
87 Ω(session).Should(gbytes.Say(`\[FAILED\] in \[It\]`))
88 Ω(session).Should(gbytes.Say(`STEP: cleaning up a bit`))
89 Ω(session).Should(gbytes.Say(`all done!`))
90 Ω(session).Should(gbytes.Say(`Attempt #1 Failed. Retrying ` + retryDenoter))
91
92 Ω(session).Should(gbytes.Say(`STEP: logging some events`))
93 Ω(session).Should(gbytes.Say(`hello!`))
94 Ω(session).Should(gbytes.Say(`a report!`))
95 Ω(session).Should(gbytes.Say(` Of great value`))
96 Ω(session).Should(gbytes.Say(`let's try...`))
97 Ω(session).Should(gbytes.Say(`\[FAILED\] in \[It\]`))
98 Ω(session).Should(gbytes.Say(`STEP: cleaning up a bit`))
99 Ω(session).Should(gbytes.Say(`all done!`))
100 Ω(session).Should(gbytes.Say(`Attempt #2 Failed. Retrying ` + retryDenoter))
101
102 Ω(session).Should(gbytes.Say(`STEP: logging some events`))
103 Ω(session).Should(gbytes.Say(`hello!`))
104 Ω(session).Should(gbytes.Say(`a report!`))
105 Ω(session).Should(gbytes.Say(` Of great value`))
106 Ω(session).Should(gbytes.Say(`let's try...`))
107 Ω(session).Should(gbytes.Say(`hooray!`))
108 Ω(session).Should(gbytes.Say(`feeling sleepy...`))
109 Ω(session).Should(gbytes.Say(`Automatically polling progress`))
110 Ω(session).Should(gbytes.Say(`>\s*time\.Sleep\(time.Millisecond \* 200\)`))
111 Ω(session).Should(gbytes.Say(`STEP: cleaning up a bit`))
112 Ω(session).Should(gbytes.Say(`all done!`))
113 Ω(session).Should(gbytes.Say(retryDenoter + ` \[FLAKEY TEST - TOOK 3 ATTEMPTS TO PASS\]`))
114
115 Ω(session).Should(gbytes.Say(`a full timeline a test with multiple failures \[It\] times out`))
116 Ω(session).Should(gbytes.Say(`\[TIMEDOUT\] A node timeout occurred`))
117 Ω(session).Should(gbytes.Say(`This is the Progress Report generated when the node timeout occurred:`))
118 Ω(session).Should(gbytes.Say(`>\s*<-ctx\.Done\(\)`))
119 Ω(session).Should(gbytes.Say(`\[FAILED\] A node timeout occurred and then the following failure was recorded in the timedout node before it exited:`))
120 Ω(session).Should(gbytes.Say(`welp`))
121 Ω(session).Should(gbytes.Say(`In \[It\]`))
122 Ω(session).Should(gbytes.Say(`There were additional failures detected. To view them in detail run ginkgo -vv`))
123
124 Ω(session).Should(gbytes.Say(`a full timeline passes happily`))
125 Ω(session).Should(gbytes.Say(`a verbose-only report`))
126 Ω(session).ShouldNot(gbytes.Say(`a hidden report`))
127 Ω(session).Should(gbytes.Say(denoter))
128
129 Ω(session).Should(gbytes.Say(`Summarizing 1 Failure:`))
130 Ω(session).Should(gbytes.Say(`\[TIMEDOUT\]`))
131 })
132 })
133
134 Context("when running with -vv", func() {
135 It("should emit a timeline", func() {
136 session := startGinkgo(fm.PathTo("timeline"), "--no-color", "--seed=17", "-vv")
137 Eventually(session).Should(gexec.Exit(1))
138
139 Ω(session).Should(gbytes.Say(`3 specs`))
140
141 Ω(session).Should(gbytes.Say(`a full timeline\n`))
142 Ω(session).Should(gbytes.Say(`a flaky test\n`))
143 Ω(session).Should(gbytes.Say(`retries a few times\n`))
144 Ω(session).Should(gbytes.Say(`> Enter \[BeforeEach\] a flaky test`))
145 Ω(session).Should(gbytes.Say(`STEP: logging some events`))
146 Ω(session).Should(gbytes.Say(`hello!`))
147 Ω(session).Should(gbytes.Say(`a report!`))
148 Ω(session).Should(gbytes.Say(` Of great value`))
149 Ω(session).Should(gbytes.Say(`< Exit \[BeforeEach\] a flaky test`))
150 Ω(session).Should(gbytes.Say(`let's try...`))
151 Ω(session).Should(gbytes.Say(`\[FAILED\] bam!`))
152 Ω(session).Should(gbytes.Say(`In \[It\]`))
153 Ω(session).Should(gbytes.Say(`STEP: cleaning up a bit`))
154 Ω(session).Should(gbytes.Say(`all done!`))
155 Ω(session).Should(gbytes.Say(`END STEP: cleaning up a bit`))
156 Ω(session).Should(gbytes.Say(`Attempt #1 Failed. Retrying ` + retryDenoter))
157
158 Ω(session).Should(gbytes.Say(`STEP: logging some events`))
159 Ω(session).Should(gbytes.Say(`hello!`))
160 Ω(session).Should(gbytes.Say(`a report!`))
161 Ω(session).Should(gbytes.Say(` Of great value`))
162 Ω(session).Should(gbytes.Say(`let's try...`))
163 Ω(session).Should(gbytes.Say(`\[FAILED\] bam!`))
164 Ω(session).Should(gbytes.Say(`In \[It\]`))
165 Ω(session).Should(gbytes.Say(`STEP: cleaning up a bit`))
166 Ω(session).Should(gbytes.Say(`all done!`))
167 Ω(session).Should(gbytes.Say(`Attempt #2 Failed. Retrying ` + retryDenoter))
168
169 Ω(session).Should(gbytes.Say(`STEP: logging some events`))
170 Ω(session).Should(gbytes.Say(`hello!`))
171 Ω(session).Should(gbytes.Say(`a report!`))
172 Ω(session).Should(gbytes.Say(` Of great value`))
173 Ω(session).Should(gbytes.Say(`let's try...`))
174 Ω(session).Should(gbytes.Say(`hooray!`))
175 Ω(session).Should(gbytes.Say(`feeling sleepy...`))
176 Ω(session).Should(gbytes.Say(`Automatically polling progress`))
177 Ω(session).Should(gbytes.Say(`>\s*time\.Sleep\(time.Millisecond \* 200\)`))
178 Ω(session).Should(gbytes.Say(`STEP: cleaning up a bit`))
179 Ω(session).Should(gbytes.Say(`all done!`))
180 Ω(session).Should(gbytes.Say(retryDenoter + ` \[FLAKEY TEST - TOOK 3 ATTEMPTS TO PASS\]`))
181
182 Ω(session).Should(gbytes.Say(`times out`))
183 Ω(session).Should(gbytes.Say(`\[TIMEDOUT\] A node timeout occurred`))
184 Ω(session).Should(gbytes.Say(`This is the Progress Report generated when the node timeout occurred:`))
185 Ω(session).Should(gbytes.Say(`>\s*<-ctx\.Done\(\)`))
186 Ω(session).Should(gbytes.Say(`\[FAILED\] A node timeout occurred and then the following failure was recorded in the timedout node before it exited:`))
187 Ω(session).Should(gbytes.Say(`welp`))
188 Ω(session).Should(gbytes.Say(`In \[It\]`))
189 Ω(session).Should(gbytes.Say(`\[PANICKED\] Test Panicked`))
190 Ω(session).Should(gbytes.Say(`aaah!`))
191 Ω(session).Should(gbytes.Say(`Full Stack Trace`))
192 Ω(session).Should(gbytes.Say(denoter + ` \[TIMEDOUT\]`))
193
194 Ω(session).Should(gbytes.Say(`passes happily`))
195 Ω(session).Should(gbytes.Say(`> Enter \[It\] passes happily`))
196 Ω(session).Should(gbytes.Say(`a verbose-only report`))
197 Ω(session).ShouldNot(gbytes.Say(`a hidden report`))
198 Ω(session).Should(gbytes.Say(`< Exit \[It\] passes happily`))
199 Ω(session).Should(gbytes.Say(denoter))
200
201 Ω(session).Should(gbytes.Say(`Summarizing 1 Failure:`))
202 Ω(session).Should(gbytes.Say(`\[TIMEDOUT\]`))
203 })
204 })
205
206 Context("when running with -v in parallel", func() {
207 It("should emit a timeline", func() {
208 session := startGinkgo(fm.PathTo("timeline"), "--no-color", "--seed=17", "-v", "-nodes=2")
209 Eventually(session).Should(gexec.Exit(1))
210
211 Ω(session).Should(gbytes.Say(`3 specs`))
212
213 Ω(session).Should(gbytes.Say(retryDenoter + ` \[FLAKEY TEST - TOOK 3 ATTEMPTS TO PASS\]`))
214 Ω(session).Should(gbytes.Say(`STEP: logging some events`))
215 Ω(session).Should(gbytes.Say(`hello!`))
216 Ω(session).Should(gbytes.Say(`a report!`))
217 Ω(session).Should(gbytes.Say(` Of great value`))
218 Ω(session).Should(gbytes.Say(`let's try...`))
219 Ω(session).Should(gbytes.Say(`\[FAILED\] in \[It\]`))
220 Ω(session).Should(gbytes.Say(`STEP: cleaning up a bit`))
221 Ω(session).Should(gbytes.Say(`all done!`))
222 Ω(session).Should(gbytes.Say(`Attempt #1 Failed. Retrying ` + retryDenoter))
223
224 Ω(session).Should(gbytes.Say(`STEP: logging some events`))
225 Ω(session).Should(gbytes.Say(`hello!`))
226 Ω(session).Should(gbytes.Say(`a report!`))
227 Ω(session).Should(gbytes.Say(` Of great value`))
228 Ω(session).Should(gbytes.Say(`let's try...`))
229 Ω(session).Should(gbytes.Say(`\[FAILED\] in \[It\]`))
230 Ω(session).Should(gbytes.Say(`STEP: cleaning up a bit`))
231 Ω(session).Should(gbytes.Say(`all done!`))
232 Ω(session).Should(gbytes.Say(`Attempt #2 Failed. Retrying ` + retryDenoter))
233
234 Ω(session).Should(gbytes.Say(`STEP: logging some events`))
235 Ω(session).Should(gbytes.Say(`hello!`))
236 Ω(session).Should(gbytes.Say(`a report!`))
237 Ω(session).Should(gbytes.Say(` Of great value`))
238 Ω(session).Should(gbytes.Say(`let's try...`))
239 Ω(session).Should(gbytes.Say(`hooray!`))
240 Ω(session).Should(gbytes.Say(`feeling sleepy...`))
241 Ω(session).Should(gbytes.Say(`Automatically polling progress`))
242 Ω(session).Should(gbytes.Say(`>\s*time\.Sleep\(time.Millisecond \* 200\)`))
243 Ω(session).Should(gbytes.Say(`STEP: cleaning up a bit`))
244 Ω(session).Should(gbytes.Say(`all done!`))
245
246 Ω(session).Should(gbytes.Say(`a full timeline a test with multiple failures \[It\] times out`))
247 Ω(session).Should(gbytes.Say(`\[TIMEDOUT\] A node timeout occurred`))
248 Ω(session).Should(gbytes.Say(`This is the Progress Report generated when the node timeout occurred:`))
249 Ω(session).Should(gbytes.Say(`>\s*<-ctx\.Done\(\)`))
250 Ω(session).Should(gbytes.Say(`\[FAILED\] A node timeout occurred and then the following failure was recorded in the timedout node before it exited:`))
251 Ω(session).Should(gbytes.Say(`welp`))
252 Ω(session).Should(gbytes.Say(`In \[It\]`))
253 Ω(session).Should(gbytes.Say(`There were additional failures detected. To view them in detail run ginkgo -vv`))
254
255 Ω(session).Should(gbytes.Say(denoter))
256 Ω(session).Should(gbytes.Say(`a full timeline passes happily`))
257 Ω(session).Should(gbytes.Say(`a verbose-only report`))
258 Ω(session).ShouldNot(gbytes.Say(`a hidden report`))
259
260 Ω(session).Should(gbytes.Say(`Summarizing 1 Failure:`))
261 Ω(session).Should(gbytes.Say(`\[TIMEDOUT\]`))
262 })
263 })
264
265 Context("when running with -vv in parallel", func() {
266 It("should emit a timeline", func() {
267 session := startGinkgo(fm.PathTo("timeline"), "--no-color", "--seed=17", "-vv", "-nodes=2")
268 Eventually(session).Should(gexec.Exit(1))
269
270 Ω(session).Should(gbytes.Say(`3 specs`))
271
272 Ω(session).Should(gbytes.Say(retryDenoter + ` \[FLAKEY TEST - TOOK 3 ATTEMPTS TO PASS\]`))
273 Ω(session).Should(gbytes.Say(`a full timeline\n`))
274 Ω(session).Should(gbytes.Say(`a flaky test\n`))
275 Ω(session).Should(gbytes.Say(`retries a few times\n`))
276 Ω(session).Should(gbytes.Say(`> Enter \[BeforeEach\] a flaky test`))
277 Ω(session).Should(gbytes.Say(`STEP: logging some events`))
278 Ω(session).Should(gbytes.Say(`hello!`))
279 Ω(session).Should(gbytes.Say(`a report!`))
280 Ω(session).Should(gbytes.Say(` Of great value`))
281 Ω(session).Should(gbytes.Say(`< Exit \[BeforeEach\] a flaky test`))
282 Ω(session).Should(gbytes.Say(`let's try...`))
283 Ω(session).Should(gbytes.Say(`\[FAILED\] Failure recorded during attempt 1:`))
284 Ω(session).Should(gbytes.Say(`bam!`))
285 Ω(session).Should(gbytes.Say(`In \[It\]`))
286 Ω(session).Should(gbytes.Say(`STEP: cleaning up a bit`))
287 Ω(session).Should(gbytes.Say(`all done!`))
288 Ω(session).Should(gbytes.Say(`END STEP: cleaning up a bit`))
289 Ω(session).Should(gbytes.Say(`Attempt #1 Failed. Retrying ` + retryDenoter))
290
291 Ω(session).Should(gbytes.Say(`STEP: logging some events`))
292 Ω(session).Should(gbytes.Say(`hello!`))
293 Ω(session).Should(gbytes.Say(`a report!`))
294 Ω(session).Should(gbytes.Say(` Of great value`))
295 Ω(session).Should(gbytes.Say(`let's try...`))
296 Ω(session).Should(gbytes.Say(`\[FAILED\] Failure recorded during attempt 2:`))
297 Ω(session).Should(gbytes.Say(`bam!`))
298 Ω(session).Should(gbytes.Say(`In \[It\]`))
299 Ω(session).Should(gbytes.Say(`STEP: cleaning up a bit`))
300 Ω(session).Should(gbytes.Say(`all done!`))
301 Ω(session).Should(gbytes.Say(`Attempt #2 Failed. Retrying ` + retryDenoter))
302
303 Ω(session).Should(gbytes.Say(`STEP: logging some events`))
304 Ω(session).Should(gbytes.Say(`hello!`))
305 Ω(session).Should(gbytes.Say(`a report!`))
306 Ω(session).Should(gbytes.Say(` Of great value`))
307 Ω(session).Should(gbytes.Say(`let's try...`))
308 Ω(session).Should(gbytes.Say(`hooray!`))
309 Ω(session).Should(gbytes.Say(`feeling sleepy...`))
310 Ω(session).Should(gbytes.Say(`Automatically polling progress`))
311 Ω(session).Should(gbytes.Say(`>\s*time\.Sleep\(time.Millisecond \* 200\)`))
312 Ω(session).Should(gbytes.Say(`STEP: cleaning up a bit`))
313 Ω(session).Should(gbytes.Say(`all done!`))
314
315 Ω(session).Should(gbytes.Say(denoter + ` \[TIMEDOUT\]`))
316 Ω(session).Should(gbytes.Say(`times out`))
317 Ω(session).Should(gbytes.Say(`\[TIMEDOUT\] A node timeout occurred`))
318 Ω(session).Should(gbytes.Say(`This is the Progress Report generated when the node timeout occurred:`))
319 Ω(session).Should(gbytes.Say(`>\s*<-ctx\.Done\(\)`))
320 Ω(session).Should(gbytes.Say(`\[FAILED\] A node timeout occurred and then the following failure was recorded in the timedout node before it exited:`))
321 Ω(session).Should(gbytes.Say(`welp`))
322 Ω(session).Should(gbytes.Say(`In \[It\]`))
323 Ω(session).Should(gbytes.Say(`\[PANICKED\] Test Panicked`))
324 Ω(session).Should(gbytes.Say(`aaah!`))
325 Ω(session).Should(gbytes.Say(`Full Stack Trace`))
326
327 Ω(session).Should(gbytes.Say(denoter))
328 Ω(session).Should(gbytes.Say(`passes happily`))
329 Ω(session).Should(gbytes.Say(`> Enter \[It\] passes happily`))
330 Ω(session).Should(gbytes.Say(`a verbose-only report`))
331 Ω(session).ShouldNot(gbytes.Say(`a hidden report`))
332 Ω(session).Should(gbytes.Say(`< Exit \[It\] passes happily`))
333
334 Ω(session).Should(gbytes.Say(`Summarizing 1 Failure:`))
335 Ω(session).Should(gbytes.Say(`\[TIMEDOUT\]`))
336 })
337 })
338 })
339
View as plain text