summaryrefslogtreecommitdiff
path: root/cli/tests
diff options
context:
space:
mode:
Diffstat (limited to 'cli/tests')
-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.js34
-rw-r--r--cli/tests/workers/test.ts40
-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.ts15
5 files changed, 74 insertions, 27 deletions
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);
+};