diff --git a/lib/server.js b/lib/server.js index 045c4fee0..a804a4974 100644 --- a/lib/server.js +++ b/lib/server.js @@ -302,6 +302,11 @@ class Server extends KarmaEventEmitter { } executor.schedule() }) + + this.on('stop', function (done) { + this.log.debug('Exiting.') + return disconnectBrowsers().then(done) + }) } const webServerCloseTimeout = 3000 @@ -327,7 +332,7 @@ class Server extends KarmaEventEmitter { done(code || 0) } - this.emitAsync('exit').then(() => { + return this.emitAsync('exit').then(() => new Promise((resolve, reject) => { socketServer.sockets.removeAllListeners() socketServer.close() const closeTimeout = setTimeout(removeAllListeners, webServerCloseTimeout) @@ -335,8 +340,9 @@ class Server extends KarmaEventEmitter { webServer.close(() => { clearTimeout(closeTimeout) removeAllListeners() + resolve() }) - }) + })) } processWrapper.on('SIGINT', () => disconnectBrowsers(process.exitCode)) @@ -373,6 +379,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() // ============================================================================