diff options
author | Nayeem Rahman <nayeemrmn99@gmail.com> | 2022-07-18 14:16:12 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-18 15:16:12 +0200 |
commit | 45c49034a7ea20f27287cd8559ea050d8973bfae (patch) | |
tree | 4566c3ca296f49e6bb564693f0e18e141304a3d4 /cli/tests/unit/spawn_test.ts | |
parent | 0f6b455c964933692f4c82476692ab66eba242c2 (diff) |
BREAKING(unstable): Improve Deno.spawn() stdio API (#14919)
- "SpawnOutput" extends "ChildStatus" instead of composing it
- "SpawnOutput::stdout", "SpawnOutput::stderr", "Child::stdin",
"Child::stdout" and "Child::stderr" are no longer optional, instead
made them getters that throw at runtime if that stream wasn't set
to "piped".
- Remove the complicated "<T extends SpawnOptions = SpawnOptions>"
which we currently need to give proper type hints for the availability of
these fields. Their typings for these would get increasingly complex
if it became dependent on more options (e.g. "SpawnOptions::pty"
which if set should make the stdio streams unavailable)
Diffstat (limited to 'cli/tests/unit/spawn_test.ts')
-rw-r--r-- | cli/tests/unit/spawn_test.ts | 92 |
1 files changed, 44 insertions, 48 deletions
diff --git a/cli/tests/unit/spawn_test.ts b/cli/tests/unit/spawn_test.ts index 10bcc597f..594597412 100644 --- a/cli/tests/unit/spawn_test.ts +++ b/cli/tests/unit/spawn_test.ts @@ -64,9 +64,8 @@ Deno.test( stderr: "null", }); - assert(child.stdin !== null); - assert(child.stdout === null); - assert(child.stderr === null); + assertThrows(() => child.stdout, TypeError, "stdout is not piped"); + assertThrows(() => child.stderr, TypeError, "stderr is not piped"); const msg = new TextEncoder().encode("hello"); const writer = child.stdin.getWriter(); @@ -92,9 +91,8 @@ Deno.test( stderr: "null", }); - assert(child.stdin === null); - assert(child.stdout !== null); - assert(child.stderr === null); + assertThrows(() => child.stdin, TypeError, "stdin is not piped"); + assertThrows(() => child.stderr, TypeError, "stderr is not piped"); const readable = child.stdout.pipeThrough(new TextDecoderStream()); const reader = readable.getReader(); @@ -122,13 +120,11 @@ Deno.test( "eval", "await Deno.stderr.write(new TextEncoder().encode('hello'))", ], - stderr: "piped", stdout: "null", }); - assert(child.stdin === null); - assert(child.stdout === null); - assert(child.stderr !== null); + assertThrows(() => child.stdin, TypeError, "stdin is not piped"); + assertThrows(() => child.stdout, TypeError, "stdout is not piped"); const readable = child.stderr.pipeThrough(new TextDecoderStream()); const reader = readable.getReader(); @@ -322,62 +318,62 @@ Deno.test( Deno.test( { permissions: { run: true, read: true } }, async function spawnSuccess() { - const { status } = await Deno.spawn(Deno.execPath(), { + const output = await Deno.spawn(Deno.execPath(), { args: ["eval", "console.log('hello world')"], }); - assertEquals(status.success, true); - assertEquals(status.code, 0); - assertEquals(status.signal, null); + assertEquals(output.success, true); + assertEquals(output.code, 0); + assertEquals(output.signal, null); }, ); Deno.test( { permissions: { run: true, read: true } }, function spawnSyncSuccess() { - const { status } = Deno.spawnSync(Deno.execPath(), { + const output = Deno.spawnSync(Deno.execPath(), { args: ["eval", "console.log('hello world')"], }); - assertEquals(status.success, true); - assertEquals(status.code, 0); - assertEquals(status.signal, null); + assertEquals(output.success, true); + assertEquals(output.code, 0); + assertEquals(output.signal, null); }, ); Deno.test( { permissions: { run: true, read: true } }, async function spawnUrl() { - const { status, stdout } = await Deno.spawn( + const output = await Deno.spawn( new URL(`file:///${Deno.execPath()}`), { args: ["eval", "console.log('hello world')"], }, ); - assertEquals(new TextDecoder().decode(stdout), "hello world\n"); + assertEquals(new TextDecoder().decode(output.stdout), "hello world\n"); - assertEquals(status.success, true); - assertEquals(status.code, 0); - assertEquals(status.signal, null); + assertEquals(output.success, true); + assertEquals(output.code, 0); + assertEquals(output.signal, null); }, ); Deno.test( { permissions: { run: true, read: true } }, function spawnSyncUrl() { - const { status, stdout } = Deno.spawnSync( + const output = Deno.spawnSync( new URL(`file:///${Deno.execPath()}`), { args: ["eval", "console.log('hello world')"], }, ); - assertEquals(new TextDecoder().decode(stdout), "hello world\n"); + assertEquals(new TextDecoder().decode(output.stdout), "hello world\n"); - assertEquals(status.success, true); - assertEquals(status.code, 0); - assertEquals(status.signal, null); + assertEquals(output.success, true); + assertEquals(output.code, 0); + assertEquals(output.signal, null); }, ); @@ -398,24 +394,24 @@ Deno.test({ permissions: { run: true } }, function spawnSyncNotFound() { Deno.test( { permissions: { run: true, read: true } }, async function spawnFailedWithCode() { - const { status } = await Deno.spawn(Deno.execPath(), { + const output = await Deno.spawn(Deno.execPath(), { args: ["eval", "Deno.exit(41 + 1)"], }); - assertEquals(status.success, false); - assertEquals(status.code, 42); - assertEquals(status.signal, null); + assertEquals(output.success, false); + assertEquals(output.code, 42); + assertEquals(output.signal, null); }, ); Deno.test( { permissions: { run: true, read: true } }, function spawnSyncFailedWithCode() { - const { status } = Deno.spawnSync(Deno.execPath(), { + const output = Deno.spawnSync(Deno.execPath(), { args: ["eval", "Deno.exit(41 + 1)"], }); - assertEquals(status.success, false); - assertEquals(status.code, 42); - assertEquals(status.signal, null); + assertEquals(output.success, false); + assertEquals(output.code, 42); + assertEquals(output.signal, null); }, ); @@ -424,16 +420,16 @@ Deno.test( permissions: { run: true, read: true }, }, async function spawnFailedWithSignal() { - const { status } = await Deno.spawn(Deno.execPath(), { + const output = await Deno.spawn(Deno.execPath(), { args: ["eval", "--unstable", "Deno.kill(Deno.pid, 'SIGKILL')"], }); - assertEquals(status.success, false); + assertEquals(output.success, false); if (Deno.build.os === "windows") { - assertEquals(status.code, 1); - assertEquals(status.signal, null); + assertEquals(output.code, 1); + assertEquals(output.signal, null); } else { - assertEquals(status.code, 128 + 9); - assertEquals(status.signal, "SIGKILL"); + assertEquals(output.code, 128 + 9); + assertEquals(output.signal, "SIGKILL"); } }, ); @@ -443,16 +439,16 @@ Deno.test( permissions: { run: true, read: true }, }, function spawnSyncFailedWithSignal() { - const { status } = Deno.spawnSync(Deno.execPath(), { + const output = Deno.spawnSync(Deno.execPath(), { args: ["eval", "--unstable", "Deno.kill(Deno.pid, 'SIGKILL')"], }); - assertEquals(status.success, false); + assertEquals(output.success, false); if (Deno.build.os === "windows") { - assertEquals(status.code, 1); - assertEquals(status.signal, null); + assertEquals(output.code, 1); + assertEquals(output.signal, null); } else { - assertEquals(status.code, 128 + 9); - assertEquals(status.signal, "SIGKILL"); + assertEquals(output.code, 128 + 9); + assertEquals(output.signal, "SIGKILL"); } }, ); |