From f6587dc6d2e5345ddfcca93976ed303de20e7e4c Mon Sep 17 00:00:00 2001 From: "Thai Pangsakulyanont @ Taskworld" Date: Tue, 10 May 2016 15:01:14 +0700 Subject: [PATCH] fix(web-server): Restart disconnected browser in non-singleRun mode. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Allow browserDisconnectTolerance config option to be set in non-singleRun mode. In some cases, the browser would get stuck in an infinite loop (e.g. because of a faulty code/test). This blocks browser’s event loop, preventing it from reporting back to Karma. Karma then considers the browser ‘DISCONNECTED’. Prior to this commit, the `browserDisconnectTolerance` option will only apply in singleRun mode. In above scenario, the end-user must restart Karma to continue running tests inside Karma-managed browsers. This commit fixes this problem by always honoring the aforementioned option. --- lib/config.js | 5 ----- lib/server.js | 42 +++++++++++++++++++++++++----------------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/lib/config.js b/lib/config.js index f2047ec4b..fb0a92216 100644 --- a/lib/config.js +++ b/lib/config.js @@ -145,11 +145,6 @@ var normalizeConfig = function (config, configFilePath) { config.autoWatch = false } - if (!config.singleRun && config.browserDisconnectTolerance) { - log.debug('browserDisconnectTolerance set to 0, because of singleRun') - config.browserDisconnectTolerance = 0 - } - if (helper.isString(config.reporters)) { config.reporters = config.reporters.split(',') } diff --git a/lib/server.js b/lib/server.js index a0fdf369c..2d96cb35a 100644 --- a/lib/server.js +++ b/lib/server.js @@ -292,26 +292,34 @@ Server.prototype._start = function (config, launcher, preprocess, fileList, webS } } - if (config.singleRun) { - self.on('browser_complete', function (completedBrowser) { - if (completedBrowser.lastResult.disconnected && - completedBrowser.disconnectsCount <= config.browserDisconnectTolerance) { - self.log.info('Restarting %s (%d of %d attempts)', completedBrowser.name, - completedBrowser.disconnectsCount, config.browserDisconnectTolerance) - if (!launcher.restart(completedBrowser.id)) { - singleRunDoneBrowsers[completedBrowser.id] = true - emitRunCompleteIfAllBrowsersDone() - } - } else { - singleRunDoneBrowsers[completedBrowser.id] = true + self.on('browser_complete', function (completedBrowser) { + if (completedBrowser.lastResult.disconnected && + completedBrowser.disconnectsCount <= config.browserDisconnectTolerance) { + self.log.info('Restarting %s (%d of %d attempts)', completedBrowser.name, + completedBrowser.disconnectsCount, config.browserDisconnectTolerance) + + if (!launcher.restart(completedBrowser.id)) { + self.emit('browser_restart_failure', completedBrowser) + } + } else { + self.emit('browser_complete_with_no_more_retries', completedBrowser) + } + }) - if (launcher.kill(completedBrowser.id)) { - // workaround to supress "disconnect" warning - completedBrowser.state = Browser.STATE_DISCONNECTED - } + if (config.singleRun) { + self.on('browser_restart_failure', function (completedBrowser) { + singleRunDoneBrowsers[completedBrowser.id] = true + emitRunCompleteIfAllBrowsersDone() + }) + self.on('browser_complete_with_no_more_retries', function (completedBrowser) { + singleRunDoneBrowsers[completedBrowser.id] = true - emitRunCompleteIfAllBrowsersDone() + if (launcher.kill(completedBrowser.id)) { + // workaround to supress "disconnect" warning + completedBrowser.state = Browser.STATE_DISCONNECTED } + + emitRunCompleteIfAllBrowsersDone() }) self.on('browser_process_failure', function (browserLauncher) {