aboutsummaryrefslogtreecommitdiff
path: root/test/js/node
diff options
context:
space:
mode:
Diffstat (limited to 'test/js/node')
-rw-r--r--test/js/node/process/process-exit-fixture.js16
-rw-r--r--test/js/node/process/process-exitCode-fixture.js7
-rw-r--r--test/js/node/process/process-exitCode-with-exit.js8
-rw-r--r--test/js/node/process/process-onBeforeExit-fixture.js7
-rw-r--r--test/js/node/process/process-onBeforeExit-keepAlive.js18
-rw-r--r--test/js/node/process/process.test.js64
6 files changed, 117 insertions, 3 deletions
diff --git a/test/js/node/process/process-exit-fixture.js b/test/js/node/process/process-exit-fixture.js
new file mode 100644
index 000000000..c5a492285
--- /dev/null
+++ b/test/js/node/process/process-exit-fixture.js
@@ -0,0 +1,16 @@
+process.on("beforeExit", () => {
+ throw new Error("process.on('beforeExit') called");
+});
+
+if (process._exiting) {
+ throw new Error("process._exiting should be undefined");
+}
+
+process.on("exit", () => {
+ if (!process._exiting) {
+ throw new Error("process.on('exit') called with process._exiting false");
+ }
+ console.log("PASS");
+});
+
+process.exit(0);
diff --git a/test/js/node/process/process-exitCode-fixture.js b/test/js/node/process/process-exitCode-fixture.js
new file mode 100644
index 000000000..2d5182d93
--- /dev/null
+++ b/test/js/node/process/process-exitCode-fixture.js
@@ -0,0 +1,7 @@
+process.exitCode = Number(process.argv.at(-1));
+process.on("exit", code => {
+ if (code !== process.exitCode) {
+ throw new Error("process.exitCode should be " + process.exitCode);
+ }
+ console.log("PASS");
+});
diff --git a/test/js/node/process/process-exitCode-with-exit.js b/test/js/node/process/process-exitCode-with-exit.js
new file mode 100644
index 000000000..610975bc2
--- /dev/null
+++ b/test/js/node/process/process-exitCode-with-exit.js
@@ -0,0 +1,8 @@
+process.exitCode = Number(process.argv.at(-1));
+process.on("exit", code => {
+ if (code !== process.exitCode) {
+ throw new Error("process.exitCode should be " + process.exitCode);
+ }
+ console.log("PASS");
+});
+process.exit();
diff --git a/test/js/node/process/process-onBeforeExit-fixture.js b/test/js/node/process/process-onBeforeExit-fixture.js
new file mode 100644
index 000000000..8cbdcebf0
--- /dev/null
+++ b/test/js/node/process/process-onBeforeExit-fixture.js
@@ -0,0 +1,7 @@
+process.on("beforeExit", () => {
+ console.log("beforeExit");
+});
+
+process.on("exit", () => {
+ console.log("exit");
+});
diff --git a/test/js/node/process/process-onBeforeExit-keepAlive.js b/test/js/node/process/process-onBeforeExit-keepAlive.js
new file mode 100644
index 000000000..45b20b763
--- /dev/null
+++ b/test/js/node/process/process-onBeforeExit-keepAlive.js
@@ -0,0 +1,18 @@
+let counter = 0;
+process.on("beforeExit", () => {
+ if (process._exiting) {
+ throw new Error("process._exiting should be undefined");
+ }
+
+ console.log("beforeExit:", counter);
+ if (!counter++) {
+ setTimeout(() => {}, 1);
+ }
+});
+
+process.on("exit", () => {
+ if (!process._exiting) {
+ throw new Error("process.on('exit') called with process._exiting false");
+ }
+ console.log("exit:", counter);
+});
diff --git a/test/js/node/process/process.test.js b/test/js/node/process/process.test.js
index 61ac3839c..c4701f664 100644
--- a/test/js/node/process/process.test.js
+++ b/test/js/node/process/process.test.js
@@ -1,8 +1,8 @@
-import { resolveSync, which } from "bun";
+import { resolveSync, spawnSync, which } from "bun";
import { describe, expect, it } from "bun:test";
import { existsSync, readFileSync, realpathSync } from "fs";
-import { bunExe } from "harness";
-import { basename, resolve } from "path";
+import { bunEnv, bunExe } from "harness";
+import { basename, join, resolve } from "path";
it("process", () => {
// this property isn't implemented yet but it should at least return a string
@@ -233,3 +233,61 @@ it("process.argv in testing", () => {
// assert we aren't creating a new process.argv each call
expect(process.argv).toBe(process.argv);
});
+
+describe("process.exitCode", () => {
+ it("validates int", () => {
+ expect(() => (process.exitCode = "potato")).toThrow("exitCode must be a number");
+ expect(() => (process.exitCode = 1.2)).toThrow('The "code" argument must be an integer');
+ expect(() => (process.exitCode = NaN)).toThrow('The "code" argument must be an integer');
+ expect(() => (process.exitCode = Infinity)).toThrow('The "code" argument must be an integer');
+ expect(() => (process.exitCode = -Infinity)).toThrow('The "code" argument must be an integer');
+ expect(() => (process.exitCode = -1)).toThrow("exitCode must be between 0 and 127");
+ });
+
+ it("works with implicit process.exit", () => {
+ const { exitCode, stdout } = spawnSync({
+ cmd: [bunExe(), join(import.meta.dir, "process-exitCode-with-exit.js"), "42"],
+ env: bunEnv,
+ });
+ expect(exitCode).toBe(42);
+ expect(stdout.toString().trim()).toBe("PASS");
+ });
+
+ it("works with explicit process.exit", () => {
+ const { exitCode, stdout } = spawnSync({
+ cmd: [bunExe(), join(import.meta.dir, "process-exitCode-fixture.js"), "42"],
+ env: bunEnv,
+ });
+ expect(exitCode).toBe(42);
+ expect(stdout.toString().trim()).toBe("PASS");
+ });
+});
+
+it("process.exit", () => {
+ const { exitCode, stdout } = spawnSync({
+ cmd: [bunExe(), join(import.meta.dir, "process-exit-fixture.js")],
+ env: bunEnv,
+ });
+ expect(exitCode).toBe(0);
+ expect(stdout.toString().trim()).toBe("PASS");
+});
+
+describe("process.onBeforeExit", () => {
+ it("emitted", () => {
+ const { exitCode, stdout } = spawnSync({
+ cmd: [bunExe(), join(import.meta.dir, "process-onBeforeExit-fixture.js")],
+ env: bunEnv,
+ });
+ expect(exitCode).toBe(0);
+ expect(stdout.toString().trim()).toBe("beforeExit\nexit");
+ });
+
+ it("works with explicit process.exit", () => {
+ const { exitCode, stdout } = spawnSync({
+ cmd: [bunExe(), join(import.meta.dir, "process-onBeforeExit-keepAlive.js")],
+ env: bunEnv,
+ });
+ expect(exitCode).toBe(0);
+ expect(stdout.toString().trim()).toBe("beforeExit: 0\nbeforeExit: 1\nexit: 2");
+ });
+});