diff options
author | 2022-10-11 20:25:16 -0700 | |
---|---|---|
committer | 2022-10-11 20:25:16 -0700 | |
commit | 36adee4dc80c0aeb4d46bf56775af2a7a512b576 (patch) | |
tree | e9863b18e42ddb18e9c66d9ad69afc3b1e009eda /test/bun.js | |
parent | 9fe1ad93cb8a8c0d398061a3c4548e0d8ef99f70 (diff) | |
download | bun-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.ts | 12 | ||||
-rw-r--r-- | test/bun.js/log-test.test.ts | 4 | ||||
-rw-r--r-- | test/bun.js/spawn.test.ts | 277 |
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; + }); + }); + }); + } }); - } + }); }); -}); +} |