diff options
Diffstat (limited to 'cli')
-rw-r--r-- | cli/bench/main.rs | 2 | ||||
-rw-r--r-- | cli/tests/workers/bench_large_message.ts (renamed from cli/tests/workers_large_message_bench.ts) | 12 | ||||
-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 |
6 files changed, 75 insertions, 28 deletions
diff --git a/cli/bench/main.rs b/cli/bench/main.rs index b98a9d141..e15f76277 100644 --- a/cli/bench/main.rs +++ b/cli/bench/main.rs @@ -75,7 +75,7 @@ const EXEC_TIME_BENCHMARKS: &[(&str, &[&str], Option<i32>)] = &[ &[ "run", "--allow-read", - "cli/tests/workers_large_message_bench.ts", + "cli/tests/workers/bench_large_message.ts", ], None, ), diff --git a/cli/tests/workers_large_message_bench.ts b/cli/tests/workers/bench_large_message.ts index 9cda5a40d..53076e711 100644 --- a/cli/tests/workers_large_message_bench.ts +++ b/cli/tests/workers/bench_large_message.ts @@ -1,14 +1,10 @@ // Copyright 2020 the Deno authors. All rights reserved. MIT license. -// deno-lint-ignore-file - -import { deferred } from "../../test_util/std/async/deferred.ts"; - -function oneWorker(i: any): Promise<void> { +function oneWorker(i: number) { return new Promise<void>((resolve) => { let countDown = 10; const worker = new Worker( - new URL("workers/large_message_worker.js", import.meta.url).href, + new URL("worker_large_message.js", import.meta.url).href, { type: "module" }, ); worker.onmessage = (e): void => { @@ -23,8 +19,8 @@ function oneWorker(i: any): Promise<void> { }); } -function bench(): Promise<any> { - let promises = []; +function bench() { + const promises = []; for (let i = 0; i < 50; i++) { promises.push(oneWorker(i)); } 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); +}; |