diff --git a/lib/server.js b/lib/server.js index 045c4fee0..426f49e27 100644 --- a/lib/server.js +++ b/lib/server.js @@ -263,6 +263,11 @@ class Server extends KarmaEventEmitter { } }) + this.on('stop', function (done) { + this.log.debug('Received stop event, exiting.') + return disconnectBrowsers().then(done) + }) + if (config.singleRun) { this.on('browser_restart_failure', (completedBrowser) => { singleRunDoneBrowsers[completedBrowser.id] = true @@ -327,14 +332,17 @@ class Server extends KarmaEventEmitter { done(code || 0) } - this.emitAsync('exit').then(() => { - socketServer.sockets.removeAllListeners() - socketServer.close() - const closeTimeout = setTimeout(removeAllListeners, webServerCloseTimeout) + return this.emitAsync('exit').then(() => { + return new Promise((resolve, reject) => { + socketServer.sockets.removeAllListeners() + socketServer.close() + const closeTimeout = setTimeout(removeAllListeners, webServerCloseTimeout) - webServer.close(() => { - clearTimeout(closeTimeout) - removeAllListeners() + webServer.close(() => { + clearTimeout(closeTimeout) + removeAllListeners() + resolve() + }) }) }) } @@ -373,6 +381,10 @@ class Server extends KarmaEventEmitter { child.unref() } + stop () { + return this.emitAsync('stop') + } + static start (cliOptions, done) { console.warn('Deprecated static method to be removed in v3.0') return new Server(cliOptions, done).start() diff --git a/test/unit/server.spec.js b/test/unit/server.spec.js index fcd2f9b61..18e38a44a 100644 --- a/test/unit/server.spec.js +++ b/test/unit/server.spec.js @@ -152,6 +152,25 @@ describe('server', () => { }) }) + describe('start on watch mode', () => { + var config + beforeEach(() => { + config = { port: 9876, listenAddress: '127.0.0.1', singleRun: false } + sinon.spy(BundleUtils, 'bundleResourceIfNotExist') + sinon.stub(NetUtils, 'bindAvailablePort').resolves(mockBoundServer) + sinon.stub(mockBoundServer, 'address').returns({ port: 9877 }) + sinon + .stub(server, 'get') + .withArgs('config').returns(config) + }) + + it('should exit gracefully', (done) => { + server.start() + .then(() => server.stop()) + .then(() => done()) + }) + }) + // ============================================================================ // server._start() // ============================================================================