process.exit() failure

This commit is contained in:
Alistair Smith
2025-06-11 14:37:13 -07:00
parent 96c18bdf26
commit 5c754dc8cb
4 changed files with 54 additions and 41 deletions

View File

@@ -1,19 +0,0 @@
import assert from "node:assert";
import { setTimeout as sleep } from "node:timers/promises";
import { fileURLToPath } from "node:url";
import { Worker, isMainThread } from "node:worker_threads";
// This test exists so we can test the behaviour from
// https://github.com/oven-sh/bun/blob/f6dc66925e40dfb088c78b9592f832cbddb86519/test/js/web/workers/worker.test.ts#L341-L351
if (isMainThread) {
const worker = new Worker(fileURLToPath(import.meta.url), { smol: true });
let exitCode;
worker.once("exit", code => (exitCode = code));
await sleep(200);
assert.strictEqual(await worker.terminate(), undefined);
assert.strictEqual(exitCode, 2);
} else {
await sleep(100);
process.exit(2);
}

View File

@@ -0,0 +1,53 @@
// import assert from "node:assert";
// import { once } from "node:events";
// import { fileURLToPath } from "node:url";
// import { Worker, isMainThread, parentPort } from "node:worker_threads";
// if (isMainThread) {
// const worker = new Worker(fileURLToPath(import.meta.url));
// worker.postMessage("process.exit(2); parentPort.postMessage('done')");
// worker.on("message", () => {
// assert.fail("worker should not send a message");
// });
// const [exitCode] = await once(worker, "exit");
// assert.strictEqual(exitCode, 2);
// } else {
// parentPort.on("message", code => {
// console.log(`EVAL(${code})`);
// eval(code);
// });
// }
import { once } from "node:events";
import { fileURLToPath } from "node:url";
import { Worker, isMainThread, parentPort } from "node:worker_threads";
if (isMainThread) {
const { test, expect } = await import("bun:test");
test("process.exit() works", async () => {
console.log("Testing process.exit() in worker thread...");
const worker = new Worker(fileURLToPath(import.meta.url));
worker.on("message", () => expect().fail("worker should not keep executing after process.exit()"));
worker.postMessage("boom");
const [exitCode] = await once(worker, "exit");
expect(exitCode).toBe(2);
});
} else {
console.log("Worker thread started");
parentPort!.on("message", message => {
console.log(`Worker received: ${message}`);
console.log("About to call process.exit(2)...");
process.exit(2);
console.log("process.exit(2) called");
parentPort!.postMessage("i'm still alive!");
});
console.log("Worker is ready, waiting for messages...");
}

View File

@@ -1,19 +0,0 @@
import assert from "node:assert";
import { once } from "node:events";
import { fileURLToPath } from "node:url";
import { Worker, isMainThread, parentPort } from "node:worker_threads";
if (isMainThread) {
const worker = new Worker(fileURLToPath(import.meta.url));
worker.postMessage("process.exit(2); parentPort.postMessage('done')");
worker.on("message", () => {
assert.fail("worker should not send a message");
});
const [exitCode] = await once(worker, "exit");
assert.strictEqual(exitCode, 2);
} else {
parentPort.on("message", code => {
console.log(`EVAL(${code})`);
eval(code);
});
}

View File

@@ -342,9 +342,7 @@ describe("worker_threads", () => {
const worker = new wt.Worker(new URL("worker-fixture-process-exit.js", import.meta.url).href, {
smol: true,
});
let exitCode: number | undefined = undefined;
worker.once("exit", code => (exitCode = code));
await Bun.sleep(200);
const [exitCode] = await once(worker, "exit");
expect<number | undefined>(await worker.terminate()).toBe(undefined);
expect<number | undefined>(exitCode).toBe(2);
});