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.

210 lines
5.7 KiB

var makeTest = require('./context')
var Bottleneck = require('./bottleneck')
var assert = require('assert')
describe('Batcher', function () {
var c
afterEach(function () {
return c.limiter.disconnect(false)
})
it('Should batch by time and size', function () {
c = makeTest()
var batcher = new Bottleneck.Batcher({
maxTime: 50,
maxSize: 3
})
var t0 = Date.now()
var batches = []
batcher.on('batch', function (batcher) {
batches.push(batcher)
})
return Promise.all([
batcher.add(1).then((x) => c.limiter.schedule(c.promise, null, Date.now() - t0, 1)),
batcher.add(2).then((x) => c.limiter.schedule(c.promise, null, Date.now() - t0, 2)),
batcher.add(3).then((x) => c.limiter.schedule(c.promise, null, Date.now() - t0, 3)),
batcher.add(4).then((x) => c.limiter.schedule(c.promise, null, Date.now() - t0, 4)),
batcher.add(5).then((x) => c.limiter.schedule(c.promise, null, Date.now() - t0, 5))
])
.then(function (data) {
c.mustEqual(
data.map((([t, x]) => [Math.floor(t / 50), x])),
[[0, 1], [0, 2], [0, 3], [1, 4], [1, 5]]
)
return c.last()
})
.then(function (results) {
c.checkDuration(50, 20)
c.mustEqual(batches, [[1, 2, 3], [4, 5]])
})
})
it('Should batch by time', function () {
c = makeTest()
var batcher = new Bottleneck.Batcher({
maxTime: 50
})
var t0 = Date.now()
var batches = []
batcher.on('batch', function (batcher) {
batches.push(batcher)
})
return Promise.all([
batcher.add(1).then((x) => c.limiter.schedule(c.promise, null, Date.now() - t0, 1)),
batcher.add(2).then((x) => c.limiter.schedule(c.promise, null, Date.now() - t0, 2))
])
.then(function (data) {
c.mustEqual(
data.map((([t, x]) => [Math.floor(t / 50), x])),
[[1, 1], [1, 2]]
)
return Promise.all([
batcher.add(3).then((x) => c.limiter.schedule(c.promise, null, Date.now() - t0, 3)),
batcher.add(4).then((x) => c.limiter.schedule(c.promise, null, Date.now() - t0, 4))
])
})
.then(function (data) {
c.mustEqual(
data.map((([t, x]) => [Math.floor(t / 50), x])),
[[2, 3], [2, 4]]
)
return c.last()
})
.then(function (results) {
c.checkDuration(100)
c.mustEqual(batches, [[1, 2], [3, 4]])
})
})
it('Should batch by size', function () {
c = makeTest()
var batcher = new Bottleneck.Batcher({
maxSize: 2
})
var batches = []
batcher.on('batch', function (batcher) {
batches.push(batcher)
})
return Promise.all([
batcher.add(1).then((x) => c.limiter.schedule(c.promise, null, 1)),
batcher.add(2).then((x) => c.limiter.schedule(c.promise, null, 2))
])
.then(function () {
return Promise.all([
batcher.add(3).then((x) => c.limiter.schedule(c.promise, null, 3)),
batcher.add(4).then((x) => c.limiter.schedule(c.promise, null, 4))
])
})
.then(c.last)
.then(function (results) {
c.checkDuration(0)
c.mustEqual(batches, [[1, 2], [3, 4]])
})
})
it('Should stagger flushes', function () {
c = makeTest()
var batcher = new Bottleneck.Batcher({
maxTime: 50,
maxSize: 3
})
var t0 = Date.now()
var batches = []
batcher.on('batch', function (batcher) {
batches.push(batcher)
})
return Promise.all([
batcher.add(1).then((x) => c.limiter.schedule(c.promise, null, Date.now() - t0, 1)),
batcher.add(2).then((x) => c.limiter.schedule(c.promise, null, Date.now() - t0, 2))
])
.then(function (data) {
c.mustEqual(
data.map((([t, x]) => [Math.floor(t / 50), x])),
[[1, 1], [1, 2]]
)
var promises = []
promises.push(batcher.add(3).then((x) => c.limiter.schedule(c.promise, null, Date.now() - t0, 3)))
return c.wait(10)
.then(function () {
promises.push(batcher.add(4).then((x) => c.limiter.schedule(c.promise, null, Date.now() - t0, 4)))
return Promise.all(promises)
})
})
.then(function (data) {
c.mustEqual(
data.map((([t, x]) => [Math.floor(t / 50), x])),
[[2, 3], [2, 4]]
)
return c.last()
})
.then(function (results) {
c.checkDuration(120, 20)
c.mustEqual(batches, [[1, 2], [3, 4]])
})
})
it('Should force then stagger flushes', function () {
c = makeTest()
var batcher = new Bottleneck.Batcher({
maxTime: 50,
maxSize: 3
})
var t0 = Date.now()
var batches = []
batcher.on('batch', function (batcher) {
batches.push(batcher)
})
var promises = []
promises.push(batcher.add(1).then((x) => c.limiter.schedule(c.promise, null, Date.now() - t0, 1)))
promises.push(batcher.add(2).then((x) => c.limiter.schedule(c.promise, null, Date.now() - t0, 2)))
return c.wait(10)
.then(function () {
promises.push(batcher.add(3).then((x) => c.limiter.schedule(c.promise, null, Date.now() - t0, 3)))
return Promise.all(promises)
})
.then(function (data) {
c.mustEqual(
data.map((([t, x]) => [Math.floor(t / 50), x])),
[[0, 1], [0, 2], [0, 3]]
)
return Promise.all([
batcher.add(4).then((x) => c.limiter.schedule(c.promise, null, Date.now() - t0, 4)),
batcher.add(5).then((x) => c.limiter.schedule(c.promise, null, Date.now() - t0, 5)),
])
})
.then(function (data) {
c.mustEqual(
data.map((([t, x]) => [Math.floor(t / 50), x])),
[[1, 4], [1, 5]]
)
return c.last()
})
.then(function (results) {
c.checkDuration(85, 25)
c.mustEqual(batches, [[1, 2, 3], [4, 5]])
})
})
})