58 lines
1.7 KiB
JavaScript
58 lines
1.7 KiB
JavaScript
var exec = require('child_process').exec,
|
|
t = require('tap')
|
|
|
|
var fixture = require.resolve('./fixtures/change-code.js')
|
|
var expect = require('./fixtures/change-code-expect.json')
|
|
|
|
// process.exitCode has problems prior to:
|
|
// https://github.com/joyent/node/commit/c0d81f90996667a658aa4403123e02161262506a
|
|
function isZero10 () {
|
|
return /^v0\.10\..+$/.test(process.version)
|
|
}
|
|
|
|
// process.exit(code), process.exitCode = code, normal exit
|
|
var types = [ 'explicit', 'normal' ]
|
|
if (!isZero10()) types.push('code')
|
|
|
|
// initial code that is set. Note, for 'normal' exit, there's no
|
|
// point doing these, because we just exit without modifying code
|
|
var codes = [ 0, 2, 'null' ]
|
|
|
|
// do not change, change to 5 with exit(), change to 5 with exitCode,
|
|
// change to 5 and then to 2 with exit(), change twice with exitcode
|
|
var changes = [ 'nochange', 'change', 'twice']
|
|
if (!isZero10()) changes.push('code', 'twicecode')
|
|
|
|
// use signal-exit, use process.on('exit')
|
|
var handlers = [ 'sigexit', 'nosigexit' ]
|
|
|
|
var opts = []
|
|
types.forEach(function (type) {
|
|
var testCodes = type === 'normal' ? [0] : codes
|
|
testCodes.forEach(function (code) {
|
|
changes.forEach(function (change) {
|
|
handlers.forEach(function (handler) {
|
|
opts.push([type, code, change, handler].join(' '))
|
|
})
|
|
})
|
|
})
|
|
})
|
|
|
|
opts.forEach(function (opt) {
|
|
t.test(opt, function (t) {
|
|
var cmd = process.execPath + ' ' + fixture + ' ' + opt
|
|
exec(cmd, function (err, stdout, stderr) {
|
|
var res = JSON.parse(stdout)
|
|
if (err) {
|
|
res.actualCode = err.code
|
|
res.actualSignal = err.signal
|
|
} else {
|
|
res.actualCode = 0
|
|
res.actualSignal = null
|
|
}
|
|
res.stderr = stderr.trim().split('\n')
|
|
t.same(res, expect[opt])
|
|
t.end()
|
|
})
|
|
})
|
|
})
|