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