aboutsummaryrefslogtreecommitdiff
path: root/test/js/web/worker.test.ts
blob: 1babfbcc3096662397fd9cb1997d05b8b7cd1e9b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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, {
    smol: true,
  });
  expect(worker.threadId).toBe(1);
  worker.postMessage("hello");
  worker.onerror = e => {
    done(e.error);
  };
  worker.onmessage = e => {
    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();
      }
    }
  });
});