var makeTest = require('./context') var Bottleneck = require('./bottleneck') var assert = require('assert') describe('Stop', function () { var c afterEach(function () { return c.limiter.disconnect(false) }) it('Should stop and drop the queue', function (done) { c = makeTest({ maxConcurrent: 2, minTime: 100, trackDoneStatus: true }) var submitFailed = false var queuedDropped = false var scheduledDropped = false var dropped = 0 c.limiter.on('dropped', function () { dropped++ }) c.pNoErrVal(c.limiter.schedule({id: '0'}, c.promise, null, 0), 0) c.pNoErrVal(c.limiter.schedule({id: '1'}, c.slowPromise, 100, null, 1), 1) c.limiter.schedule({id: '2'}, c.promise, null, 2) .catch(function (err) { c.mustEqual(err.message, 'Dropped!') scheduledDropped = true }) c.limiter.schedule({id: '3'}, c.promise, null, 3) .catch(function (err) { c.mustEqual(err.message, 'Dropped!') queuedDropped = true }) setTimeout(function () { var counts = c.limiter.counts() c.mustEqual(counts.RECEIVED, 0) c.mustEqual(counts.QUEUED, 1) c.mustEqual(counts.RUNNING, 1) c.mustEqual(counts.EXECUTING, 1) c.mustEqual(counts.DONE, 1) c.limiter.stop({ enqueueErrorMessage: 'Stopped!', dropErrorMessage: 'Dropped!' }) .then(function () { counts = c.limiter.counts() c.mustEqual(submitFailed, true) c.mustEqual(scheduledDropped, true) c.mustEqual(queuedDropped, true) c.mustEqual(dropped, 2) c.mustEqual(counts.RECEIVED, 0) c.mustEqual(counts.QUEUED, 0) c.mustEqual(counts.RUNNING, 0) c.mustEqual(counts.EXECUTING, 0) c.mustEqual(counts.DONE, 2) c.checkResultsOrder([[0], [1]]) done() }) c.limiter.schedule(() => Promise.resolve(true)) .catch(function (err) { c.mustEqual(err.message, 'Stopped!') submitFailed = true }) }, 125) }) it('Should stop and let the queue finish', function (done) { c = makeTest({ maxConcurrent: 1, minTime: 100, trackDoneStatus: true }) var submitFailed = false var dropped = 0 c.limiter.on('dropped', function () { dropped++ }) c.pNoErrVal(c.limiter.schedule({id: '1'}, c.promise, null, 1), 1) c.pNoErrVal(c.limiter.schedule({id: '2'}, c.promise, null, 2), 2) c.pNoErrVal(c.limiter.schedule({id: '3'}, c.slowPromise, 100, null, 3), 3) setTimeout(function () { var counts = c.limiter.counts() c.mustEqual(counts.RECEIVED, 0) c.mustEqual(counts.QUEUED, 1) c.mustEqual(counts.RUNNING, 1) c.mustEqual(counts.EXECUTING, 0) c.mustEqual(counts.DONE, 1) c.limiter.stop({ enqueueErrorMessage: 'Stopped!', dropWaitingJobs: false }) .then(function () { counts = c.limiter.counts() c.mustEqual(submitFailed, true) c.mustEqual(dropped, 0) c.mustEqual(counts.RECEIVED, 0) c.mustEqual(counts.QUEUED, 0) c.mustEqual(counts.RUNNING, 0) c.mustEqual(counts.EXECUTING, 0) c.mustEqual(counts.DONE, 4) c.checkResultsOrder([[1], [2], [3]]) done() }) c.limiter.schedule(() => Promise.resolve(true)) .catch(function (err) { c.mustEqual(err.message, 'Stopped!') submitFailed = true }) }, 75) }) it('Should still resolve when rejectOnDrop is false', function (done) { c = makeTest({ maxConcurrent: 1, minTime: 100, rejectOnDrop: false }) c.pNoErrVal(c.limiter.schedule({id: '1'}, c.promise, null, 1), 1) c.pNoErrVal(c.limiter.schedule({id: '2'}, c.promise, null, 2), 2) c.pNoErrVal(c.limiter.schedule({id: '3'}, c.slowPromise, 100, null, 3), 3) c.limiter.stop() .then(function () { return c.limiter.stop() }) .then(function () { done(new Error("Should not be here")) }) .catch(function (err) { c.mustEqual(err.message, "stop() has already been called") done() }) }) it('Should not allow calling stop() twice when dropWaitingJobs=true', function (done) { c = makeTest({ maxConcurrent: 1, minTime: 100 }) var failed = 0 var handler = function (err) { c.mustEqual(err.message, "This limiter has been stopped.") failed++ } c.pNoErrVal(c.limiter.schedule({id: '1'}, c.promise, null, 1), 1).catch(handler) c.pNoErrVal(c.limiter.schedule({id: '2'}, c.promise, null, 2), 2).catch(handler) c.pNoErrVal(c.limiter.schedule({id: '3'}, c.slowPromise, 100, null, 3), 3).catch(handler) c.limiter.stop({ dropWaitingJobs: true }) .then(function () { return c.limiter.stop({ dropWaitingJobs: true }) }) .then(function () { done(new Error("Should not be here")) }) .catch(function (err) { c.mustEqual(err.message, "stop() has already been called") c.mustEqual(failed, 3) done() }) }) it('Should not allow calling stop() twice when dropWaitingJobs=false', function (done) { c = makeTest({ maxConcurrent: 1, minTime: 100 }) c.pNoErrVal(c.limiter.schedule({id: '1'}, c.promise, null, 1), 1) c.pNoErrVal(c.limiter.schedule({id: '2'}, c.promise, null, 2), 2) c.pNoErrVal(c.limiter.schedule({id: '3'}, c.slowPromise, 100, null, 3), 3) c.limiter.stop({ dropWaitingJobs: false }) .then(function () { return c.limiter.stop({ dropWaitingJobs: false }) }) .then(function () { done(new Error("Should not be here")) }) .catch(function (err) { c.mustEqual(err.message, "stop() has already been called") done() }) }) })