diff options
author | 2023-08-07 23:58:38 -0700 | |
---|---|---|
committer | 2023-08-07 23:58:38 -0700 | |
commit | 5497accbdb14da9e361175ad1cd074731b7f8eeb (patch) | |
tree | 994424356f9059b1171f410a9689f2d00bf89f6b /test/js/web/worker.test.ts | |
parent | 182e600eb79655e85b3f0371bc46fc4de8e70094 (diff) | |
download | bun-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.ts | 111 |
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(); + } + } + }); +}); |