diff options
-rw-r--r-- | lib/run-script.js | 8 | ||||
-rw-r--r-- | test/tap/graceful-restart.js | 118 |
2 files changed, 123 insertions, 3 deletions
diff --git a/lib/run-script.js b/lib/run-script.js index e96439859..92f8d51f2 100644 --- a/lib/run-script.js +++ b/lib/run-script.js @@ -117,9 +117,11 @@ function run (pkg, wd, cmd, args, cb) { var cmds if (cmd === "restart" && !pkg.scripts.restart) { - cmds = [ "prestop", "stop", "poststop" - , "prestart", "start", "poststart" - ] + cmds = [ + "prestop", "stop", "poststop", + "restart", + "prestart", "start", "poststart" + ] } else { if (!pkg.scripts[cmd]) { if (cmd === "test") { diff --git a/test/tap/graceful-restart.js b/test/tap/graceful-restart.js new file mode 100644 index 000000000..bd1f31144 --- /dev/null +++ b/test/tap/graceful-restart.js @@ -0,0 +1,118 @@ +var fs = require('fs') +var resolve = require('path').resolve + +var osenv = require('osenv') +var mkdirp = require('mkdirp') +var rimraf = require('rimraf') +var test = require('tap').test + +var common = require('../common-tap.js') + +var pkg = resolve(__dirname, 'graceful-restart') + +test('setup', function (t) { + bootstrap() + t.end() +}) + +test('graceless restart', function (t) { + fs.writeFileSync(resolve(pkg, 'package.json'), pjGraceless) + createChild(['run-script', 'restart'], function (err, code, out) { + t.ifError(err, 'restart finished successfully') + t.equal(code, 0, 'npm run-script exited with code') + t.equal(out, outGraceless, 'expected all scripts to run') + t.end() + }) +}) + +test('graceful restart', function (t) { + fs.writeFileSync(resolve(pkg, 'package.json'), pjGraceful) + createChild(['run-script', 'restart'], function (err, code, out) { + t.ifError(err, 'restart finished successfully') + t.equal(code, 0, 'npm run-script exited with code') + t.equal(out, outGraceful, 'expected only *restart scripts to run') + t.end() + }) +}) + +test('clean', function (t) { + cleanup() + t.end() +}) + +var outGraceless = [ + 'prerestart', + 'prestop', + 'stop', + 'poststop', + 'prestart', + 'start', + 'poststart', + 'postrestart', + '' +].join('\n') + +var outGraceful = [ + 'prerestart', + 'restart', + 'postrestart', + '' +].join('\n') + +var pjGraceless = JSON.stringify({ + name: 'graceless', + version: '1.2.3', + scripts: { + 'prestop': 'echo prestop', + 'stop': 'echo stop', + 'poststop': 'echo poststop', + 'prerestart': 'echo prerestart', + 'postrestart': 'echo postrestart', + 'prestart': 'echo prestart', + 'start': 'echo start', + 'poststart': 'echo poststart' + } +}, null, 2) + '\n' + +var pjGraceful = JSON.stringify({ + name: 'graceful', + version: '1.2.3', + scripts: { + 'prestop': 'echo prestop', + 'stop': 'echo stop', + 'poststop': 'echo poststop', + 'prerestart': 'echo prerestart', + 'restart': 'echo restart', + 'postrestart': 'echo postrestart', + 'prestart': 'echo prestart', + 'start': 'echo start', + 'poststart': 'echo poststart' + } +}, null, 2) + '\n' + +function bootstrap () { + mkdirp.sync(pkg) +} + +function cleanup () { + process.chdir(osenv.tmpdir()) + rimraf.sync(pkg) +} + +function createChild (args, cb) { + var env = { + HOME: process.env.HOME, + Path: process.env.PATH, + PATH: process.env.PATH, + 'npm_config_loglevel': 'silent' + } + + if (process.platform === 'win32') + env.npm_config_cache = '%APPDATA%\\npm-cache' + + return common.npm(args, { + cwd: pkg, + stdio: ['ignore', 'pipe', 'ignore'], + env: env + }, cb) +} |