pm2/test/interface/remote.mocha.js

250 lines
5.7 KiB
JavaScript

process.env.NODE_ENV = 'local_test';
var PM2 = require('../..');
var should = require('should');
var nssocket = require('nssocket');
var events = require('events');
var util = require('util');
var Cipher = require('../../lib/Interactor/Cipher.js');
var cst = require('../../constants.js');
var send_cmd = new events.EventEmitter();
var meta_connect = {
secret_key : 'test-secret-key',
public_key : 'test-public-key',
machine_name : 'test-machine-name'
};
function createMockServer(cb) {
var server = nssocket.createServer(function(_socket) {
console.log('Got new connection in Mock server');
send_cmd.on('cmd', function(data) {
if (process.env.DEBUG)
console.log('Sending command %j', data);
_socket.send(data._type, data);
});
_socket.data('*', function(data) {
this.event.forEach(function(ev) {
send_cmd.emit(ev, data);
});
});
});
server.on('error', function(e) {
throw new Error(e);
});
server.on('listening', function() {
cb(null, server);
});
server.listen(4322, '0.0.0.0');
}
function startSomeApps(pm2, cb) {
pm2.start('./child.js', {instances : 4, name : 'child'}, cb);
}
describe('REMOTE PM2 ACTIONS', function() {
var server;
var interactor;
var pm2 = new PM2.custom({
independent : true,
cwd : __dirname + '/../fixtures',
secret_key : 'test-secret-key',
public_key : 'test-public-key',
machine_name : 'test-machine-name',
daemon_mode: true
});;
after(function(done) {
server.close();
pm2.destroy(done);
});
before(function(done) {
createMockServer(function(err, _server) {
console.log('Mock server created');
server = _server;
pm2.connect(function(err, _pm2) {
startSomeApps(pm2, function() {
done();
});
});
});
});
it('should send ask, receive ask:rep and identify agent', function(done) {
send_cmd.once('ask:rep', function(pck) {
var data = Cipher.decipherMessage(pck.data, meta_connect.secret_key);
data.machine_name.should.eql(meta_connect.machine_name);
done();
});
send_cmd.emit('cmd', { _type : 'ask' });
});
/**
* PM2 agent is now identified
*/
it('should act on PM2', function(done) {
send_cmd.once('trigger:pm2:result', function(pck) {
if (pck.ret.data.length > 0)
done();
else
done(new Error('wrong data rcvied'));
});
send_cmd.emit('cmd', {
_type : 'trigger:pm2:action',
method_name : 'restart',
parameters : {name : 'child' }
});
});
it('should act on PM2 but handle failure', function(done) {
send_cmd.once('trigger:pm2:result', function(pck) {
// Error is present telling process does not exists
pck.ret.err.should.not.be.null();
done();
});
send_cmd.emit('cmd', {
_type : 'trigger:pm2:action',
method_name : 'restart',
parameters : {name : 'UNKNOWN APP' }
});
});
it('should RELOAD', function(done) {
send_cmd.once('trigger:pm2:result', function(pck) {
/**
* Once remote command is finished...
*/
should(pck.ret.err).be.null();
pm2.list(function(err, ret) {
ret.forEach(function(proc) {
proc.pm2_env.restart_time.should.eql(2);
});
});
done();
});
send_cmd.emit('cmd', {
_type : 'trigger:pm2:action',
method_name : 'reload',
parameters : {name : 'child' }
});
});
it('should gracefulRELOAD', function(done) {
send_cmd.once('trigger:pm2:result', function(pck) {
/**
* Once remote command is finished...
*/
should(pck.ret.err).be.null();
pm2.list(function(err, ret) {
ret.forEach(function(proc) {
proc.pm2_env.restart_time.should.eql(3);
});
});
done();
});
send_cmd.emit('cmd', {
_type : 'trigger:pm2:action',
method_name : 'gracefulReload',
parameters : {name : 'child' }
});
});
it('should RESET metadata', function(done) {
send_cmd.once('trigger:pm2:result', function(pck) {
/**
* Once remote command is finished...
*/
should(pck.ret.err).be.null();
pm2.list(function(err, ret) {
ret.forEach(function(proc) {
proc.pm2_env.restart_time.should.eql(0);
});
});
done();
});
send_cmd.emit('cmd', {
_type : 'trigger:pm2:action',
method_name : 'reset',
parameters : {name : 'child' }
});
});
it('should delete all processes', function(done) {
pm2.delete('all', {}, function() {
startSomeApps(pm2, function() {
pm2.list(function(err, ret) {
ret.forEach(function(proc) {
proc.pm2_env.restart_time.should.eql(0);
});
done();
});
});
});
});
it('should test .remote', function(done) {
pm2.remote('restart', {
name : 'child'
}, function(err, procs) {
pm2.list(function(err, ret) {
ret.forEach(function(proc) {
proc.pm2_env.restart_time.should.eql(1);
});
done();
});
});
});
it('should test .remote and handle failure', function(done) {
pm2.remote('restart', {
name : 'UNKNOWN_NAME'
}, function(err, procs) {
pm2.list(function(err, ret) {
ret.forEach(function(proc) {
proc.pm2_env.restart_time.should.eql(1);
});
done();
});
});
});
it('should test .remote #2', function(done) {
pm2.remote('reload', {
name : 'child'
}, function(err, procs) {
pm2.list(function(err, ret) {
ret.forEach(function(proc) {
proc.pm2_env.restart_time.should.eql(2);
});
done();
});
});
});
});