diff options
Diffstat (limited to 'cli/tests/workers')
-rw-r--r-- | cli/tests/workers/bench_large_message.ts | 31 | ||||
-rw-r--r-- | cli/tests/workers/racy_worker.js | 34 | ||||
-rw-r--r-- | cli/tests/workers/test.ts | 40 | ||||
-rw-r--r-- | cli/tests/workers/worker_large_message.js (renamed from cli/tests/workers/large_message_worker.js) | 0 | ||||
-rw-r--r-- | cli/tests/workers/worker_structured_cloning.ts | 15 |
5 files changed, 101 insertions, 19 deletions
diff --git a/cli/tests/workers/bench_large_message.ts b/cli/tests/workers/bench_large_message.ts new file mode 100644 index 000000000..53076e711 --- /dev/null +++ b/cli/tests/workers/bench_large_message.ts @@ -0,0 +1,31 @@ +// Copyright 2020 the Deno authors. All rights reserved. MIT license. + +function oneWorker(i: number) { + return new Promise<void>((resolve) => { + let countDown = 10; + const worker = new Worker( + new URL("worker_large_message.js", import.meta.url).href, + { type: "module" }, + ); + worker.onmessage = (e): void => { + if (countDown > 0) { + countDown--; + return; + } + worker.terminate(); + resolve(); + }; + worker.postMessage("hi " + i); + }); +} + +function bench() { + const promises = []; + for (let i = 0; i < 50; i++) { + promises.push(oneWorker(i)); + } + + return Promise.all(promises); +} + +bench(); diff --git a/cli/tests/workers/racy_worker.js b/cli/tests/workers/racy_worker.js index 83756b791..0f66c6278 100644 --- a/cli/tests/workers/racy_worker.js +++ b/cli/tests/workers/racy_worker.js @@ -1,21 +1,25 @@ // See issue for details // https://github.com/denoland/deno/issues/4080 // -// After first call to `postMessage() this worker schedules -// [close(), postMessage()] ops on the same turn of microtask queue -// (because message is rather big). -// Only single `postMessage()` call should make it -// to host, ie. after calling `close()` no more code should be run. +// After first received message, this worker schedules +// [assert(), close(), assert()] ops on the same turn of microtask queue +// All tasks after close should not make it -setTimeout(() => { - close(); -}, 50); - -while (true) { - await new Promise((done) => { +onmessage = async function () { + let stage = 0; + await new Promise((_) => { + setTimeout(() => { + if (stage !== 0) throw "Unexpected stage"; + stage = 1; + }, 50); + setTimeout(() => { + if (stage !== 1) throw "Unexpected stage"; + stage = 2; + postMessage("DONE"); + close(); + }, 50); setTimeout(() => { - postMessage({ buf: new Array(999999) }); - done(); - }); + throw "This should not be run"; + }, 50); }); -} +}; diff --git a/cli/tests/workers/test.ts b/cli/tests/workers/test.ts index c3ccebfbb..41988d204 100644 --- a/cli/tests/workers/test.ts +++ b/cli/tests/workers/test.ts @@ -198,15 +198,12 @@ Deno.test({ ); racyWorker.onmessage = (e): void => { - assertEquals(e.data.buf.length, 999999); - racyWorker.onmessage = (_e): void => { - throw new Error("unreachable"); - }; setTimeout(() => { promise.resolve(); }, 100); }; + racyWorker.postMessage("START"); await promise; }, }); @@ -726,3 +723,38 @@ Deno.test({ worker.terminate(); }, }); + +Deno.test({ + name: "structured cloning postMessage", + fn: async function (): Promise<void> { + const result = deferred(); + const worker = new Worker( + new URL("worker_structured_cloning.ts", import.meta.url).href, + { type: "module" }, + ); + + worker.onmessage = (e): void => { + // self field should reference itself (circular ref) + const value = e.data.self.self.self; + + // fields a and b refer to the same array + assertEquals(value.a, ["a", true, 432]); + assertEquals(value.a, ["a", true, 432]); + value.b[0] = "b"; + value.a[2] += 5; + assertEquals(value.a, ["b", true, 437]); + assertEquals(value.b, ["b", true, 437]); + + const len = value.c.size; + value.c.add(1); // This value is already in the set. + value.c.add(2); + assertEquals(len + 1, value.c.size); + + result.resolve(); + }; + + worker.postMessage("START"); + await result; + worker.terminate(); + }, +}); diff --git a/cli/tests/workers/large_message_worker.js b/cli/tests/workers/worker_large_message.js index f7b7da8a0..f7b7da8a0 100644 --- a/cli/tests/workers/large_message_worker.js +++ b/cli/tests/workers/worker_large_message.js diff --git a/cli/tests/workers/worker_structured_cloning.ts b/cli/tests/workers/worker_structured_cloning.ts new file mode 100644 index 000000000..eb1719a9a --- /dev/null +++ b/cli/tests/workers/worker_structured_cloning.ts @@ -0,0 +1,15 @@ +// More info on structured cloning can be found here: +// https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm + +self.onmessage = () => { + const arr = ["a", true, 432]; + const set = new Set([1, 3, 5, 7, 9]); + const selfReference = { + a: arr, + b: arr, + c: set, + }; + // deno-lint-ignore no-explicit-any + (selfReference as any).self = selfReference; + self.postMessage(selfReference); +}; |