11cb0ef41Sopenharmony_ci'use strict'; 21cb0ef41Sopenharmony_ciconst common = require('../common'); 31cb0ef41Sopenharmony_ciconst assert = require('assert'); 41cb0ef41Sopenharmony_ciconst spawnSync = require('child_process').spawnSync; 51cb0ef41Sopenharmony_ciconst signals = require('os').constants.signals; 61cb0ef41Sopenharmony_ciconst rootUser = common.isWindows ? false : 71cb0ef41Sopenharmony_ci common.isIBMi ? true : process.getuid() === 0; 81cb0ef41Sopenharmony_ci 91cb0ef41Sopenharmony_ciconst invalidArgTypeError = { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' }; 101cb0ef41Sopenharmony_ciconst invalidRangeError = { code: 'ERR_OUT_OF_RANGE', name: 'RangeError' }; 111cb0ef41Sopenharmony_ci 121cb0ef41Sopenharmony_cifunction pass(option, value) { 131cb0ef41Sopenharmony_ci // Run the command with the specified option. Since it's not a real command, 141cb0ef41Sopenharmony_ci // spawnSync() should run successfully but return an ENOENT error. 151cb0ef41Sopenharmony_ci const child = spawnSync('not_a_real_command', { [option]: value }); 161cb0ef41Sopenharmony_ci 171cb0ef41Sopenharmony_ci assert.strictEqual(child.error.code, 'ENOENT'); 181cb0ef41Sopenharmony_ci} 191cb0ef41Sopenharmony_ci 201cb0ef41Sopenharmony_cifunction fail(option, value, message) { 211cb0ef41Sopenharmony_ci assert.throws(() => { 221cb0ef41Sopenharmony_ci spawnSync('not_a_real_command', { [option]: value }); 231cb0ef41Sopenharmony_ci }, message); 241cb0ef41Sopenharmony_ci} 251cb0ef41Sopenharmony_ci 261cb0ef41Sopenharmony_ci{ 271cb0ef41Sopenharmony_ci // Validate the cwd option 281cb0ef41Sopenharmony_ci pass('cwd', undefined); 291cb0ef41Sopenharmony_ci pass('cwd', null); 301cb0ef41Sopenharmony_ci pass('cwd', __dirname); 311cb0ef41Sopenharmony_ci fail('cwd', 0, invalidArgTypeError); 321cb0ef41Sopenharmony_ci fail('cwd', 1, invalidArgTypeError); 331cb0ef41Sopenharmony_ci fail('cwd', true, invalidArgTypeError); 341cb0ef41Sopenharmony_ci fail('cwd', false, invalidArgTypeError); 351cb0ef41Sopenharmony_ci fail('cwd', [], invalidArgTypeError); 361cb0ef41Sopenharmony_ci fail('cwd', {}, invalidArgTypeError); 371cb0ef41Sopenharmony_ci fail('cwd', common.mustNotCall(), invalidArgTypeError); 381cb0ef41Sopenharmony_ci} 391cb0ef41Sopenharmony_ci 401cb0ef41Sopenharmony_ci{ 411cb0ef41Sopenharmony_ci // Validate the detached option 421cb0ef41Sopenharmony_ci pass('detached', undefined); 431cb0ef41Sopenharmony_ci pass('detached', null); 441cb0ef41Sopenharmony_ci pass('detached', true); 451cb0ef41Sopenharmony_ci pass('detached', false); 461cb0ef41Sopenharmony_ci fail('detached', 0, invalidArgTypeError); 471cb0ef41Sopenharmony_ci fail('detached', 1, invalidArgTypeError); 481cb0ef41Sopenharmony_ci fail('detached', __dirname, invalidArgTypeError); 491cb0ef41Sopenharmony_ci fail('detached', [], invalidArgTypeError); 501cb0ef41Sopenharmony_ci fail('detached', {}, invalidArgTypeError); 511cb0ef41Sopenharmony_ci fail('detached', common.mustNotCall(), invalidArgTypeError); 521cb0ef41Sopenharmony_ci} 531cb0ef41Sopenharmony_ci 541cb0ef41Sopenharmony_ciif (!common.isWindows) { 551cb0ef41Sopenharmony_ci { 561cb0ef41Sopenharmony_ci // Validate the uid option 571cb0ef41Sopenharmony_ci if (!rootUser) { 581cb0ef41Sopenharmony_ci pass('uid', undefined); 591cb0ef41Sopenharmony_ci pass('uid', null); 601cb0ef41Sopenharmony_ci pass('uid', process.getuid()); 611cb0ef41Sopenharmony_ci fail('uid', __dirname, invalidArgTypeError); 621cb0ef41Sopenharmony_ci fail('uid', true, invalidArgTypeError); 631cb0ef41Sopenharmony_ci fail('uid', false, invalidArgTypeError); 641cb0ef41Sopenharmony_ci fail('uid', [], invalidArgTypeError); 651cb0ef41Sopenharmony_ci fail('uid', {}, invalidArgTypeError); 661cb0ef41Sopenharmony_ci fail('uid', common.mustNotCall(), invalidArgTypeError); 671cb0ef41Sopenharmony_ci fail('uid', NaN, invalidArgTypeError); 681cb0ef41Sopenharmony_ci fail('uid', Infinity, invalidArgTypeError); 691cb0ef41Sopenharmony_ci fail('uid', 3.1, invalidArgTypeError); 701cb0ef41Sopenharmony_ci fail('uid', -3.1, invalidArgTypeError); 711cb0ef41Sopenharmony_ci } 721cb0ef41Sopenharmony_ci } 731cb0ef41Sopenharmony_ci 741cb0ef41Sopenharmony_ci { 751cb0ef41Sopenharmony_ci // Validate the gid option 761cb0ef41Sopenharmony_ci if (process.getgid() !== 0) { 771cb0ef41Sopenharmony_ci pass('gid', undefined); 781cb0ef41Sopenharmony_ci pass('gid', null); 791cb0ef41Sopenharmony_ci pass('gid', process.getgid()); 801cb0ef41Sopenharmony_ci fail('gid', __dirname, invalidArgTypeError); 811cb0ef41Sopenharmony_ci fail('gid', true, invalidArgTypeError); 821cb0ef41Sopenharmony_ci fail('gid', false, invalidArgTypeError); 831cb0ef41Sopenharmony_ci fail('gid', [], invalidArgTypeError); 841cb0ef41Sopenharmony_ci fail('gid', {}, invalidArgTypeError); 851cb0ef41Sopenharmony_ci fail('gid', common.mustNotCall(), invalidArgTypeError); 861cb0ef41Sopenharmony_ci fail('gid', NaN, invalidArgTypeError); 871cb0ef41Sopenharmony_ci fail('gid', Infinity, invalidArgTypeError); 881cb0ef41Sopenharmony_ci fail('gid', 3.1, invalidArgTypeError); 891cb0ef41Sopenharmony_ci fail('gid', -3.1, invalidArgTypeError); 901cb0ef41Sopenharmony_ci } 911cb0ef41Sopenharmony_ci } 921cb0ef41Sopenharmony_ci} 931cb0ef41Sopenharmony_ci 941cb0ef41Sopenharmony_ci{ 951cb0ef41Sopenharmony_ci // Validate the shell option 961cb0ef41Sopenharmony_ci pass('shell', undefined); 971cb0ef41Sopenharmony_ci pass('shell', null); 981cb0ef41Sopenharmony_ci pass('shell', false); 991cb0ef41Sopenharmony_ci fail('shell', 0, invalidArgTypeError); 1001cb0ef41Sopenharmony_ci fail('shell', 1, invalidArgTypeError); 1011cb0ef41Sopenharmony_ci fail('shell', [], invalidArgTypeError); 1021cb0ef41Sopenharmony_ci fail('shell', {}, invalidArgTypeError); 1031cb0ef41Sopenharmony_ci fail('shell', common.mustNotCall(), invalidArgTypeError); 1041cb0ef41Sopenharmony_ci} 1051cb0ef41Sopenharmony_ci 1061cb0ef41Sopenharmony_ci{ 1071cb0ef41Sopenharmony_ci // Validate the argv0 option 1081cb0ef41Sopenharmony_ci pass('argv0', undefined); 1091cb0ef41Sopenharmony_ci pass('argv0', null); 1101cb0ef41Sopenharmony_ci pass('argv0', 'myArgv0'); 1111cb0ef41Sopenharmony_ci fail('argv0', 0, invalidArgTypeError); 1121cb0ef41Sopenharmony_ci fail('argv0', 1, invalidArgTypeError); 1131cb0ef41Sopenharmony_ci fail('argv0', true, invalidArgTypeError); 1141cb0ef41Sopenharmony_ci fail('argv0', false, invalidArgTypeError); 1151cb0ef41Sopenharmony_ci fail('argv0', [], invalidArgTypeError); 1161cb0ef41Sopenharmony_ci fail('argv0', {}, invalidArgTypeError); 1171cb0ef41Sopenharmony_ci fail('argv0', common.mustNotCall(), invalidArgTypeError); 1181cb0ef41Sopenharmony_ci} 1191cb0ef41Sopenharmony_ci 1201cb0ef41Sopenharmony_ci{ 1211cb0ef41Sopenharmony_ci // Validate the windowsHide option 1221cb0ef41Sopenharmony_ci pass('windowsHide', undefined); 1231cb0ef41Sopenharmony_ci pass('windowsHide', null); 1241cb0ef41Sopenharmony_ci pass('windowsHide', true); 1251cb0ef41Sopenharmony_ci pass('windowsHide', false); 1261cb0ef41Sopenharmony_ci fail('windowsHide', 0, invalidArgTypeError); 1271cb0ef41Sopenharmony_ci fail('windowsHide', 1, invalidArgTypeError); 1281cb0ef41Sopenharmony_ci fail('windowsHide', __dirname, invalidArgTypeError); 1291cb0ef41Sopenharmony_ci fail('windowsHide', [], invalidArgTypeError); 1301cb0ef41Sopenharmony_ci fail('windowsHide', {}, invalidArgTypeError); 1311cb0ef41Sopenharmony_ci fail('windowsHide', common.mustNotCall(), invalidArgTypeError); 1321cb0ef41Sopenharmony_ci} 1331cb0ef41Sopenharmony_ci 1341cb0ef41Sopenharmony_ci{ 1351cb0ef41Sopenharmony_ci // Validate the windowsVerbatimArguments option 1361cb0ef41Sopenharmony_ci pass('windowsVerbatimArguments', undefined); 1371cb0ef41Sopenharmony_ci pass('windowsVerbatimArguments', null); 1381cb0ef41Sopenharmony_ci pass('windowsVerbatimArguments', true); 1391cb0ef41Sopenharmony_ci pass('windowsVerbatimArguments', false); 1401cb0ef41Sopenharmony_ci fail('windowsVerbatimArguments', 0, invalidArgTypeError); 1411cb0ef41Sopenharmony_ci fail('windowsVerbatimArguments', 1, invalidArgTypeError); 1421cb0ef41Sopenharmony_ci fail('windowsVerbatimArguments', __dirname, invalidArgTypeError); 1431cb0ef41Sopenharmony_ci fail('windowsVerbatimArguments', [], invalidArgTypeError); 1441cb0ef41Sopenharmony_ci fail('windowsVerbatimArguments', {}, invalidArgTypeError); 1451cb0ef41Sopenharmony_ci fail('windowsVerbatimArguments', common.mustNotCall(), invalidArgTypeError); 1461cb0ef41Sopenharmony_ci} 1471cb0ef41Sopenharmony_ci 1481cb0ef41Sopenharmony_ci{ 1491cb0ef41Sopenharmony_ci // Validate the timeout option 1501cb0ef41Sopenharmony_ci pass('timeout', undefined); 1511cb0ef41Sopenharmony_ci pass('timeout', null); 1521cb0ef41Sopenharmony_ci pass('timeout', 1); 1531cb0ef41Sopenharmony_ci pass('timeout', 0); 1541cb0ef41Sopenharmony_ci fail('timeout', -1, invalidRangeError); 1551cb0ef41Sopenharmony_ci fail('timeout', true, invalidRangeError); 1561cb0ef41Sopenharmony_ci fail('timeout', false, invalidRangeError); 1571cb0ef41Sopenharmony_ci fail('timeout', __dirname, invalidRangeError); 1581cb0ef41Sopenharmony_ci fail('timeout', [], invalidRangeError); 1591cb0ef41Sopenharmony_ci fail('timeout', {}, invalidRangeError); 1601cb0ef41Sopenharmony_ci fail('timeout', common.mustNotCall(), invalidRangeError); 1611cb0ef41Sopenharmony_ci fail('timeout', NaN, invalidRangeError); 1621cb0ef41Sopenharmony_ci fail('timeout', Infinity, invalidRangeError); 1631cb0ef41Sopenharmony_ci fail('timeout', 3.1, invalidRangeError); 1641cb0ef41Sopenharmony_ci fail('timeout', -3.1, invalidRangeError); 1651cb0ef41Sopenharmony_ci} 1661cb0ef41Sopenharmony_ci 1671cb0ef41Sopenharmony_ci{ 1681cb0ef41Sopenharmony_ci // Validate the maxBuffer option 1691cb0ef41Sopenharmony_ci pass('maxBuffer', undefined); 1701cb0ef41Sopenharmony_ci pass('maxBuffer', null); 1711cb0ef41Sopenharmony_ci pass('maxBuffer', 1); 1721cb0ef41Sopenharmony_ci pass('maxBuffer', 0); 1731cb0ef41Sopenharmony_ci pass('maxBuffer', Infinity); 1741cb0ef41Sopenharmony_ci pass('maxBuffer', 3.14); 1751cb0ef41Sopenharmony_ci fail('maxBuffer', -1, invalidRangeError); 1761cb0ef41Sopenharmony_ci fail('maxBuffer', NaN, invalidRangeError); 1771cb0ef41Sopenharmony_ci fail('maxBuffer', -Infinity, invalidRangeError); 1781cb0ef41Sopenharmony_ci fail('maxBuffer', true, invalidRangeError); 1791cb0ef41Sopenharmony_ci fail('maxBuffer', false, invalidRangeError); 1801cb0ef41Sopenharmony_ci fail('maxBuffer', __dirname, invalidRangeError); 1811cb0ef41Sopenharmony_ci fail('maxBuffer', [], invalidRangeError); 1821cb0ef41Sopenharmony_ci fail('maxBuffer', {}, invalidRangeError); 1831cb0ef41Sopenharmony_ci fail('maxBuffer', common.mustNotCall(), invalidRangeError); 1841cb0ef41Sopenharmony_ci} 1851cb0ef41Sopenharmony_ci 1861cb0ef41Sopenharmony_ci{ 1871cb0ef41Sopenharmony_ci // Validate the killSignal option 1881cb0ef41Sopenharmony_ci const unknownSignalErr = { code: 'ERR_UNKNOWN_SIGNAL', name: 'TypeError' }; 1891cb0ef41Sopenharmony_ci 1901cb0ef41Sopenharmony_ci pass('killSignal', undefined); 1911cb0ef41Sopenharmony_ci pass('killSignal', null); 1921cb0ef41Sopenharmony_ci pass('killSignal', 'SIGKILL'); 1931cb0ef41Sopenharmony_ci fail('killSignal', 'SIGNOTAVALIDSIGNALNAME', unknownSignalErr); 1941cb0ef41Sopenharmony_ci fail('killSignal', true, invalidArgTypeError); 1951cb0ef41Sopenharmony_ci fail('killSignal', false, invalidArgTypeError); 1961cb0ef41Sopenharmony_ci fail('killSignal', [], invalidArgTypeError); 1971cb0ef41Sopenharmony_ci fail('killSignal', {}, invalidArgTypeError); 1981cb0ef41Sopenharmony_ci fail('killSignal', common.mustNotCall(), invalidArgTypeError); 1991cb0ef41Sopenharmony_ci 2001cb0ef41Sopenharmony_ci // Invalid signal names and numbers should fail 2011cb0ef41Sopenharmony_ci fail('killSignal', 500, unknownSignalErr); 2021cb0ef41Sopenharmony_ci fail('killSignal', 0, unknownSignalErr); 2031cb0ef41Sopenharmony_ci fail('killSignal', -200, unknownSignalErr); 2041cb0ef41Sopenharmony_ci fail('killSignal', 3.14, unknownSignalErr); 2051cb0ef41Sopenharmony_ci 2061cb0ef41Sopenharmony_ci Object.getOwnPropertyNames(Object.prototype).forEach((property) => { 2071cb0ef41Sopenharmony_ci fail('killSignal', property, unknownSignalErr); 2081cb0ef41Sopenharmony_ci }); 2091cb0ef41Sopenharmony_ci 2101cb0ef41Sopenharmony_ci // Valid signal names and numbers should pass 2111cb0ef41Sopenharmony_ci for (const signalName in signals) { 2121cb0ef41Sopenharmony_ci pass('killSignal', signals[signalName]); 2131cb0ef41Sopenharmony_ci pass('killSignal', signalName); 2141cb0ef41Sopenharmony_ci pass('killSignal', signalName.toLowerCase()); 2151cb0ef41Sopenharmony_ci } 2161cb0ef41Sopenharmony_ci} 217