UNPKG

1.97 kBJavaScriptView Raw
1const api = require('./heroku-api')
2const cli = require('heroku-cli-util')
3const wait = require('co-wait')
4const RenderTestRuns = require('./render-test-runs')
5const TestRunStatesUtil = require('./test-run-states-util')
6
7function * waitForStates (states, testRun, { heroku }) {
8 while (!states.includes(testRun.status)) {
9 testRun = yield api.testRun(heroku, testRun.pipeline.id, testRun.number)
10 yield wait(1000)
11 }
12 return testRun
13}
14
15function stream (url) {
16 return new Promise((resolve, reject) => {
17 const request = api.logStream(url, (output) => {
18 output.on('data', (data) => {
19 if (data.toString() === new Buffer('\0').toString()) {
20 request.abort()
21 resolve()
22 }
23 })
24
25 output.on('end', () => resolve())
26
27 output.on('error', (e) => reject(e))
28
29 output.pipe(process.stdout)
30 })
31 })
32}
33
34function * display (pipeline, number, { heroku }) {
35 let testRun = yield api.testRun(heroku, pipeline.id, number)
36 let testNodes = yield api.testNodes(heroku, testRun.id)
37 let firstTestNode = testNodes[0]
38
39 testRun = yield waitForStates(TestRunStatesUtil.BUILDING_STATES, testRun, { heroku })
40
41 yield stream(firstTestNode.setup_stream_url)
42
43 testRun = yield waitForStates(TestRunStatesUtil.RUNNING_STATES, testRun, { heroku })
44
45 yield stream(firstTestNode.output_stream_url)
46
47 testRun = yield waitForStates(TestRunStatesUtil.TERMINAL_STATES, testRun, { heroku })
48
49 // At this point, we know that testRun has a finished status,
50 // and we can check for exit_code from firstTestNode
51 testNodes = yield api.testNodes(heroku, testRun.id)
52 firstTestNode = testNodes[0]
53
54 cli.log(/* newline 💃 */)
55 cli.log(RenderTestRuns.printLine(testRun))
56
57 return firstTestNode
58}
59
60function * displayAndExit (pipeline, number, { heroku }) {
61 let testNode = yield display(pipeline, number, { heroku })
62 process.exit(testNode.exit_code)
63}
64
65module.exports = {
66 display,
67 displayAndExit,
68 waitForStates
69}