diff --git a/lib/runnable.js b/lib/runnable.js index 5e0970b159..98327bf5d9 100644 --- a/lib/runnable.js +++ b/lib/runnable.js @@ -20,6 +20,8 @@ var setTimeout = global.setTimeout; var clearTimeout = global.clearTimeout; var toString = Object.prototype.toString; +var MAX_TIMEOUT = Math.pow(2, 31) - 1; + module.exports = Runnable; /** @@ -95,8 +97,7 @@ Runnable.prototype.timeout = function (ms) { } // Clamp to range - var INT_MAX = Math.pow(2, 31) - 1; - var range = [0, INT_MAX]; + var range = [0, MAX_TIMEOUT]; ms = utils.clamp(ms, range); // see #1652 for reasoning @@ -233,11 +234,8 @@ Runnable.prototype.clearTimeout = function () { */ Runnable.prototype.resetTimeout = function () { var self = this; - var ms = this.timeout(); + var ms = this.timeout() || MAX_TIMEOUT; - if (ms === 0) { - return; - } this.clearTimeout(); this.timer = setTimeout(function () { if (self.timeout() === 0) { diff --git a/test/integration/fixtures/options/timeout-unref.fixture.js b/test/integration/fixtures/options/timeout-unref.fixture.js new file mode 100644 index 0000000000..8f59aea591 --- /dev/null +++ b/test/integration/fixtures/options/timeout-unref.fixture.js @@ -0,0 +1,3 @@ +it('unrefs a timeout', function(done) { + setTimeout(done, 10).unref(); +}); diff --git a/test/integration/options/timeout.spec.js b/test/integration/options/timeout.spec.js index 83267bd02f..e3ac696e93 100644 --- a/test/integration/options/timeout.spec.js +++ b/test/integration/options/timeout.spec.js @@ -83,4 +83,15 @@ describe('--timeout', function () { } ); }); + + it("should complete tests having unref'd async behavior", function(done) { + runMochaJSON('options/timeout-unref', ['--timeout', '0'], function(err, res) { + if (err) { + done(err); + return; + } + expect(res, 'to have passed').and('to have passed test count', 1); + done(); + }); + }); }); diff --git a/test/unit/runnable.spec.js b/test/unit/runnable.spec.js index b4ae296478..598f532f80 100644 --- a/test/unit/runnable.spec.js +++ b/test/unit/runnable.spec.js @@ -702,6 +702,7 @@ describe('Runnable(title, fn)', function () { runnable.timeout(10); runnable.resetTimeout(); runnable.timeout(0); + runnable.run(); setTimeout(function () { expect(runnable.timedOut, 'to be', false); done();