UNPKG

2.24 kBJavaScriptView Raw
1var http = require('http')
2
3var constant = require('./constants')
4var helper = require('./helper')
5var cfg = require('./config')
6var logger = require('./logger')
7var log = logger.create('runner')
8
9var 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 // tail buffer which might contain the message
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// TODO(vojta): read config file (port, host, urlRoot)
33exports.run = function (config, done) {
34 config = config || {}
35
36 logger.setupFromConfig(config)
37
38 done = helper.isFunction(done) ? done : process.exit
39 config = cfg.parseConfig(config.configFile, config)
40
41 var exitCode = 1
42 var options = {
43 hostname: config.hostname,
44 path: config.urlRoot + 'run',
45 port: config.port,
46 method: 'POST',
47 headers: {
48 'Content-Type': 'application/json'
49 }
50 }
51
52 var request = http.request(options, function (response) {
53 response.on('data', function (buffer) {
54 var parsedResult = parseExitCode(buffer, exitCode, config.failOnEmptyTestSuite)
55 exitCode = parsedResult.exitCode
56 process.stdout.write(parsedResult.buffer)
57 })
58
59 response.on('end', function () {
60 done(exitCode)
61 })
62 })
63
64 request.on('error', function (e) {
65 if (e.code === 'ECONNREFUSED') {
66 log.error('There is no server listening on port %d', options.port)
67 done(1, e.code)
68 } else {
69 throw e
70 }
71 })
72
73 request.end(JSON.stringify({
74 args: config.clientArgs,
75 removedFiles: config.removedFiles,
76 changedFiles: config.changedFiles,
77 addedFiles: config.addedFiles,
78 refresh: config.refresh,
79 colors: config.colors
80 }))
81}