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.
83 lines
2.7 KiB
83 lines
2.7 KiB
var assert = require('assert'); |
|
var amqp = require('../amqp'); |
|
var exec = require('child_process').exec; |
|
|
|
var cycleServer = function (stoppedCallback, startedCallback) { |
|
// If you're running a cluster you can do this: |
|
// 'killall -9 beam.smp' |
|
// to test out hard server fails. Note however that you probably do want a |
|
// cluster because killing a single server this way causes even durable |
|
// queues to be deleted, causing the bindings we create to be removed. |
|
exec('rabbitmqctl stop_app', function () { |
|
if (stoppedCallback) { |
|
stoppedCallback(); |
|
} |
|
setTimeout(function () { |
|
// Likewise you can bring up a hard server crash this way: |
|
// 'rabbitmq-server -detached' |
|
exec('rabbitmqctl start_app', function () { |
|
console.log('start triggered'); |
|
if (startedCallback) { |
|
setTimeout(startedCallback, 500); |
|
} |
|
}); |
|
// Leave the server down for 1500ms before restarting. |
|
}, 1500); |
|
}); |
|
}; |
|
|
|
var connection, exchange; |
|
var timeout = null, didntHang = false, confirmed = 0, erroredAfterShutdown = 0; |
|
|
|
|
|
exec('which rabbitmqctl', function(err) { |
|
if (err != null) { |
|
console.log('skipping test, rabbitmqctl not availabe'); |
|
process.exit(0); |
|
} |
|
|
|
connection = amqp.createConnection(global.options || {}, { reconnect: true, reconnectBackoffTime: 500 }, function(connection) { |
|
exchange = connection.exchange('node-publish-confirms', { type: 'fanout', confirm: true }, function(exchange) { |
|
// publishing right before thhe server is stopped; must not "hang". |
|
exchange.publish("", "hello", {}, function() { |
|
console.log('callback fired for a message published right before the shutdown'); |
|
didntHang = true; |
|
}); |
|
cycleServer(function() { |
|
console.log('server stopped'); |
|
var incErrored = function(err) { console.log('received ack error'); if (err) { erroredAfterShutdown++; } }; |
|
exchange.publish("", "hello", {}, incErrored); |
|
exchange.publish("", "hello", {}, incErrored); |
|
exchange.publish("", "hello", {}, incErrored); |
|
}, function() { |
|
console.log('server started'); |
|
exchange.publish("", "hello2", {}, function() { // this one must not "hang" |
|
console.log('acked'); |
|
confirmed++; |
|
clearTimeout(timeout); |
|
connection.end(); |
|
}); |
|
}); |
|
}); |
|
}); |
|
|
|
timeout = setTimeout(function() { |
|
process.exit(); |
|
}, 15000); |
|
|
|
process.on('exit', function(){ |
|
try { |
|
assert(didntHang); |
|
assert.equal(erroredAfterShutdown, 3); |
|
assert.equal(confirmed, 1); |
|
} finally { |
|
if (exchange) { |
|
exchange.destroy(); |
|
} |
|
if (connection) { |
|
connection.setImplOptions({ 'reconnect': false }); |
|
connection.destroy(); |
|
} |
|
} |
|
}); |
|
});
|
|
|