'use strict'; const common = require('../common'); const fixtures = require('../common/fixtures'); const assert = require('assert'); const { fork } = require('child_process'); // This test check the arguments of `fork` method // Refs: https://github.com/nodejs/node/issues/20749 const expectedEnv = { foo: 'bar' }; // Ensure that first argument `modulePath` must be provided // and be of type string { const invalidModulePath = [ 0, true, undefined, null, [], {}, () => {}, Symbol('t'), ]; invalidModulePath.forEach((modulePath) => { assert.throws(() => fork(modulePath), { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError', message: /^The "modulePath" argument must be of type string/ }); }); const cp = fork(fixtures.path('child-process-echo-options.js')); cp.on( 'exit', common.mustCall((code) => { assert.strictEqual(code, 0); }) ); } // Ensure that the second argument of `fork` // and `fork` should parse options // correctly if args is undefined or null { const invalidSecondArgs = [ 0, true, () => {}, Symbol('t'), ]; invalidSecondArgs.forEach((arg) => { assert.throws( () => { fork(fixtures.path('child-process-echo-options.js'), arg); }, { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' } ); }); const argsLists = [undefined, null, []]; argsLists.forEach((args) => { const cp = fork(fixtures.path('child-process-echo-options.js'), args, { env: { ...process.env, ...expectedEnv } }); cp.on( 'message', common.mustCall(({ env }) => { assert.strictEqual(env.foo, expectedEnv.foo); }) ); cp.on( 'exit', common.mustCall((code) => { assert.strictEqual(code, 0); }) ); }); } // Ensure that the third argument should be type of object if provided { const invalidThirdArgs = [ 0, true, () => {}, Symbol('t'), ]; invalidThirdArgs.forEach((arg) => { assert.throws( () => { fork(fixtures.path('child-process-echo-options.js'), [], arg); }, { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' } ); }); }