1 | const api = require('./heroku-api')
|
2 | const cli = require('heroku-cli-util')
|
3 | const wait = require('co-wait')
|
4 | const RenderTestRuns = require('./render-test-runs')
|
5 | const TestRunStatesUtil = require('./test-run-states-util')
|
6 |
|
7 | function * 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 |
|
15 | function 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 |
|
34 | function * 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 |
|
50 |
|
51 | testNodes = yield api.testNodes(heroku, testRun.id)
|
52 | firstTestNode = testNodes[0]
|
53 |
|
54 | cli.log()
|
55 | cli.log(RenderTestRuns.printLine(testRun))
|
56 |
|
57 | return firstTestNode
|
58 | }
|
59 |
|
60 | function * displayAndExit (pipeline, number, { heroku }) {
|
61 | let testNode = yield display(pipeline, number, { heroku })
|
62 | process.exit(testNode.exit_code)
|
63 | }
|
64 |
|
65 | module.exports = {
|
66 | display,
|
67 | displayAndExit,
|
68 | waitForStates
|
69 | }
|