diff options
Diffstat (limited to '')
-rw-r--r-- | test/js/node/worker_threads/worker_threads.test.ts | 6 | ||||
-rw-r--r-- | test/js/web/many-messages-event-loop.js | 11 | ||||
-rw-r--r-- | test/js/web/worker-fixture-env.js | 12 | ||||
-rw-r--r-- | test/js/web/worker-fixture-many-messages.js | 12 | ||||
-rw-r--r-- | test/js/web/worker.test.ts | 111 |
5 files changed, 149 insertions, 3 deletions
diff --git a/test/js/node/worker_threads/worker_threads.test.ts b/test/js/node/worker_threads/worker_threads.test.ts index 3bee1a50e..ae88add17 100644 --- a/test/js/node/worker_threads/worker_threads.test.ts +++ b/test/js/node/worker_threads/worker_threads.test.ts @@ -50,12 +50,14 @@ test("all properties are present", () => { expect(Worker).toBeDefined(); expect(() => { + // @ts-expect-error no args wt.markAsUntransferable(); - }).toThrow("not implemented"); + }).toThrow("not yet implemented"); expect(() => { + // @ts-expect-error no args wt.moveMessagePortToContext(); - }).toThrow("not implemented"); + }).toThrow("not yet implemented"); }); test("receiveMessageOnPort works across threads", () => { diff --git a/test/js/web/many-messages-event-loop.js b/test/js/web/many-messages-event-loop.js new file mode 100644 index 000000000..2eaba2568 --- /dev/null +++ b/test/js/web/many-messages-event-loop.js @@ -0,0 +1,11 @@ +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) { + console.log("done"); + worker.terminate(); + } else { + worker.postMessage({ i: data.i + 1 }); + } +}); diff --git a/test/js/web/worker-fixture-env.js b/test/js/web/worker-fixture-env.js new file mode 100644 index 000000000..203ed3141 --- /dev/null +++ b/test/js/web/worker-fixture-env.js @@ -0,0 +1,12 @@ +import * as worker_threads from "worker_threads"; + +if (worker_threads.isMainThread) throw new Error("worker_threads.isMainThread is wrong"); + +Bun.inspect(process.env); + +onmessage = ({}) => { + postMessage({ + env: process.env, + hello: process.env.hello, + }); +}; diff --git a/test/js/web/worker-fixture-many-messages.js b/test/js/web/worker-fixture-many-messages.js new file mode 100644 index 000000000..7a8f1d910 --- /dev/null +++ b/test/js/web/worker-fixture-many-messages.js @@ -0,0 +1,12 @@ +addEventListener("message", e => { + const data = e.data; + // console.log("worker", data); + + if (data === "initial message") { + postMessage({ i: 0 }); + } else if (data.i > 50) { + postMessage({ done: true }); + } else { + postMessage({ i: data.i + 1 }); + } +}); 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(); + } + } + }); +}); |