pm2/test/interface/interactor.connect.mocha.js

230 lines
5.7 KiB
JavaScript

process.env.NODE_ENV = 'local_test';
process.env.TRAVIS = true;
process.env.DEBUG='interface:*';
var PM2 = require('../..');
var should = require('should');
var nssocket = require('nssocket');
var events = require('events');
var util = require('util');
var axon = require('pm2-axon');
var sock = axon.socket('sub');
var pub_sock = sock.bind(8080);
var Cipher = require('../../lib/Interactor/Cipher.js');
var cst = require('../../constants.js');
var Plan = require('../helpers/plan.js');
var Configuration = require('../../lib/Configuration.js');
var Helpers = require('../helpers/apps.js');
var server = null;
var listener_server;
var _socket_list = [];
var meta_connect = {
secret_key : 'osef',
public_key : 'osef',
machine_name : 'osef'
};
/**
* Mock server receiving data
* @method forkInteractor
* @return CallExpression
*/
function createMockServer(cb) {
pub_sock.server.on('connection', function(socket) {
_socket_list.push(socket);
console.log('Got new connection on mock server');
});
server = new events.EventEmitter();
listener_server = nssocket.createServer(function(_socket) {
server.on('cmd', function(data) {
_socket.send(data._type, data);
});
_socket.data('*', function(data) {
this.event.forEach(function(ev) {
server.emit(ev, data);
});
});
});
listener_server.on('error', function(e) {
throw new Error(e);
});
listener_server.on('listening', function() {
cb(null, server);
});
listener_server.listen(4322, '0.0.0.0');
}
describe('Interactor testing', function() {
this.timeout(5000);
var server;
var interactor;
var pm2_bus;
var pm2 = new PM2.custom({
independent : true,
cwd : __dirname + '/../fixtures',
secret_key : 'osef',
public_key : 'osef',
machine_name : 'osef',
daemon_mode: true
});
before(function(done) {
Configuration.unset('pm2:passwd', function(err, data) {
createMockServer(function(err, _server) {
server = _server;
pm2.connect(function(err, data) {
Helpers.startSomeApps(pm2, function(err, dt) {
done();
});
});
});
});
});
after(function(done) {
listener_server.close();
pm2.destroy(done);
});
describe('Interactor methods', function() {
it('should display info', function(done) {
pm2.interactInfos(function(err, meta) {
meta.should.have.properties([
'machine_name',
'public_key',
'secret_key',
'socket_path',
'pm2_home_monitored'
])
meta.pm2_home_monitored.should.eql(pm2.pm2_home);
done();
});
});
});
describe('Input command / Output data checks', function() {
it('should send ask, receive ask:rep and identify agent', function(done) {
server.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();
});
server.emit('cmd', { _type : 'ask' });
});
it('should get status via PushInteractor and PM2 should be statused as not protected', function(done) {
sock.once('message', function(data) {
var dt = JSON.parse(data);
dt.public_key.should.eql('osef');
var status = dt.data.status.data;
var procs = status.process;
var server = status.server;
procs.length.should.eql(1);
var meta = dt.data.status;
should.exists(dt.sent_at);
meta.protected.should.be.false();
meta.rev_con.should.be.true();
meta.server_name.should.eql('osef');
done();
});
it('should get status via PushInteractor and PM2 should be statused as not protected', function(done) {
sock.once('message', function(data) {
var dt = JSON.parse(data);
dt.public_key.should.eql('osef');
var status = dt.data.status.data;
var procs = status.process;
var server = status.server;
procs.length.should.eql(1);
var meta = dt.data.status;
should.exists(dt.sent_at);
meta.protected.should.be.false();
meta.rev_con.should.be.true();
meta.server_name.should.eql('osef');
done();
});
});
});
describe('General behaviors', function() {
it('should receive event application restart', function(done) {
sock.once('message', function(data) {
var dt = JSON.parse(data);
var monitoring = dt.data.monitoring;
var process_event = dt.data['process:event'];
//console.log(JSON.stringify(process_event, '', 2));
done();
});
pm2.restart('all', function() {});
});
});
describe('PM2 password checking', function() {
it('should set a password', function(done) {
pm2.set('pm2:passwd', 'testpass', function(err, data) {
should.not.exists(err);
setTimeout(done, 1000);
});
});
it('should interactor be notified of password set', function(done) {
sock.once('message', function(data) {
var dt = JSON.parse(data);
// Has switched to true
dt.data.status.protected.should.be.true();
done();
});
});
});
});
describe('Offline', function() {
it('should handle offline gracefully', function(done) {
_socket_list.forEach(function(socket, i) {
_socket_list[i].destroy();
});
sock.closeSockets();
pub_sock.server.close(function() {
console.log('Server closed');
});
setTimeout(done, 500);
});
});
});