summaryrefslogtreecommitdiff
path: root/cli/tests/workers
diff options
context:
space:
mode:
Diffstat (limited to 'cli/tests/workers')
-rw-r--r--cli/tests/workers/bench_large_message.ts31
-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, 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);
+};