diff --git a/test/core/stopall-peaceful-test.js b/test/core/stopall-peaceful-test.js new file mode 100644 index 00000000..f65a91d1 --- /dev/null +++ b/test/core/stopall-peaceful-test.js @@ -0,0 +1,77 @@ +/* + * start-stop-relative.js: start or stop forever using relative paths, the script path could be start with './', '../' ... + * + * (C) 2010 Charlie Robbins & the Contributors + * MIT LICENCE + * + */ + +var assert = require('assert'), + path = require('path'), + fs = require('fs'), + spawn = require('child_process').spawn, + vows = require('vows'), + forever = require('../../lib/forever'); + +function runCmd(cmd, args) { + var proc = spawn(process.execPath, [ + path.resolve(__dirname, '../../', 'bin/forever'), + cmd + ].concat(args), {detached: true}); + proc.unref(); + return proc; +} + +vows.describe('forever/core/stopall-peaceful').addBatch({ + "When using forever" : { + "to run script with 100% exit" : { + topic: function () { + runCmd('start', [ + './test/fixtures/cluster-fork-mode.js' + ]); + setTimeout(function (that) { + forever.list(false, that.callback); + }, 2000, this); + }, + "the script should be marked as `STOPPED`": function (err, procs) { + assert.isNull(err); + assert.isArray(procs); + assert.equal(procs.length, 1); + assert.ok(!procs[0].running); + } + } + } +}).addBatch({ + "When the script is running" : { + "try to stop all" : { + topic: function () { + var that = this; + forever.list(false, function(err, procs){ + assert.isNull(err); + assert.isArray(procs); + assert.equal(procs.length, 1); + // get pid. + var pid = procs[0].pid; + // run command + var cmd = runCmd('stopall', []); + cmd.stdout.on('data', onData); + //listen on the `data` event. + function onData(data){ + // check whether pid exists or not. + var line = data.toString().replace (/[\n\r\t\s]+/g, ' '); + if(line && line.search(new RegExp(pid)) > 0){ + that.callback(null, true); + cmd.stdout.removeListener('data', onData); + } + // if pid did not exist, that means CLI has crashed, and no output was printed. + // vows will raise an Asynchronous Error. + } + }); + }, + "the shut down should works fine": function (err, peaceful) { + assert.isNull(err); + assert.ok(peaceful); + } + } + } +}).export(module); \ No newline at end of file diff --git a/test/core/stopbypid-peaceful-test.js b/test/core/stopbypid-peaceful-test.js new file mode 100644 index 00000000..a2c8f9b4 --- /dev/null +++ b/test/core/stopbypid-peaceful-test.js @@ -0,0 +1,77 @@ +/* + * start-stop-relative.js: start or stop forever using relative paths, the script path could be start with './', '../' ... + * + * (C) 2010 Charlie Robbins & the Contributors + * MIT LICENCE + * + */ + +var assert = require('assert'), + path = require('path'), + fs = require('fs'), + spawn = require('child_process').spawn, + vows = require('vows'), + forever = require('../../lib/forever'); + +function runCmd(cmd, args) { + var proc = spawn(process.execPath, [ + path.resolve(__dirname, '../../', 'bin/forever'), + cmd + ].concat(args), {detached: true}); + proc.unref(); + return proc; +} + +vows.describe('forever/core/stopbypid-peaceful').addBatch({ + "When using forever" : { + "to run script with 100% exit" : { + topic: function () { + runCmd('start', [ + './test/fixtures/cluster-fork-mode.js' + ]); + setTimeout(function (that) { + forever.list(false, that.callback); + }, 2000, this); + }, + "the script should be marked as `STOPPED`": function (err, procs) { + assert.isNull(err); + assert.isArray(procs); + assert.equal(procs.length, 1); + assert.ok(!procs[0].running); + } + } + } +}).addBatch({ + "When the script is running" : { + "try to stop by pid" : { + topic: function () { + var that = this; + forever.list(false, function(err, procs){ + assert.isNull(err); + assert.isArray(procs); + assert.equal(procs.length, 1); + // get pid. + var pid = procs[0].pid; + // run command + var cmd = runCmd('stop', [pid]); + cmd.stdout.on('data', onData); + //listen on the `data` event. + function onData(data){ + // check whether pid exists or not. + var line = data.toString().replace (/[\n\r\t\s]+/g, ' '); + if(line && line.search(new RegExp(pid)) > 0){ + that.callback(null, true); + cmd.stdout.removeListener('data', onData); + } + // if pid did not exist, that means CLI has crashed, and no output was printed. + // vows will raise an Asynchronous Error. + } + }); + }, + "the shut down should works fine": function (err, peaceful) { + assert.isNull(err); + assert.ok(peaceful); + } + } + } +}).export(module); \ No newline at end of file diff --git a/test/fixtures/cluster-fork-mode.js b/test/fixtures/cluster-fork-mode.js new file mode 100644 index 00000000..5b4490e0 --- /dev/null +++ b/test/fixtures/cluster-fork-mode.js @@ -0,0 +1,2 @@ +var cluster = require('cluster'); +console.log(cluster.isMaster ? 'master fork':'cluster fork'); \ No newline at end of file