1 | var http = require('http')
|
2 |
|
3 | var constant = require('./constants')
|
4 | var helper = require('./helper')
|
5 | var cfg = require('./config')
|
6 | var logger = require('./logger')
|
7 | var log = logger.create('runner')
|
8 |
|
9 | var parseExitCode = function (buffer, defaultCode, failOnEmptyTestSuite) {
|
10 | var tailPos = buffer.length - Buffer.byteLength(constant.EXIT_CODE) - 2
|
11 |
|
12 | if (tailPos < 0) {
|
13 | return {exitCode: defaultCode, buffer: buffer}
|
14 | }
|
15 |
|
16 |
|
17 | var tail = buffer.slice(tailPos)
|
18 | var tailStr = tail.toString()
|
19 | if (tailStr.substr(0, tailStr.length - 2) === constant.EXIT_CODE) {
|
20 | var emptyInt = parseInt(tailStr.substr(-2, 1), 10)
|
21 | var exitCode = parseInt(tailStr.substr(-1), 10)
|
22 | if (failOnEmptyTestSuite === false && emptyInt === 0) {
|
23 | log.warn('Test suite was empty.')
|
24 | exitCode = 0
|
25 | }
|
26 | return {exitCode: exitCode, buffer: buffer.slice(0, tailPos)}
|
27 | }
|
28 |
|
29 | return {exitCode: defaultCode, buffer: buffer}
|
30 | }
|
31 |
|
32 |
|
33 | exports.run = function (config, done) {
|
34 | done = helper.isFunction(done) ? done : process.exit
|
35 | config = cfg.parseConfig(config.configFile, config)
|
36 |
|
37 | var exitCode = 1
|
38 | var options = {
|
39 | hostname: config.hostname,
|
40 | path: config.urlRoot + 'run',
|
41 | port: config.port,
|
42 | method: 'POST',
|
43 | headers: {
|
44 | 'Content-Type': 'application/json'
|
45 | }
|
46 | }
|
47 |
|
48 | var request = http.request(options, function (response) {
|
49 | response.on('data', function (buffer) {
|
50 | var parsedResult = parseExitCode(buffer, exitCode, config.failOnEmptyTestSuite)
|
51 | exitCode = parsedResult.exitCode
|
52 | process.stdout.write(parsedResult.buffer)
|
53 | })
|
54 |
|
55 | response.on('end', function () {
|
56 | done(exitCode)
|
57 | })
|
58 | })
|
59 |
|
60 | request.on('error', function (e) {
|
61 | if (e.code === 'ECONNREFUSED') {
|
62 | log.error('There is no server listening on port %d', options.port)
|
63 | done(1, e.code)
|
64 | } else {
|
65 | throw e
|
66 | }
|
67 | })
|
68 |
|
69 | request.end(JSON.stringify({
|
70 | args: config.clientArgs,
|
71 | removedFiles: config.removedFiles,
|
72 | changedFiles: config.changedFiles,
|
73 | addedFiles: config.addedFiles,
|
74 | refresh: config.refresh
|
75 | }))
|
76 | }
|