UNPKG

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