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