Skip to content

Commit f6587dc

Browse files
committed
fix(web-server): Restart disconnected browser in non-singleRun mode.
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.
1 parent 9a972b1 commit f6587dc

2 files changed

Lines changed: 25 additions & 22 deletions

File tree

lib/config.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -145,11 +145,6 @@ var normalizeConfig = function (config, configFilePath) {
145145
config.autoWatch = false
146146
}
147147

148-
if (!config.singleRun && config.browserDisconnectTolerance) {
149-
log.debug('browserDisconnectTolerance set to 0, because of singleRun')
150-
config.browserDisconnectTolerance = 0
151-
}
152-
153148
if (helper.isString(config.reporters)) {
154149
config.reporters = config.reporters.split(',')
155150
}

lib/server.js

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -292,26 +292,34 @@ Server.prototype._start = function (config, launcher, preprocess, fileList, webS
292292
}
293293
}
294294

295-
if (config.singleRun) {
296-
self.on('browser_complete', function (completedBrowser) {
297-
if (completedBrowser.lastResult.disconnected &&
298-
completedBrowser.disconnectsCount <= config.browserDisconnectTolerance) {
299-
self.log.info('Restarting %s (%d of %d attempts)', completedBrowser.name,
300-
completedBrowser.disconnectsCount, config.browserDisconnectTolerance)
301-
if (!launcher.restart(completedBrowser.id)) {
302-
singleRunDoneBrowsers[completedBrowser.id] = true
303-
emitRunCompleteIfAllBrowsersDone()
304-
}
305-
} else {
306-
singleRunDoneBrowsers[completedBrowser.id] = true
295+
self.on('browser_complete', function (completedBrowser) {
296+
if (completedBrowser.lastResult.disconnected &&
297+
completedBrowser.disconnectsCount <= config.browserDisconnectTolerance) {
298+
self.log.info('Restarting %s (%d of %d attempts)', completedBrowser.name,
299+
completedBrowser.disconnectsCount, config.browserDisconnectTolerance)
300+
301+
if (!launcher.restart(completedBrowser.id)) {
302+
self.emit('browser_restart_failure', completedBrowser)
303+
}
304+
} else {
305+
self.emit('browser_complete_with_no_more_retries', completedBrowser)
306+
}
307+
})
307308

308-
if (launcher.kill(completedBrowser.id)) {
309-
// workaround to supress "disconnect" warning
310-
completedBrowser.state = Browser.STATE_DISCONNECTED
311-
}
309+
if (config.singleRun) {
310+
self.on('browser_restart_failure', function (completedBrowser) {
311+
singleRunDoneBrowsers[completedBrowser.id] = true
312+
emitRunCompleteIfAllBrowsersDone()
313+
})
314+
self.on('browser_complete_with_no_more_retries', function (completedBrowser) {
315+
singleRunDoneBrowsers[completedBrowser.id] = true
312316

313-
emitRunCompleteIfAllBrowsersDone()
317+
if (launcher.kill(completedBrowser.id)) {
318+
// workaround to supress "disconnect" warning
319+
completedBrowser.state = Browser.STATE_DISCONNECTED
314320
}
321+
322+
emitRunCompleteIfAllBrowsersDone()
315323
})
316324

317325
self.on('browser_process_failure', function (browserLauncher) {

0 commit comments

Comments
 (0)