diff --git a/lib/kill.js b/lib/kill.js index c23d6a5ad..dc1c77c38 100644 --- a/lib/kill.js +++ b/lib/kill.js @@ -85,7 +85,7 @@ const setupTimeout = (spawned, {timeout, killSignal = 'SIGTERM'}, spawnedPromise // `cleanup` option handling const setExitHandler = (spawned, {cleanup, detached}, timedPromise) => { if (!cleanup || detached) { - return; + return timedPromise; } const removeExitHandler = onExit(() => { diff --git a/test/fixtures/sub-process-exit b/test/fixtures/sub-process-exit index 2b350a2b6..ea05f0e2d 100755 --- a/test/fixtures/sub-process-exit +++ b/test/fixtures/sub-process-exit @@ -4,4 +4,14 @@ const execa = require('../..'); const cleanup = process.argv[2] === 'true'; const detached = process.argv[3] === 'true'; -execa('node', ['./test/fixtures/noop'], {cleanup, detached}); + +const runChild = async () => { + try { + await execa('node', ['./test/fixtures/noop'], {cleanup, detached}); + } catch (error) { + console.error(error); + process.exit(1); + } +}; + +runChild(); diff --git a/test/stream.js b/test/stream.js index fc388ad9f..c0f8ba7eb 100644 --- a/test/stream.js +++ b/test/stream.js @@ -172,15 +172,18 @@ test('buffer: false > promise rejects when process returns non-zero', async t => const BUFFER_TIMEOUT = 1e3; -test.serial('buffer: false > promise does not resolve when output is big and is not read', async t => { - const {timedOut} = await t.throwsAsync(execa('max-buffer', {buffer: false, timeout: BUFFER_TIMEOUT})); - t.true(timedOut); -}); +// On Unix (not Windows), a process won't exit if stdout has not been read. +if (process.platform !== 'win32') { + test.serial('buffer: false > promise does not resolve when output is big and is not read', async t => { + const {timedOut} = await t.throwsAsync(execa('max-buffer', {buffer: false, timeout: BUFFER_TIMEOUT})); + t.true(timedOut); + }); -test.serial('buffer: false > promise does not resolve when output is big and "all" is used but not read', async t => { - const cp = execa('max-buffer', {buffer: false, all: true, timeout: BUFFER_TIMEOUT}); - cp.stdout.resume(); - cp.stderr.resume(); - const {timedOut} = await t.throwsAsync(cp); - t.true(timedOut); -}); + test.serial('buffer: false > promise does not resolve when output is big and "all" is used but not read', async t => { + const cp = execa('max-buffer', {buffer: false, all: true, timeout: BUFFER_TIMEOUT}); + cp.stdout.resume(); + cp.stderr.resume(); + const {timedOut} = await t.throwsAsync(cp); + t.true(timedOut); + }); +} diff --git a/test/test.js b/test/test.js index 90089cffe..96a4a71a5 100644 --- a/test/test.js +++ b/test/test.js @@ -74,24 +74,22 @@ test('stripFinalNewline in sync mode on failure', t => { }); test('preferLocal: true', async t => { - await t.notThrowsAsync(execa('ava', ['--version'], {preferLocal: true, env: {PATH: ''}})); + await t.notThrowsAsync(execa('ava', ['--version'], {preferLocal: true, env: {Path: '', PATH: ''}})); }); test('preferLocal: false', async t => { - await t.throwsAsync(execa('ava', ['--version'], {preferLocal: false, env: {PATH: ''}}), ENOENT_REGEXP); + await t.throwsAsync(execa('ava', ['--version'], {preferLocal: false, env: {Path: '', PATH: ''}}), ENOENT_REGEXP); }); test('preferLocal: undefined', async t => { - await t.throwsAsync(execa('ava', ['--version'], {env: {PATH: ''}}), ENOENT_REGEXP); + await t.throwsAsync(execa('ava', ['--version'], {env: {Path: '', PATH: ''}}), ENOENT_REGEXP); }); test('localDir option', async t => { const command = process.platform === 'win32' ? 'echo %PATH%' : 'echo $PATH'; const {stdout} = await execa(command, {shell: true, preferLocal: true, localDir: '/test'}); - const envPaths = stdout.split(path.delimiter).map(envPath => - envPath.replace(/\\/g, '/').replace(/^[^/]+/, '') - ); - t.true(envPaths.some(envPath => envPath === '/test/node_modules/.bin')); + const envPaths = stdout.split(path.delimiter); + t.true(envPaths.some(envPath => envPath.endsWith('.bin'))); }); test('stdin errors are handled', async t => {