aboutsummaryrefslogtreecommitdiff
path: root/test/bun.js/child_process-node.test.js
diff options
context:
space:
mode:
authorGravatar Derrick Farris <mr.dcfarris@gmail.com> 2022-12-02 10:25:13 -0600
committerGravatar GitHub <noreply@github.com> 2022-12-02 08:25:13 -0800
commitb8586b33dad8ab66ebd5d1aa4d5a0df305266e7f (patch)
tree19c31806b3ae22d7c0f0f127fd3cb1b640f4bd59 /test/bun.js/child_process-node.test.js
parentbeaf91590acd319e4ac15c14c64c59f45b6a794b (diff)
downloadbun-b8586b33dad8ab66ebd5d1aa4d5a0df305266e7f.tar.gz
bun-b8586b33dad8ab66ebd5d1aa4d5a0df305266e7f.tar.zst
bun-b8586b33dad8ab66ebd5d1aa4d5a0df305266e7f.zip
feat(process): add process.{stdin, stdout, stderr} support (#1495)
* fix(stream): get Duplex working * feat(process): add stdin,stdout,stderr in a semi-broken state (pipes??) * test(NodeTestHelpers): fix test names * test(NodeTestHelpers): add test for createDoneDotAll done called w error * test(NodeTestHelpers): remove stray console.log * fix(stream): fix bug in Duplex, Readable * test(process.stdio): rename test * fix(process.stdio): change onData listener to onReadable * refactor(streams): add file-wide debug fn, destructure opts * fix(child_process): check isCallable on promise * fix: get stdio streams mostly working (mostly) * fix(child_process): wait until stream is drained before calling end? * fix(child_process): change to result?.then * debug(child_process,streams): add EE id tracking, add shim for stdio after handle is dead * test(child_process): fix double pipe test, temp fix for ChildProcess.kill() return val * fix(child_process): remove immediate emit of exit on kill * debug(streams): add more debug log * debug(streams): add more debug logs part 2 * feat(streams,fs): add NativeWritable, adapt fs.WriteStream and fs.ReadStream to native
Diffstat (limited to 'test/bun.js/child_process-node.test.js')
-rw-r--r--test/bun.js/child_process-node.test.js91
1 files changed, 49 insertions, 42 deletions
diff --git a/test/bun.js/child_process-node.test.js b/test/bun.js/child_process-node.test.js
index 699b0e58c..716bf6e67 100644
--- a/test/bun.js/child_process-node.test.js
+++ b/test/bun.js/child_process-node.test.js
@@ -44,6 +44,10 @@ const debug = process.env.DEBUG ? console.log : () => {};
const platformTmpDir = require("fs").realpathSync(tmpdir());
+const TYPE_ERR_NAME = "TypeError";
+
+console.log(process.cwd());
+
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
@@ -87,7 +91,7 @@ describe("ChildProcess.spawn()", () => {
},
{
code: "ERR_INVALID_ARG_TYPE",
- name: "TypeError",
+ name: TYPE_ERR_NAME,
// message:
// 'The "options" argument must be of type object.' +
// `${common.invalidArgTypeHelper(options)}`,
@@ -106,7 +110,7 @@ describe("ChildProcess.spawn()", () => {
},
{
code: "ERR_INVALID_ARG_TYPE",
- name: "TypeError",
+ name: TYPE_ERR_NAME,
// message:
// 'The "options.file" property must be of type string.' +
// `${common.invalidArgTypeHelper(file)}`,
@@ -129,7 +133,7 @@ describe("ChildProcess.spawn()", () => {
},
{
code: "ERR_INVALID_ARG_TYPE",
- name: "TypeError",
+ name: TYPE_ERR_NAME,
// message:
// 'The "options.envPairs" property must be an instance of Array.' +
// common.invalidArgTypeHelper(envPairs),
@@ -149,7 +153,7 @@ describe("ChildProcess.spawn()", () => {
},
{
code: "ERR_INVALID_ARG_TYPE",
- name: "TypeError",
+ name: TYPE_ERR_NAME,
// message:
// 'The "options.args" property must be an instance of Array.' +
// common.invalidArgTypeHelper(args),
@@ -167,7 +171,7 @@ describe("ChildProcess.spawn", () => {
// file: process.execPath,
args: ["node", "--interactive"],
cwd: process.cwd(),
- stdio: ["ignore", "ignore", "ignore", "ipc"],
+ stdio: ["ignore", "ignore", "ignore"],
});
return child;
}
@@ -188,13 +192,14 @@ describe("ChildProcess.spawn", () => {
() => {
child.kill("foo");
},
- { code: "ERR_UNKNOWN_SIGNAL", name: "TypeError" },
+ { code: "ERR_UNKNOWN_SIGNAL", name: TYPE_ERR_NAME },
);
});
- it("should die when killed", () => {
+ it("should die when killed", async () => {
const child = getChild();
strictEqual(child.kill(), true);
+ strictEqual(await child._getIsReallyKilled(), true);
});
});
@@ -234,7 +239,7 @@ describe("ChildProcess spawn bad stdio", () => {
it("should handle error event of child process", (done) => {
const error = new Error("foo");
- const child = createChild(
+ createChild(
{},
(err, stdout, stderr) => {
strictEqual(err, error);
@@ -243,8 +248,6 @@ describe("ChildProcess spawn bad stdio", () => {
},
done,
);
-
- child.emit("error", error);
});
it("should handle killed process", (done) => {
@@ -420,18 +423,40 @@ describe("child_process default options", () => {
describe("child_process double pipe", () => {
it("should allow two pipes to be used at once", (done) => {
- const { mustCallAtLeast, mustCall } = createCallCheckCtx(done);
+ // const { mustCallAtLeast, mustCall } = createCallCheckCtx(done);
+ const mustCallAtLeast = (fn) => fn;
+ const mustCall = (fn) => fn;
let grep, sed, echo;
- grep = spawn("grep", ["o"]);
+ grep = spawn("grep", ["o"], { stdio: ["pipe", "pipe", "pipe"] });
sed = spawn("sed", ["s/o/O/"]);
echo = spawn("echo", ["hello\nnode\nand\nworld\n"]);
- // pipe echo | grep
+ // pipe grep | sed
+ grep.stdout.on(
+ "data",
+ mustCallAtLeast((data) => {
+ debug(`grep stdout ${data.length}`);
+ if (!sed.stdin.write(data)) {
+ grep.stdout.pause();
+ }
+ }),
+ );
+
+ // print sed's output
+ sed.stdout.on(
+ "data",
+ mustCallAtLeast((data) => {
+ result += data.toString("utf8");
+ debug(data);
+ }),
+ );
+
echo.stdout.on(
"data",
mustCallAtLeast((data) => {
debug(`grep stdin write ${data.length}`);
if (!grep.stdin.write(data)) {
+ debug("echo stdout pause");
echo.stdout.pause();
}
}),
@@ -439,11 +464,12 @@ describe("child_process double pipe", () => {
// TODO(Derrick): We don't implement the full API for this yet,
// So stdin has no 'drain' event.
- // // TODO(@jasnell): This does not appear to ever be
- // // emitted. It's not clear if it is necessary.
- // grep.stdin.on("drain", (data) => {
- // echo.stdout.resume();
- // });
+ // TODO(@jasnell): This does not appear to ever be
+ // emitted. It's not clear if it is necessary.
+ grep.stdin.on("drain", () => {
+ debug("echo stdout resume");
+ echo.stdout.resume();
+ });
// Propagate end from echo to grep
echo.stdout.on(
@@ -475,27 +501,16 @@ describe("child_process double pipe", () => {
}),
);
- // pipe grep | sed
- grep.stdout.on(
- "data",
- mustCallAtLeast((data) => {
- debug(`grep stdout ${data.length}`);
- if (!sed.stdin.write(data)) {
- grep.stdout.pause();
- }
- }),
- );
-
- // // TODO(@jasnell): This does not appear to ever be
- // // emitted. It's not clear if it is necessary.
- sed.stdin.on("drain", (data) => {
+ // TODO(@jasnell): This does not appear to ever be
+ // emitted. It's not clear if it is necessary.
+ sed.stdin.on("drain", () => {
grep.stdout.resume();
});
// Propagate end from grep to sed
grep.stdout.on(
"end",
- mustCall((code) => {
+ mustCall(() => {
debug("grep stdout end");
sed.stdin.end();
}),
@@ -503,20 +518,12 @@ describe("child_process double pipe", () => {
let result = "";
- // print sed's output
- sed.stdout.on(
- "data",
- mustCallAtLeast((data) => {
- result += data.toString("utf8");
- debug(data);
- }),
- );
-
sed.stdout.on(
"end",
mustCall(() => {
debug("result: " + result);
strictEqual(result, `hellO\nnOde\nwOrld\n`);
+ done();
}),
);
});