aboutsummaryrefslogtreecommitdiff
path: root/test/js/web/timers
diff options
context:
space:
mode:
Diffstat (limited to 'test/js/web/timers')
-rw-r--r--test/js/web/timers/process-setImmediate-fixture.js9
-rw-r--r--test/js/web/timers/setImmediate.test.js27
-rw-r--r--test/js/web/timers/setTimeout-unref-fixture-2.js9
-rw-r--r--test/js/web/timers/setTimeout-unref-fixture-3.js7
-rw-r--r--test/js/web/timers/setTimeout-unref-fixture-4.js5
-rw-r--r--test/js/web/timers/setTimeout-unref-fixture-5.js5
-rw-r--r--test/js/web/timers/setTimeout-unref-fixture.js12
-rw-r--r--test/js/web/timers/setTimeout.test.js51
8 files changed, 123 insertions, 2 deletions
diff --git a/test/js/web/timers/process-setImmediate-fixture.js b/test/js/web/timers/process-setImmediate-fixture.js
new file mode 100644
index 000000000..6ffd91c8d
--- /dev/null
+++ b/test/js/web/timers/process-setImmediate-fixture.js
@@ -0,0 +1,9 @@
+setImmediate(() => {
+ console.log("setImmediate");
+ return {
+ a: 1,
+ b: 2,
+ c: 3,
+ d: 4,
+ };
+});
diff --git a/test/js/web/timers/setImmediate.test.js b/test/js/web/timers/setImmediate.test.js
index 9cd6fa1c9..d00224e0f 100644
--- a/test/js/web/timers/setImmediate.test.js
+++ b/test/js/web/timers/setImmediate.test.js
@@ -1,4 +1,6 @@
import { it, expect } from "bun:test";
+import { bunExe, bunEnv } from "harness";
+import path from "path";
it("setImmediate", async () => {
var lastID = -1;
@@ -45,3 +47,28 @@ it("clearImmediate", async () => {
});
expect(called).toBe(false);
});
+
+it("setImmediate should not keep the process alive forever", async () => {
+ let process = null;
+ const success = async () => {
+ process = Bun.spawn({
+ cmd: [bunExe(), "run", path.join(import.meta.dir, "process-setImmediate-fixture.js")],
+ stdout: "ignore",
+ env: {
+ ...bunEnv,
+ NODE_ENV: undefined,
+ },
+ });
+ await process.exited;
+ process = null;
+ return true;
+ };
+
+ const fail = async () => {
+ await Bun.sleep(500);
+ process?.kill();
+ return false;
+ };
+
+ expect(await Promise.race([success(), fail()])).toBe(true);
+});
diff --git a/test/js/web/timers/setTimeout-unref-fixture-2.js b/test/js/web/timers/setTimeout-unref-fixture-2.js
new file mode 100644
index 000000000..6a78f13cd
--- /dev/null
+++ b/test/js/web/timers/setTimeout-unref-fixture-2.js
@@ -0,0 +1,9 @@
+setTimeout(() => {
+ console.log("TEST FAILED!");
+}, 100)
+ .ref()
+ .unref();
+
+setTimeout(() => {
+ // this one should always run
+}, 1);
diff --git a/test/js/web/timers/setTimeout-unref-fixture-3.js b/test/js/web/timers/setTimeout-unref-fixture-3.js
new file mode 100644
index 000000000..41808f5fc
--- /dev/null
+++ b/test/js/web/timers/setTimeout-unref-fixture-3.js
@@ -0,0 +1,7 @@
+setTimeout(() => {
+ setTimeout(() => {}, 999_999);
+}, 100).unref();
+
+setTimeout(() => {
+ // this one should always run
+}, 1);
diff --git a/test/js/web/timers/setTimeout-unref-fixture-4.js b/test/js/web/timers/setTimeout-unref-fixture-4.js
new file mode 100644
index 000000000..9968f3b36
--- /dev/null
+++ b/test/js/web/timers/setTimeout-unref-fixture-4.js
@@ -0,0 +1,5 @@
+setTimeout(() => {
+ console.log("TEST PASSED!");
+}, 1)
+ .unref()
+ .ref();
diff --git a/test/js/web/timers/setTimeout-unref-fixture-5.js b/test/js/web/timers/setTimeout-unref-fixture-5.js
new file mode 100644
index 000000000..e5caa1be4
--- /dev/null
+++ b/test/js/web/timers/setTimeout-unref-fixture-5.js
@@ -0,0 +1,5 @@
+setTimeout(() => {
+ console.log("TEST FAILED!");
+}, 100)
+ .ref()
+ .unref();
diff --git a/test/js/web/timers/setTimeout-unref-fixture.js b/test/js/web/timers/setTimeout-unref-fixture.js
new file mode 100644
index 000000000..97a0f78a2
--- /dev/null
+++ b/test/js/web/timers/setTimeout-unref-fixture.js
@@ -0,0 +1,12 @@
+const timer = setTimeout(() => {}, 999_999_999);
+if (timer.unref() !== timer) throw new Error("Expected timer.unref() === timer");
+
+var ranCount = 0;
+const going2Refresh = setTimeout(() => {
+ if (ranCount < 1) going2Refresh.refresh();
+ ranCount++;
+
+ if (ranCount === 2) {
+ console.log("SUCCESS");
+ }
+}, 1);
diff --git a/test/js/web/timers/setTimeout.test.js b/test/js/web/timers/setTimeout.test.js
index dbe89dea8..eef6bbae0 100644
--- a/test/js/web/timers/setTimeout.test.js
+++ b/test/js/web/timers/setTimeout.test.js
@@ -1,5 +1,7 @@
+import { spawnSync } from "bun";
import { it, expect } from "bun:test";
-
+import { bunEnv, bunExe } from "harness";
+import path from "node:path";
it("setTimeout", async () => {
var lastID = -1;
const result = await new Promise((resolve, reject) => {
@@ -172,11 +174,56 @@ it.skip("order of setTimeouts", done => {
Promise.resolve().then(maybeDone(() => nums.push(1)));
});
+it("setTimeout -> refresh", () => {
+ const { exitCode, stdout } = spawnSync({
+ cmd: [bunExe(), path.join(import.meta.dir, "setTimeout-unref-fixture.js")],
+ env: bunEnv,
+ });
+ expect(exitCode).toBe(0);
+ expect(stdout.toString()).toBe("SUCCESS\n");
+});
+
+it("setTimeout -> unref -> ref works", () => {
+ const { exitCode, stdout } = spawnSync({
+ cmd: [bunExe(), path.join(import.meta.dir, "setTimeout-unref-fixture-4.js")],
+ env: bunEnv,
+ });
+ expect(exitCode).toBe(0);
+ expect(stdout.toString()).toBe("TEST PASSED!\n");
+});
+
+it("setTimeout -> ref -> unref works, even if there is another timer", () => {
+ const { exitCode, stdout } = spawnSync({
+ cmd: [bunExe(), path.join(import.meta.dir, "setTimeout-unref-fixture-2.js")],
+ env: bunEnv,
+ });
+ expect(exitCode).toBe(0);
+ expect(stdout.toString()).toBe("");
+});
+
+it("setTimeout -> ref -> unref works", () => {
+ const { exitCode, stdout } = spawnSync({
+ cmd: [bunExe(), path.join(import.meta.dir, "setTimeout-unref-fixture-5.js")],
+ env: bunEnv,
+ });
+ expect(exitCode).toBe(0);
+ expect(stdout.toString()).toBe("");
+});
+
+it("setTimeout -> unref doesn't keep event loop alive forever", () => {
+ const { exitCode, stdout } = spawnSync({
+ cmd: [bunExe(), path.join(import.meta.dir, "setTimeout-unref-fixture-3.js")],
+ env: bunEnv,
+ });
+ expect(exitCode).toBe(0);
+ expect(stdout.toString()).toBe("");
+});
+
it("setTimeout should refresh N times", done => {
let count = 0;
let timer = setTimeout(() => {
count++;
- timer.refresh();
+ expect(timer.refresh()).toBe(timer);
}, 50);
setTimeout(() => {