97 lines
2.4 KiB
JavaScript
97 lines
2.4 KiB
JavaScript
|
if (process.argv.length === 2) {
|
||
|
var types = [ 'explicit', 'code', 'normal' ]
|
||
|
var codes = [ 0, 2, 'null' ]
|
||
|
var changes = [ 'nochange', 'change', 'code', 'twice', 'twicecode']
|
||
|
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(' '))
|
||
|
})
|
||
|
})
|
||
|
})
|
||
|
})
|
||
|
|
||
|
var results = {}
|
||
|
|
||
|
var exec = require('child_process').exec
|
||
|
run(opts.shift())
|
||
|
} else {
|
||
|
var type = process.argv[2]
|
||
|
var code = +process.argv[3]
|
||
|
var change = process.argv[4]
|
||
|
var sigexit = process.argv[5] !== 'nosigexit'
|
||
|
|
||
|
if (sigexit) {
|
||
|
var onSignalExit = require('../../')
|
||
|
onSignalExit(listener)
|
||
|
} else {
|
||
|
process.on('exit', listener)
|
||
|
}
|
||
|
|
||
|
process.on('exit', function (code) {
|
||
|
console.error('first code=%j', code)
|
||
|
})
|
||
|
|
||
|
if (change !== 'nochange') {
|
||
|
process.once('exit', function (code) {
|
||
|
console.error('set code from %j to %j', code, 5)
|
||
|
if (change === 'code' || change === 'twicecode') {
|
||
|
process.exitCode = 5
|
||
|
} else {
|
||
|
process.exit(5)
|
||
|
}
|
||
|
})
|
||
|
if (change === 'twicecode' || change === 'twice') {
|
||
|
process.once('exit', function (code) {
|
||
|
code = process.exitCode || code
|
||
|
console.error('set code from %j to %j', code, code + 1)
|
||
|
process.exit(code + 1)
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
process.on('exit', function (code) {
|
||
|
console.error('second code=%j', code)
|
||
|
})
|
||
|
|
||
|
if (type === 'explicit') {
|
||
|
if (code || code === 0) {
|
||
|
process.exit(code)
|
||
|
} else {
|
||
|
process.exit()
|
||
|
}
|
||
|
} else if (type === 'code') {
|
||
|
process.exitCode = +code || 0
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function listener (code, signal) {
|
||
|
signal = signal || null
|
||
|
console.log('%j', { code: code, signal: signal, exitCode: process.exitCode || 0 })
|
||
|
}
|
||
|
|
||
|
function run (opt) {
|
||
|
console.error(opt)
|
||
|
exec(process.execPath + ' ' + __filename + ' ' + opt, 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')
|
||
|
results[opt] = res
|
||
|
if (opts.length) {
|
||
|
run(opts.shift())
|
||
|
} else {
|
||
|
console.log(JSON.stringify(results, null, 2))
|
||
|
}
|
||
|
})
|
||
|
}
|