aboutsummaryrefslogtreecommitdiff
path: root/test/bun.js
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-10-11 20:25:16 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-10-11 20:25:16 -0700
commit36adee4dc80c0aeb4d46bf56775af2a7a512b576 (patch)
treee9863b18e42ddb18e9c66d9ad69afc3b1e009eda /test/bun.js
parent9fe1ad93cb8a8c0d398061a3c4548e0d8ef99f70 (diff)
downloadbun-36adee4dc80c0aeb4d46bf56775af2a7a512b576.tar.gz
bun-36adee4dc80c0aeb4d46bf56775af2a7a512b576.tar.zst
bun-36adee4dc80c0aeb4d46bf56775af2a7a512b576.zip
Make `Bun.spawn` work on Linux
Diffstat (limited to 'test/bun.js')
-rw-r--r--test/bun.js/body-stream.test.ts12
-rw-r--r--test/bun.js/log-test.test.ts4
-rw-r--r--test/bun.js/spawn.test.ts277
3 files changed, 161 insertions, 132 deletions
diff --git a/test/bun.js/body-stream.test.ts b/test/bun.js/body-stream.test.ts
index 7310a6837..e513ce7cb 100644
--- a/test/bun.js/body-stream.test.ts
+++ b/test/bun.js/body-stream.test.ts
@@ -4,7 +4,7 @@ import { readFileSync } from "fs";
// afterEach(() => Bun.gc(true));
-var port = 40001;
+var port = 4020;
{
const BodyMixin = [
@@ -178,9 +178,11 @@ async function runInServer(
cb: (url: string) => void | Promise<void>
) {
var server;
+ var thisPort = port++;
+ if (port > 4120) port = 4020;
server = Bun.serve({
...opts,
- port: port++,
+ port: thisPort,
fetch(req) {
try {
return opts.fetch(req);
@@ -201,10 +203,8 @@ async function runInServer(
} catch (e) {
throw e;
} finally {
- queueMicrotask(() => {
- server && server.stop();
- server = undefined;
- });
+ server && server.stop();
+ server = undefined;
}
}
diff --git a/test/bun.js/log-test.test.ts b/test/bun.js/log-test.test.ts
index 883daa5c4..ecc2c3939 100644
--- a/test/bun.js/log-test.test.ts
+++ b/test/bun.js/log-test.test.ts
@@ -10,7 +10,7 @@ it("should not log .env when quiet", async () => {
"index.ts": "export default console.log('Here');",
});
const out = spawn({
- cmd: [process.argv[0], "index.ts"],
+ cmd: ["bun", "index.ts"],
stdout: "pipe",
stderr: "pipe",
cwd: "/tmp/log-test-silent",
@@ -30,7 +30,7 @@ it("should log .env by default", async () => {
});
const out = spawn({
- cmd: [process.argv[0], "index.ts"],
+ cmd: ["bun", "index.ts"],
stdout: "pipe",
stderr: "pipe",
cwd: "/tmp/log-test-silent",
diff --git a/test/bun.js/spawn.test.ts b/test/bun.js/spawn.test.ts
index e03de2662..b8e0459c5 100644
--- a/test/bun.js/spawn.test.ts
+++ b/test/bun.js/spawn.test.ts
@@ -1,141 +1,170 @@
import { readableStreamToText, spawn, write } from "bun";
import { describe, expect, it } from "bun:test";
-import { rmdirSync, unlinkSync, rmSync } from "node:fs";
-
-describe("spawn", () => {
- const hugeString = "hello".repeat(10000).slice();
-
- it("Bun.file() works as stdout", async () => {
- rmSync("/tmp/out.123.txt", { force: true });
- const { exited } = spawn({
- cmd: ["echo", "hello"],
- stdout: Bun.file("/tmp/out.123.txt"),
- });
-
- await exited;
- expect(await Bun.file("/tmp/out.123.txt").text()).toBe("hello\n");
- });
-
- it("Bun.file() works as stdin", async () => {
- await write(Bun.file("/tmp/out.456.txt"), "hello there!");
- const { stdout } = spawn({
- cmd: ["cat"],
- stdout: "pipe",
- stdin: Bun.file("/tmp/out.456.txt"),
- });
-
- expect(await readableStreamToText(stdout)).toBe("hello there!");
- });
-
- it("Bun.file() works as stdin and stdout", async () => {
- await write(Bun.file("/tmp/out.456.txt"), "hello!");
- await write(Bun.file("/tmp/out.123.txt"), "wrong!");
-
- const { exited } = spawn({
- cmd: ["cat"],
- stdout: Bun.file("/tmp/out.123.txt"),
- stdin: Bun.file("/tmp/out.456.txt"),
- });
-
- await exited;
- expect(await Bun.file("/tmp/out.456.txt").text()).toBe("hello!");
- expect(await Bun.file("/tmp/out.123.txt").text()).toBe("hello!");
- });
+import { gcTick as _gcTick } from "gc";
+import { rmdirSync, unlinkSync, rmSync, writeFileSync } from "node:fs";
+
+for (let [gcTick, label] of [
+ [_gcTick, "gcTick"],
+ [() => {}, "no gc tick"],
+]) {
+ describe(label, () => {
+ describe("spawn", () => {
+ const hugeString = "hello".repeat(10000).slice();
+
+ it("Bun.file() works as stdout", async () => {
+ rmSync("/tmp/out.123.txt", { force: true });
+ gcTick();
+ const { exited } = spawn({
+ cmd: ["echo", "hello"],
+ stdout: Bun.file("/tmp/out.123.txt"),
+ });
- it("stdout can be read", async () => {
- await Bun.write("/tmp/out.txt", hugeString);
- const { stdout } = spawn({
- cmd: ["cat", "/tmp/out.txt"],
- stdout: "pipe",
- });
+ await exited;
+ gcTick();
+ expect(await Bun.file("/tmp/out.123.txt").text()).toBe("hello\n");
+ });
- const text = await readableStreamToText(stdout);
- expect(text).toBe(hugeString);
- });
+ it("Bun.file() works as stdin", async () => {
+ await write(Bun.file("/tmp/out.456.txt"), "hello there!");
+ gcTick();
+ const { stdout } = spawn({
+ cmd: ["cat"],
+ stdout: "pipe",
+ stdin: Bun.file("/tmp/out.456.txt"),
+ });
+ gcTick();
+ expect(await readableStreamToText(stdout)).toBe("hello there!");
+ });
- it("stdin can be read and stdout can be written", async () => {
- const { stdout, stdin, exited } = spawn({
- cmd: ["bash", import.meta.dir + "/bash-echo.sh"],
- stdout: "pipe",
- stdin: "pipe",
- stderr: "inherit",
- });
+ it("Bun.file() works as stdin and stdout", async () => {
+ writeFileSync("/tmp/out.456.txt", "hello!");
+ gcTick();
+ writeFileSync("/tmp/out.123.txt", "wrong!");
+ gcTick();
- await stdin.write(hugeString);
- await stdin.end();
+ const { exited } = spawn({
+ cmd: ["cat"],
+ stdout: Bun.file("/tmp/out.123.txt"),
+ stdin: Bun.file("/tmp/out.456.txt"),
+ });
+ gcTick();
+ await exited;
+ expect(await Bun.file("/tmp/out.456.txt").text()).toBe("hello!");
+ gcTick();
+ expect(await Bun.file("/tmp/out.123.txt").text()).toBe("hello!");
+ });
- const text = await readableStreamToText(stdout);
- expect(text.trim()).toBe(hugeString);
- await exited;
- });
+ it("stdout can be read", async () => {
+ await Bun.write("/tmp/out.txt", hugeString);
+ gcTick();
+ const { stdout } = spawn({
+ cmd: ["cat", "/tmp/out.txt"],
+ stdout: "pipe",
+ });
+ gcTick();
- describe("pipe", () => {
- function huge() {
- return spawn({
- cmd: ["echo", hugeString],
- stdout: "pipe",
- stdin: "pipe",
- stderr: "inherit",
+ const text = await readableStreamToText(stdout);
+ gcTick();
+ expect(text).toBe(hugeString);
});
- }
- function helloWorld() {
- return spawn({
- cmd: ["echo", "hello"],
- stdout: "pipe",
- stdin: "pipe",
+ it("stdin can be read and stdout can be written", async () => {
+ const proc = spawn({
+ cmd: ["bash", import.meta.dir + "/bash-echo.sh"],
+ stdout: "pipe",
+ stdin: "pipe",
+ stderr: "inherit",
+ });
+ proc.stdin.write(hugeString);
+ await proc.stdin.end(true);
+ var text = "";
+ var reader = proc.stdout.getReader();
+ var done = false;
+ while (!done) {
+ var { value, done } = await reader.read();
+ if (value) text += new TextDecoder().decode(value);
+ if (done && text.length === 0) {
+ reader.releaseLock();
+ reader = proc.stdout.getReader();
+ done = false;
+ }
+ }
+
+ expect(text.trim().length).toBe(hugeString.length);
+ expect(text.trim()).toBe(hugeString);
+ gcTick();
+ await proc.exited;
});
- }
-
- const fixtures = [
- [helloWorld, "hello"],
- [huge, hugeString],
- ];
-
- for (const [callback, fixture] of fixtures) {
- describe(fixture.slice(0, 12), () => {
- describe("should should allow reading stdout", () => {
- it("before exit", async () => {
- const process = callback();
- const output = await readableStreamToText(process.stdout);
- const expected = fixture + "\n";
- expect(output.length).toBe(expected.length);
- expect(output).toBe(expected);
-
- await process.exited;
- });
- it("before exit (chunked)", async () => {
- const process = callback();
- var output = "";
- var reader = process.stdout.getReader();
- var done = false;
- while (!done) {
- var { value, done } = await reader.read();
- if (value) output += new TextDecoder().decode(value);
- }
-
- const expected = fixture + "\n";
- expect(output.length).toBe(expected.length);
- expect(output).toBe(expected);
-
- await process.exited;
+ describe("pipe", () => {
+ function huge() {
+ return spawn({
+ cmd: ["echo", hugeString],
+ stdout: "pipe",
+ stdin: "pipe",
+ stderr: "inherit",
});
+ }
- it("after exit", async () => {
- const process = callback();
- await process.stdin.end();
-
- const output = await readableStreamToText(process.stdout);
- const expected = fixture + "\n";
-
- expect(output.length).toBe(expected.length);
- expect(output).toBe(expected);
-
- await process.exited;
+ function helloWorld() {
+ return spawn({
+ cmd: ["echo", "hello"],
+ stdout: "pipe",
+ stdin: "pipe",
});
- });
+ }
+
+ const fixtures = [
+ [helloWorld, "hello"],
+ [huge, hugeString],
+ ];
+
+ for (const [callback, fixture] of fixtures) {
+ describe(fixture.slice(0, 12), () => {
+ describe("should should allow reading stdout", () => {
+ it("before exit", async () => {
+ const process = callback();
+ const output = await readableStreamToText(process.stdout);
+ const expected = fixture + "\n";
+ expect(output.length).toBe(expected.length);
+ expect(output).toBe(expected);
+
+ await process.exited;
+ });
+
+ it("before exit (chunked)", async () => {
+ const process = callback();
+ var output = "";
+ var reader = process.stdout.getReader();
+ var done = false;
+ while (!done) {
+ var { value, done } = await reader.read();
+ if (value) output += new TextDecoder().decode(value);
+ }
+
+ const expected = fixture + "\n";
+ expect(output.length).toBe(expected.length);
+ expect(output).toBe(expected);
+
+ await process.exited;
+ });
+
+ it("after exit", async () => {
+ const process = callback();
+ await process.stdin.end();
+
+ const output = await readableStreamToText(process.stdout);
+ const expected = fixture + "\n";
+
+ expect(output.length).toBe(expected.length);
+ expect(output).toBe(expected);
+
+ await process.exited;
+ });
+ });
+ });
+ }
});
- }
+ });
});
-});
+}