diff --git a/lib/server.js b/lib/server.js index a5dbe74e9..0c91bdbf3 100644 --- a/lib/server.js +++ b/lib/server.js @@ -184,6 +184,7 @@ Server.prototype._start = function (config, launcher, preprocess, fileList, var noLoadErrors = self.loadErrors.length if (noLoadErrors > 0) { self.log.error('Found %d load error%s', noLoadErrors, noLoadErrors === 1 ? '' : 's') + process.exitCode = 1 process.kill(process.pid, 'SIGINT') } }) @@ -392,7 +393,9 @@ Server.prototype._start = function (config, launcher, preprocess, fileList, }) } - processWrapper.on('SIGINT', disconnectBrowsers) + processWrapper.on('SIGINT', function () { + disconnectBrowsers(process.exitCode) + }) processWrapper.on('SIGTERM', disconnectBrowsers) // Handle all unhandled exceptions, so we don't just exit but diff --git a/test/unit/server.spec.js b/test/unit/server.spec.js index 2ba89dee9..722cb80f7 100644 --- a/test/unit/server.spec.js +++ b/test/unit/server.spec.js @@ -81,7 +81,7 @@ describe('server', () => { callback && callback() }), removeAllListeners: () => {}, - close: () => {} + close: sinon.spy(callback => callback && callback()) } sinon.stub(server._injector, 'get') @@ -195,6 +195,22 @@ describe('server', () => { server.emit('browser_register', {}) expect(browsersReady).to.have.been.called }) + + it('should exit with error exit code on load errors', (done) => { + mockProcess(process) + + server._start(mockConfig, mockLauncher, null, mockFileList, browserCollection, mockExecutor, (exitCode) => { + expect(exitCode).to.have.equal(1) + done() + }) + + server.loadErrors.push(['TestError', 'Test']) + fileListOnResolve() + + function mockProcess (process) { + sinon.stub(process, 'kill', (pid, ev) => process.emit(ev)) + } + }) }) describe.skip('singleRun', () => {