/test/deprecated/interactor.mocha.js

https://gitlab.com/yousafsyed/pm2 · JavaScript · 241 lines · 158 code · 49 blank · 34 comment · 4 complexity · 4b9c77b77ec93ffe651185f43ee6f221 MD5 · raw file

  1. var should = require('should');
  2. var ipm2 = require('pm2-interface');
  3. var util = require('util');
  4. var axon = require('axon');
  5. var sock = axon.socket('sub');
  6. var cst = require('../../constants.js');
  7. var Plan = require('../helpers/plan.js');
  8. var nssocket = require('nssocket');
  9. var Ipm2 = require('pm2-interface');
  10. var APPS = require('../helpers/apps.js');
  11. /**
  12. * Description
  13. * @method forkPM2
  14. * @return pm2
  15. */
  16. function forkPM2() {
  17. var pm2 = require('child_process').fork('lib/Satan.js', [], {
  18. detached : true
  19. });
  20. pm2.unref();
  21. return pm2;
  22. }
  23. /**
  24. * Description
  25. * @method forkInteractor
  26. * @return CallExpression
  27. */
  28. function forkInteractor() {
  29. return require('child_process').fork('lib/Interactor.js', [], {
  30. env : util._extend({
  31. PM2_MACHINE_NAME : 'test',
  32. PM2_SECRET_KEY : 'toto',
  33. PM2_PUBLIC_KEY : 'tg',
  34. PM2_DEBUG : true,
  35. NODE_ENV : 'test' // Permit to disable encryption
  36. }, process.env)
  37. });
  38. }
  39. /**
  40. * Description
  41. * @method bufferContain
  42. * @param {} buffer
  43. * @param {} event
  44. * @return contain
  45. */
  46. function bufferContain(buffer, event) {
  47. var contain = false;
  48. buffer.data.buffer.forEach(function(dt) {
  49. if (dt.event == event)
  50. contain = dt;
  51. });
  52. return contain;
  53. }
  54. describe.skip('Interactor', function() {
  55. var pm2;
  56. var interactor;
  57. var ipm2;
  58. var socket;
  59. var server;
  60. after(function() {
  61. server.close();
  62. });
  63. it('should fork PM2', function(done) {
  64. try {
  65. pm2 = APPS.forkPM2();
  66. } catch(e) {
  67. done();
  68. }
  69. done();
  70. });
  71. it('should start mock NSSOCKER interface', function(done) {
  72. server = nssocket.createServer(function (_socket) {
  73. console.log('new connection');
  74. socket = _socket;
  75. });
  76. server.listen(cst.REMOTE_REVERSE_PORT);
  77. done();
  78. });
  79. describe('External interaction', function() {
  80. beforeEach(function(done) {
  81. ipm2 = Ipm2();
  82. ipm2.once('ready', function() {
  83. done();
  84. });
  85. });
  86. afterEach(function() {
  87. ipm2.disconnect();
  88. });
  89. it('should fork Interactor', function(done) {
  90. sock.bind(3900);
  91. interactor = forkInteractor();
  92. done();
  93. });
  94. it('should receive an intervaled message (sent every sec)', function(done) {
  95. sock.once('message', function(raw_data) {
  96. var data = JSON.parse(raw_data);
  97. data.should.have.properties(['public_key', 'sent_at', 'data']);
  98. data.data.buffer.length.should.eql(2); // Include monitoring and server data
  99. done();
  100. });
  101. });
  102. var cur_id = 0;
  103. it('should on application start, buffer contain a process:online event', function(done) {
  104. sock.once('message', function(raw_data) {
  105. var data = JSON.parse(raw_data);
  106. if (bufferContain(data, 'process:online')) {
  107. done();
  108. }
  109. });
  110. APPS.launchApp(ipm2, 'echo.js', 'echo', function(err, proc) {
  111. should(err).be.null;
  112. proc.length.should.eql(1);
  113. proc[0].pm2_env.status.should.eql('online');
  114. });
  115. });
  116. it('should on launch custom action', function(done) {
  117. APPS.launchApp(ipm2, 'events/custom_action.js', 'custom_action', function(err, proc) {
  118. cur_id = proc[1].pm2_env.pm_id;
  119. should(err).be.null;
  120. setTimeout(function() {
  121. ipm2.rpc.getMonitorData({}, function(err, procs) {
  122. should(err).be.null;
  123. console.log(procs);
  124. procs.length.should.eql(2);
  125. procs[1].pm2_env.restart_time.should.eql(0);
  126. done();
  127. });
  128. }, 1000);
  129. });
  130. });
  131. it('should get information about instance', function(done) {
  132. socket.send('ask');
  133. socket.data('ask:rep', function (data) {
  134. data.success.should.eql.true;
  135. data.machine_name.should.eql('test');
  136. data.public_key.should.eql('tg');
  137. done();
  138. });
  139. });
  140. it('should trigger action like remote AXM', function(done) {
  141. var plan = new Plan(2, done);
  142. /**
  143. * Description
  144. * @method rcv
  145. * @param {} raw_data
  146. * @return
  147. */
  148. function rcv(raw_data) {
  149. var data = JSON.parse(raw_data);
  150. var ret;
  151. //console.log(data.data.buffer);
  152. if ((ret = bufferContain(data, 'axm:reply'))) {
  153. ret.should.have.properties([
  154. 'event', 'process_id', 'process_name', 'data', 'at'
  155. ]);
  156. ret.data.data.success.should.be.true;
  157. sock.removeListener('message', rcv);
  158. plan.ok(true);
  159. }
  160. }
  161. // 2 - He should then receive an axm:reply on completion
  162. sock.on('message', rcv);
  163. socket.send('trigger:action', {
  164. process_id : cur_id,
  165. action_name : 'refresh:db',
  166. type : 'remote_action'
  167. });
  168. socket.data('trigger:action:success', function() {
  169. console.log('Action has been sent');
  170. plan.ok(true);
  171. });
  172. socket.data('trigger:action:failure', function(e) {
  173. console.log(e);
  174. throw new Error(e);
  175. });
  176. });
  177. // it('should remove all socket data and stuff if server disconnect', function(done) {
  178. // server.close();
  179. // server = nssocket.createServer(function (_socket) {
  180. // console.log('new connection');
  181. // socket = _socket;
  182. // done();
  183. // });
  184. // server.listen(cst.REMOTE_REVERSE_PORT);
  185. // });
  186. it('should kill alive processes', function(done) {
  187. process.kill(pm2.pid);
  188. process.kill(interactor.pid);
  189. done();
  190. });
  191. });
  192. });