| // This test confirms that `undefined`, `null`, and `[]` |
| // can be used as a placeholder for the second argument (`args`) of `spawn()`. |
| // Previously, there was a bug where using `undefined` for the second argument |
| // caused the third argument (`options`) to be ignored. |
| // See https://github.com/nodejs/node/issues/24912. |
| |
| import * as common from '../common/index.mjs'; |
| import tmpdir from '../common/tmpdir.js'; |
| |
| import assert from 'node:assert'; |
| import { spawn } from 'node:child_process'; |
| import { once } from 'node:events'; |
| |
| tmpdir.refresh(); |
| |
| const command = common.isWindows ? 'cd' : 'pwd'; |
| const options = { cwd: tmpdir.path }; |
| |
| if (common.isWindows) { |
| // This test is not the case for Windows based systems |
| // unless the `shell` options equals to `true` |
| options.shell = true; |
| } |
| |
| const testCases = [ |
| undefined, |
| null, |
| [], |
| ]; |
| |
| const expectedResult = new Set([tmpdir.path.trim().toLowerCase()]); |
| |
| const actualResults = new Set(); |
| |
| for (const testCase of testCases) { |
| const subprocess = spawn(command, testCase, options); |
| |
| let accumulatedData = ''; |
| |
| subprocess.stdout.setEncoding('utf8'); |
| subprocess.stdout.on('data', common.mustCall((data) => { |
| accumulatedData += data; |
| })); |
| |
| await once(subprocess.stdout, 'end'); |
| |
| actualResults.add(accumulatedData.trim().toLowerCase()); |
| } |
| |
| assert.deepStrictEqual(actualResults, expectedResult); |