aboutsummaryrefslogtreecommitdiff
path: root/test/js/web/worker.test.ts
diff options
context:
space:
mode:
authorGravatar dave caruso <me@paperdave.net> 2023-08-07 23:58:38 -0700
committerGravatar GitHub <noreply@github.com> 2023-08-07 23:58:38 -0700
commit5497accbdb14da9e361175ad1cd074731b7f8eeb (patch)
tree994424356f9059b1171f410a9689f2d00bf89f6b /test/js/web/worker.test.ts
parent182e600eb79655e85b3f0371bc46fc4de8e70094 (diff)
downloadbun-5497accbdb14da9e361175ad1cd074731b7f8eeb.tar.gz
bun-5497accbdb14da9e361175ad1cd074731b7f8eeb.tar.zst
bun-5497accbdb14da9e361175ad1cd074731b7f8eeb.zip
Add `env` option for `node:worker_threads` (#4052)
* almost works * env stuff * test fixes * wtfmove * ok * ok * ref by default * it now does the ref stuff by default * cool
Diffstat (limited to '')
-rw-r--r--test/js/web/worker.test.ts111
1 files changed, 110 insertions, 1 deletions
diff --git a/test/js/web/worker.test.ts b/test/js/web/worker.test.ts
index 87dcf0911..1babfbcc3 100644
--- a/test/js/web/worker.test.ts
+++ b/test/js/web/worker.test.ts
@@ -1,4 +1,6 @@
import { expect, test } from "bun:test";
+import { bunEnv, bunExe } from "harness";
+import path from "path";
test("worker", done => {
const worker = new Worker(new URL("worker-fixture.js", import.meta.url).href, {
@@ -10,8 +12,115 @@ test("worker", done => {
done(e.error);
};
worker.onmessage = e => {
- expect(e.data).toEqual("initial message");
+ try {
+ expect(e.data).toEqual("initial message");
+ } catch (e) {
+ done(e);
+ } finally {
+ worker.terminate();
+ done();
+ }
worker.terminate();
done();
};
});
+
+test("worker-env", done => {
+ const worker = new Worker(new URL("worker-fixture-env.js", import.meta.url).href, {
+ env: {
+ hello: "world",
+ another_key: 123 as any,
+ },
+ });
+ worker.postMessage("hello");
+ worker.onerror = e => {
+ done(e.error);
+ };
+ worker.onmessage = e => {
+ try {
+ expect(e.data).toEqual({
+ env: {
+ hello: "world",
+ another_key: "123",
+ },
+ hello: "world",
+ });
+ } catch (e) {
+ done(e);
+ } finally {
+ worker.terminate();
+ done();
+ }
+ };
+});
+
+test("worker-env with a lot of properties", done => {
+ const obj: any = {};
+
+ for (let i = 0; i < 1000; i++) {
+ obj["prop " + i] = Math.random().toString();
+ }
+
+ const worker = new Worker(new URL("worker-fixture-env.js", import.meta.url).href, {
+ env: obj,
+ });
+ worker.postMessage("hello");
+ worker.onerror = e => {
+ done(e.error);
+ };
+ worker.onmessage = e => {
+ try {
+ expect(e.data).toEqual({
+ env: obj,
+ hello: undefined,
+ });
+ } catch (e) {
+ done(e);
+ } finally {
+ worker.terminate();
+ done();
+ }
+ };
+});
+
+test("sending 50 messages should just work", done => {
+ const worker = new Worker(new URL("worker-fixture-many-messages.js", import.meta.url).href, {});
+
+ worker.postMessage("initial message");
+ worker.addEventListener("message", ({ data }) => {
+ if (data.done) {
+ worker.terminate();
+ done();
+ } else {
+ worker.postMessage({ i: data.i + 1 });
+ }
+ });
+});
+
+test("worker by default will not close the event loop", done => {
+ const x = Bun.spawn({
+ cmd: [bunExe(), path.join(import.meta.dir, "many-messages-event-loop.js")],
+ env: bunEnv,
+ stdio: ["inherit", "pipe", "inherit"],
+ });
+
+ const timer = setTimeout(() => {
+ x.kill();
+ done(new Error("timeout"));
+ }, 1000);
+
+ x.exited.then(async code => {
+ clearTimeout(timer);
+ if (code !== 0) {
+ done(new Error("exited with non-zero code"));
+ } else {
+ const text = await new Response(x.stdout).text();
+ if (text.includes("done")) {
+ console.log({ text });
+ done(new Error("event loop killed early"));
+ } else {
+ done();
+ }
+ }
+ });
+});