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
7.3 KiB
209 lines
7.3 KiB
/*globals describe: false, |
|
it: false, |
|
fsq: false, |
|
async: false, |
|
QlobberFSQ: false, |
|
fsq_dir: false, |
|
flags: false, |
|
expect: false, |
|
msg_dir: false, |
|
sum: false, |
|
crypto: false, |
|
beforeEach: false, |
|
afterEach: false, |
|
single_supported: false */ |
|
/*jslint node: true */ |
|
"use strict"; |
|
|
|
describe('multiple queues', function () |
|
{ |
|
var interval_handle; |
|
|
|
beforeEach(function () |
|
{ |
|
interval_handle = setInterval(function () |
|
{ |
|
console.log('still alive'); |
|
}, 60 * 1000); |
|
}); |
|
|
|
afterEach(function () |
|
{ |
|
clearInterval(interval_handle); |
|
}); |
|
|
|
function publish_to_queues(name, num_queues, num_messages, max_message_size, get_single) |
|
{ |
|
it('should publish to multiple queues (' + name + ', num_queues=' + num_queues + ', num_messages=' + num_messages + ', max_message_size=' + max_message_size + ')', function (done) |
|
{ |
|
var timeout = 60 * 60 * 1000, |
|
num_single = 0, |
|
num_multi = 0, |
|
count_single = 0, |
|
count_multi = 0, |
|
the_fsqs, |
|
checksum = 0, |
|
expected_checksum = 0; |
|
|
|
this.timeout(timeout); |
|
|
|
fsq.stop_watching(function () |
|
{ |
|
/*jslint unparam: true */ |
|
async.times(num_queues, function (n, cb) |
|
{ |
|
var fsq = new QlobberFSQ({ fsq_dir: fsq_dir, flags: flags }), |
|
qcount = 0; |
|
|
|
fsq.subscribe('foo', function (data, info, cb) |
|
{ |
|
expect(info.topic).to.equal('foo'); |
|
if (typeof get_single === 'boolean') |
|
{ |
|
expect(info.single).to.equal(get_single); |
|
} |
|
expect(info.path.lastIndexOf(msg_dir, 0)).to.equal(0); |
|
expect(info.fname.lastIndexOf(new Buffer('foo').toString('hex') + '@', 0)).to.equal(0); |
|
|
|
checksum += sum(data); |
|
|
|
qcount += 1; |
|
|
|
if (get_single === false) |
|
{ |
|
expect(qcount).to.be.at.most(num_multi); |
|
} |
|
|
|
if (info.single) |
|
{ |
|
count_single += 1; |
|
} |
|
else |
|
{ |
|
count_multi += 1; |
|
} |
|
|
|
//console.log(count_single, num_single); |
|
//console.log(count_multi, num_multi * num_queues); |
|
|
|
if (the_fsqs && |
|
(count_single === num_single) && |
|
(count_multi === num_multi * num_queues)) |
|
{ |
|
async.each(the_fsqs, function (fsq, cb) |
|
{ |
|
fsq.stop_watching(cb); |
|
}, function () |
|
{ |
|
expect(checksum).to.be.above(0); |
|
expect(checksum).to.equal(expected_checksum); |
|
cb(null, done); |
|
}); |
|
} |
|
else |
|
{ |
|
if (count_single > num_single) |
|
{ |
|
throw new Error('single called too many times'); |
|
} |
|
|
|
if (count_multi > num_multi * num_queues) |
|
{ |
|
throw new Error('multi called too many times'); |
|
} |
|
|
|
cb(); |
|
} |
|
}); |
|
|
|
fsq.on('start', function () |
|
{ |
|
cb(null, fsq); |
|
}); |
|
}, function (err, fsqs) |
|
{ |
|
if (err) { return done(err); } |
|
|
|
expect(fsqs.length).to.equal(num_queues); |
|
|
|
var messages = [], i; |
|
|
|
for (i = 0; i < num_messages; i += 1) |
|
{ |
|
messages[i] = i; |
|
} |
|
|
|
async.eachLimit(messages, 50, function (n, cb) |
|
{ |
|
var single = typeof get_single === 'boolean' ? get_single : get_single(), |
|
data = crypto.randomBytes(Math.round(Math.random() * max_message_size)), |
|
check = sum(data); |
|
|
|
if (single) |
|
{ |
|
num_single += 1; |
|
expected_checksum += check; |
|
} |
|
else |
|
{ |
|
num_multi += 1; |
|
expected_checksum += check * num_queues; |
|
} |
|
|
|
fsqs[Math.floor(Math.random() * num_queues)].publish( |
|
'foo', |
|
data, |
|
{ ttl: timeout, single: single, encoding: null }, |
|
cb); |
|
}, function (err) |
|
{ |
|
if (err) { return done(err); } |
|
expect(num_single + num_multi).to.equal(num_messages); |
|
|
|
if ((count_single === num_single) && |
|
(count_multi === num_multi * num_queues)) |
|
{ |
|
return async.each(fsqs, function (fsq, cb) |
|
{ |
|
fsq.stop_watching(cb); |
|
}, function () |
|
{ |
|
expect(checksum).to.be.above(0); |
|
expect(checksum).to.equal(expected_checksum); |
|
done(); |
|
}); |
|
} |
|
|
|
the_fsqs = fsqs; |
|
}); |
|
}); |
|
/*jslint unparam: false */ |
|
}); |
|
}); |
|
} |
|
|
|
function publish_to_queues2(num_queues, num_messages, max_message_size) |
|
{ |
|
publish_to_queues('multi', num_queues, num_messages, max_message_size, false); |
|
if (single_supported) |
|
{ |
|
publish_to_queues('single', num_queues, num_messages, max_message_size, true); |
|
publish_to_queues('mixed', num_queues, num_messages, max_message_size, |
|
function () |
|
{ |
|
return Math.random() < 0.5; |
|
}); |
|
} |
|
} |
|
|
|
function publish_to_queues3(num_queues, max_message_size) |
|
{ |
|
publish_to_queues2(num_queues, 150, max_message_size); |
|
publish_to_queues2(num_queues, 1500, max_message_size); |
|
publish_to_queues2(num_queues, 15000, max_message_size); |
|
} |
|
|
|
publish_to_queues3(1, 200 * 1024); |
|
publish_to_queues3(10, 100 * 1024); |
|
publish_to_queues3(50, 20 * 1024); |
|
});
|
|
|