diff options
author | Bert Belder <bertbelder@gmail.com> | 2018-11-15 20:07:40 -0800 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2018-11-16 12:07:40 +0800 |
commit | 48bf4062e4359674e1a417100eb76a6347e77fc1 (patch) | |
tree | e52f2c6c63a2afcdf2d5efc059e43c7f55f2c653 /js/process_test.ts | |
parent | 9b702da9e53b6efbc7a333380bcfb3d57733730e (diff) |
First pass at running subprocesses (#1156)
Diffstat (limited to 'js/process_test.ts')
-rw-r--r-- | js/process_test.ts | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/js/process_test.ts b/js/process_test.ts new file mode 100644 index 000000000..6cba1a1b7 --- /dev/null +++ b/js/process_test.ts @@ -0,0 +1,178 @@ +// Copyright 2018 the Deno authors. All rights reserved. MIT license. +import { test, testPerm, assert, assertEqual } from "./test_util.ts"; +import { run, DenoError, ErrorKind } from "deno"; +import * as deno from "deno"; + +test(async function runPermissions() { + let caughtError = false; + try { + deno.run({ args: ["python", "-c", "print('hello world')"] }); + } catch (e) { + caughtError = true; + assertEqual(e.kind, deno.ErrorKind.PermissionDenied); + assertEqual(e.name, "PermissionDenied"); + } + assert(caughtError); +}); + +testPerm({ run: true }, async function runSuccess() { + const p = run({ + args: ["python", "-c", "print('hello world')"] + }); + const status = await p.status(); + console.log("status", status); + assertEqual(status.success, true); + assertEqual(status.code, 0); + assertEqual(status.signal, undefined); + p.close(); +}); + +testPerm({ run: true }, async function runCommandFailedWithCode() { + let p = run({ + args: ["python", "-c", "import sys;sys.exit(41 + 1)"] + }); + let status = await p.status(); + assertEqual(status.success, false); + assertEqual(status.code, 42); + assertEqual(status.signal, undefined); + p.close(); +}); + +testPerm({ run: true }, async function runCommandFailedWithSignal() { + if (deno.platform.os === "win") { + return; // No signals on windows. + } + const p = run({ + args: ["python", "-c", "import os;os.kill(os.getpid(), 9)"] + }); + const status = await p.status(); + assertEqual(status.success, false); + assertEqual(status.code, undefined); + assertEqual(status.signal, 9); + p.close(); +}); + +testPerm({ run: true }, async function runNotFound() { + let error; + try { + run({ args: ["this file hopefully doesn't exist"] }); + } catch (e) { + error = e; + } + assert(error !== undefined); + assert(error instanceof DenoError); + assertEqual(error.kind, ErrorKind.NotFound); +}); + +testPerm({ write: true, run: true }, async function runWithCwdIsAsync() { + const enc = new TextEncoder(); + const cwd = deno.makeTempDirSync({ prefix: "deno_command_test" }); + + const exitCodeFile = "deno_was_here"; + const pyProgramFile = "poll_exit.py"; + const pyProgram = ` +from sys import exit +from time import sleep + +while True: + try: + with open("${exitCodeFile}", "r") as f: + line = f.readline() + code = int(line) + exit(code) + except IOError: + # Retry if we got here before deno wrote the file. + sleep(0.01) + pass +`; + + deno.writeFileSync(`${cwd}/${pyProgramFile}.py`, enc.encode(pyProgram)); + const p = run({ + cwd, + args: ["python", `${pyProgramFile}.py`] + }); + + // Write the expected exit code *after* starting python. + // This is how we verify that `run()` is actually asynchronous. + const code = 84; + deno.writeFileSync(`${cwd}/${exitCodeFile}`, enc.encode(`${code}`)); + + const status = await p.status(); + assertEqual(status.success, false); + assertEqual(status.code, code); + assertEqual(status.signal, undefined); + p.close(); +}); + +testPerm({ run: true }, async function runStdinPiped() { + const p = run({ + args: ["python", "-c", "import sys; assert 'hello' == sys.stdin.read();"], + stdin: "piped" + }); + assert(!p.stdout); + assert(!p.stderr); + + let msg = new TextEncoder().encode("hello"); + let n = await p.stdin.write(msg); + assertEqual(n, msg.byteLength); + + p.stdin.close(); + + const status = await p.status(); + assertEqual(status.success, true); + assertEqual(status.code, 0); + assertEqual(status.signal, undefined); + p.close(); +}); + +testPerm({ run: true }, async function runStdoutPiped() { + const p = run({ + args: ["python", "-c", "import sys; sys.stdout.write('hello')"], + stdout: "piped" + }); + assert(!p.stdin); + assert(!p.stderr); + + const data = new Uint8Array(10); + let r = await p.stdout.read(data); + assertEqual(r.nread, 5); + assertEqual(r.eof, false); + const s = new TextDecoder().decode(data.subarray(0, r.nread)); + assertEqual(s, "hello"); + r = await p.stdout.read(data); + assertEqual(r.nread, 0); + assertEqual(r.eof, true); + p.stdout.close(); + + const status = await p.status(); + assertEqual(status.success, true); + assertEqual(status.code, 0); + assertEqual(status.signal, undefined); + p.close(); +}); + +testPerm({ run: true }, async function runStderrPiped() { + const p = run({ + args: ["python", "-c", "import sys; sys.stderr.write('hello')"], + stderr: "piped" + }); + assert(!p.stdin); + assert(!p.stdout); + + const data = new Uint8Array(10); + let r = await p.stderr.read(data); + assertEqual(r.nread, 5); + assertEqual(r.eof, false); + const s = new TextDecoder().decode(data.subarray(0, r.nread)); + assertEqual(s, "hello"); + r = await p.stderr.read(data); + assertEqual(r.nread, 0); + assertEqual(r.eof, true); + p.stderr.close(); + + const status = await p.status(); + assertEqual(status.success, true); + assertEqual(status.code, 0); + assertEqual(status.signal, undefined); + p.close(); +}); |