deno.land / std@0.166.0 / node / _tools / test / parallel / test-child-process-execfile.js
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135// deno-fmt-ignore-file// deno-lint-ignore-file
// Copyright Joyent and Node contributors. All rights reserved. MIT license.// Taken from Node 18.8.0// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually
// TODO(cjihrig): See inline TODO comments below.
'use strict';
const common = require('../common');const assert = require('assert');const { execFile, execFileSync } = require('child_process');const { getSystemErrorName } = require('util');const fixtures = require('../common/fixtures');const os = require('os');
const fixture = fixtures.path('exit.js');const echoFixture = fixtures.path('echo.js');const execOpts = { encoding: 'utf8', shell: true };
// TODO(cjihrig): The fixture depends on process.argv, which is currently// inaccurate when passing all of the required parameters for Deno.// {// execFile(// process.execPath,// [fixture, 42],// common.mustCall((e) => {// // Check that arguments are included in message// assert.strictEqual(e.message.trim(),// `Command failed: ${process.execPath} ${fixture} 42`);// assert.strictEqual(e.code, 42);// })// );// }
{ // Verify that negative exit codes can be translated to UV error names. const errorString = `Error: Command failed: ${process.execPath}`; const code = -1; const callback = common.mustCall((err, stdout, stderr) => { assert.strictEqual(err.toString().trim(), errorString); assert.strictEqual(err.code, getSystemErrorName(code)); assert.strictEqual(err.killed, true); assert.strictEqual(err.signal, null); assert.strictEqual(err.cmd, process.execPath); assert.strictEqual(stdout.trim(), ''); assert.strictEqual(stderr.trim(), ''); }); const child = execFile(process.execPath, callback);
child.kill(); child.emit('close', code, null);}
{ // Verify the shell option works properly execFile(process.execPath, ['require.ts', fixture, 0], execOpts, common.mustSucceed());}
{ // Verify that the signal option works properly const ac = new AbortController(); const { signal } = ac;
const test = () => { const check = common.mustCall((err) => { assert.strictEqual(err.code, 'ABORT_ERR'); assert.strictEqual(err.name, 'AbortError'); assert.strictEqual(err.signal, undefined); }); execFile(process.execPath, [echoFixture, 0], { signal }, check); };
// Verify that it still works the same way now that the signal is aborted. test(); ac.abort();}
{ // Verify that does not spawn a child if already aborted const signal = AbortSignal.abort();
const check = common.mustCall((err) => { assert.strictEqual(err.code, 'ABORT_ERR'); assert.strictEqual(err.name, 'AbortError'); assert.strictEqual(err.signal, undefined); }); execFile(process.execPath, [echoFixture, 0], { signal }, check);}
{ // Verify that if something different than Abortcontroller.signal // is passed, ERR_INVALID_ARG_TYPE is thrown assert.throws(() => { const callback = common.mustNotCall(() => {});
execFile(process.execPath, [echoFixture, 0], { signal: 'hello' }, callback); }, { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' });}{ // Verify that the process completing removes the abort listener const ac = new AbortController(); const { signal } = ac;
const callback = common.mustCall((err) => { // TODO(cjihrig): The assertion on the next line currently fails because // kEvents is not defined. See TODO comment in _events.mjs. // assert.strictEqual(getEventListeners(ac.signal).length, 0); assert.strictEqual(err, null); }); execFile(process.execPath, ['require.ts', fixture, 0], { signal }, callback);}
// Verify the execFile() stdout is the same as execFileSync().{ const file = 'echo'; const args = ['foo', 'bar'];
// Test with and without `{ shell: true }` [ // Skipping shell-less test on Windows because its echo command is a shell built-in command. ...(common.isWindows ? [] : [{ encoding: 'utf8' }]), { shell: true, encoding: 'utf8' }, ].forEach((options) => { const execFileSyncStdout = execFileSync(file, args, options); assert.strictEqual(execFileSyncStdout, `foo bar${os.EOL}`);
execFile(file, args, options, common.mustCall((_, stdout) => { assert.strictEqual(stdout, execFileSyncStdout); })); });}
Version Info