You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

209 lines
5.7 KiB

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()
})
})
})