Skip to content
Permalink
ffd96b38fb
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
0 contributors

Users who have contributed to this file

208 lines (177 sloc) 5.65 KB
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()
})
})
})