summaryrefslogtreecommitdiff
path: root/tests/specs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/specs')
-rw-r--r--tests/specs/worker/_084_worker_custom_inspect/__test__.jsonc4
-rw-r--r--tests/specs/worker/_084_worker_custom_inspect/custom_inspect/main.out1
-rw-r--r--tests/specs/worker/_084_worker_custom_inspect/custom_inspect/main.ts4
-rw-r--r--tests/specs/worker/_084_worker_custom_inspect/custom_inspect/worker.ts2
-rw-r--r--tests/specs/worker/error_worker_permissions_local/__test__.jsonc5
-rw-r--r--tests/specs/worker/error_worker_permissions_local/error_worker_permissions_local.ts4
-rw-r--r--tests/specs/worker/error_worker_permissions_local/error_worker_permissions_local.ts.out2
-rw-r--r--tests/specs/worker/error_worker_permissions_local/worker_types.ts4
-rw-r--r--tests/specs/worker/error_worker_permissions_remote/__test__.jsonc5
-rw-r--r--tests/specs/worker/error_worker_permissions_remote/error_worker_permissions_remote.ts4
-rw-r--r--tests/specs/worker/error_worker_permissions_remote/error_worker_permissions_remote.ts.out2
-rw-r--r--tests/specs/worker/nonexistent_worker/__test__.jsonc5
-rw-r--r--tests/specs/worker/nonexistent_worker/nonexistent_worker.out3
-rw-r--r--tests/specs/worker/nonexistent_worker/nonexistent_worker.ts5
-rw-r--r--tests/specs/worker/worker_async_error/__test__.jsonc5
-rw-r--r--tests/specs/worker/worker_async_error/async_error.ts4
-rw-r--r--tests/specs/worker/worker_async_error/worker_async_error.ts5
-rw-r--r--tests/specs/worker/worker_async_error/worker_async_error.ts.out7
-rw-r--r--tests/specs/worker/worker_doest_stall_event_loop/__test__.jsonc5
-rw-r--r--tests/specs/worker/worker_doest_stall_event_loop/worker_doest_stall_event_loop.ts29
-rw-r--r--tests/specs/worker/worker_doest_stall_event_loop/worker_doest_stall_event_loop.ts.out6
-rw-r--r--tests/specs/worker/worker_error/__test__.jsonc5
-rw-r--r--tests/specs/worker/worker_error/error.ts5
-rw-r--r--tests/specs/worker/worker_error/worker_error.ts5
-rw-r--r--tests/specs/worker/worker_error/worker_error.ts.out5
-rw-r--r--tests/specs/worker/worker_error_event/__test__.jsonc5
-rw-r--r--tests/specs/worker/worker_error_event/error.ts5
-rw-r--r--tests/specs/worker/worker_error_event/error_event.ts11
-rw-r--r--tests/specs/worker/worker_error_event/error_event.ts.out13
-rw-r--r--tests/specs/worker/worker_ids_are_sequential/__test__.jsonc5
-rw-r--r--tests/specs/worker/worker_ids_are_sequential/worker_ids_are_sequential.ts34
-rw-r--r--tests/specs/worker/worker_ids_are_sequential/worker_ids_are_sequential.ts.out4
-rw-r--r--tests/specs/worker/worker_message_handler_error/__test__.jsonc5
-rw-r--r--tests/specs/worker/worker_message_handler_error/message_handler_error.ts4
-rw-r--r--tests/specs/worker/worker_message_handler_error/worker_message_handler_error.ts8
-rw-r--r--tests/specs/worker/worker_message_handler_error/worker_message_handler_error.ts.out7
-rw-r--r--tests/specs/worker/worker_nested_error/__test__.jsonc5
-rw-r--r--tests/specs/worker/worker_nested_error/error.ts5
-rw-r--r--tests/specs/worker/worker_nested_error/worker_error.ts5
-rw-r--r--tests/specs/worker/worker_nested_error/worker_nested_error.ts5
-rw-r--r--tests/specs/worker/worker_nested_error/worker_nested_error.ts.out9
-rw-r--r--tests/specs/worker/worker_permissions_blob_local/__test__.jsonc5
-rw-r--r--tests/specs/worker/worker_permissions_blob_local/permissions_blob_local.ts6
-rw-r--r--tests/specs/worker/worker_permissions_blob_local/permissions_blob_local.ts.out4
-rw-r--r--tests/specs/worker/worker_permissions_blob_remote/__test__.jsonc5
-rw-r--r--tests/specs/worker/worker_permissions_blob_remote/permissions_blob_remote.ts4
-rw-r--r--tests/specs/worker/worker_permissions_blob_remote/permissions_blob_remote.ts.out4
-rw-r--r--tests/specs/worker/worker_permissions_data_local/__test__.jsonc5
-rw-r--r--tests/specs/worker/worker_permissions_data_local/permissions_data_local.ts7
-rw-r--r--tests/specs/worker/worker_permissions_data_local/permissions_data_local.ts.out4
-rw-r--r--tests/specs/worker/worker_permissions_data_remote/__test__.jsonc5
-rw-r--r--tests/specs/worker/worker_permissions_data_remote/permissions_data_remote.ts5
-rw-r--r--tests/specs/worker/worker_permissions_data_remote/permissions_data_remote.ts.out4
-rw-r--r--tests/specs/worker/worker_permissions_dynamic_remote/__test__.jsonc5
-rw-r--r--tests/specs/worker/worker_permissions_remote_remote/__test__.jsonc5
-rw-r--r--tests/specs/worker/worker_permissions_remote_remote/permissions_remote_remote.ts.out4
-rw-r--r--tests/specs/worker/worker_terminate_tla_crash/__test__.jsonc4
-rw-r--r--tests/specs/worker/worker_terminate_tla_crash/terminate_tla_crash.js21
-rw-r--r--tests/specs/worker/worker_terminate_tla_crash/terminate_tla_crash.js.out0
59 files changed, 358 insertions, 0 deletions
diff --git a/tests/specs/worker/_084_worker_custom_inspect/__test__.jsonc b/tests/specs/worker/_084_worker_custom_inspect/__test__.jsonc
new file mode 100644
index 000000000..8d47afab4
--- /dev/null
+++ b/tests/specs/worker/_084_worker_custom_inspect/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-read custom_inspect/main.ts",
+ "output": "custom_inspect/main.out"
+}
diff --git a/tests/specs/worker/_084_worker_custom_inspect/custom_inspect/main.out b/tests/specs/worker/_084_worker_custom_inspect/custom_inspect/main.out
new file mode 100644
index 000000000..40d9b88ad
--- /dev/null
+++ b/tests/specs/worker/_084_worker_custom_inspect/custom_inspect/main.out
@@ -0,0 +1 @@
+ReadableStream { locked: false }
diff --git a/tests/specs/worker/_084_worker_custom_inspect/custom_inspect/main.ts b/tests/specs/worker/_084_worker_custom_inspect/custom_inspect/main.ts
new file mode 100644
index 000000000..93d4eec2d
--- /dev/null
+++ b/tests/specs/worker/_084_worker_custom_inspect/custom_inspect/main.ts
@@ -0,0 +1,4 @@
+new Worker(
+ import.meta.resolve("./worker.ts"),
+ { type: "module" },
+);
diff --git a/tests/specs/worker/_084_worker_custom_inspect/custom_inspect/worker.ts b/tests/specs/worker/_084_worker_custom_inspect/custom_inspect/worker.ts
new file mode 100644
index 000000000..5be82724e
--- /dev/null
+++ b/tests/specs/worker/_084_worker_custom_inspect/custom_inspect/worker.ts
@@ -0,0 +1,2 @@
+console.log(new ReadableStream());
+close();
diff --git a/tests/specs/worker/error_worker_permissions_local/__test__.jsonc b/tests/specs/worker/error_worker_permissions_local/__test__.jsonc
new file mode 100644
index 000000000..a36e19fa6
--- /dev/null
+++ b/tests/specs/worker/error_worker_permissions_local/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload error_worker_permissions_local.ts",
+ "output": "error_worker_permissions_local.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/worker/error_worker_permissions_local/error_worker_permissions_local.ts b/tests/specs/worker/error_worker_permissions_local/error_worker_permissions_local.ts
new file mode 100644
index 000000000..1a4b4c0a9
--- /dev/null
+++ b/tests/specs/worker/error_worker_permissions_local/error_worker_permissions_local.ts
@@ -0,0 +1,4 @@
+new Worker(
+ import.meta.resolve("../subdir/worker_types.ts"),
+ { type: "module" },
+);
diff --git a/tests/specs/worker/error_worker_permissions_local/error_worker_permissions_local.ts.out b/tests/specs/worker/error_worker_permissions_local/error_worker_permissions_local.ts.out
new file mode 100644
index 000000000..cacc8ae38
--- /dev/null
+++ b/tests/specs/worker/error_worker_permissions_local/error_worker_permissions_local.ts.out
@@ -0,0 +1,2 @@
+error: Uncaught (in worker "") Requires read access to "[WILDCARD]worker_types.ts", run again with the --allow-read flag
+[WILDCARD]
diff --git a/tests/specs/worker/error_worker_permissions_local/worker_types.ts b/tests/specs/worker/error_worker_permissions_local/worker_types.ts
new file mode 100644
index 000000000..b67a3b782
--- /dev/null
+++ b/tests/specs/worker/error_worker_permissions_local/worker_types.ts
@@ -0,0 +1,4 @@
+// deno-lint-ignore require-await
+self.onmessage = async (_msg: MessageEvent) => {
+ self.postMessage("hello");
+};
diff --git a/tests/specs/worker/error_worker_permissions_remote/__test__.jsonc b/tests/specs/worker/error_worker_permissions_remote/__test__.jsonc
new file mode 100644
index 000000000..06a439fd4
--- /dev/null
+++ b/tests/specs/worker/error_worker_permissions_remote/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload error_worker_permissions_remote.ts",
+ "output": "error_worker_permissions_remote.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/worker/error_worker_permissions_remote/error_worker_permissions_remote.ts b/tests/specs/worker/error_worker_permissions_remote/error_worker_permissions_remote.ts
new file mode 100644
index 000000000..878c7080a
--- /dev/null
+++ b/tests/specs/worker/error_worker_permissions_remote/error_worker_permissions_remote.ts
@@ -0,0 +1,4 @@
+new Worker(
+ "http://localhost:4545/subdir/worker_types.ts",
+ { type: "module" },
+);
diff --git a/tests/specs/worker/error_worker_permissions_remote/error_worker_permissions_remote.ts.out b/tests/specs/worker/error_worker_permissions_remote/error_worker_permissions_remote.ts.out
new file mode 100644
index 000000000..afecff0a8
--- /dev/null
+++ b/tests/specs/worker/error_worker_permissions_remote/error_worker_permissions_remote.ts.out
@@ -0,0 +1,2 @@
+error: Uncaught (in worker "") Requires net access to "localhost:4545", run again with the --allow-net flag
+[WILDCARD]
diff --git a/tests/specs/worker/nonexistent_worker/__test__.jsonc b/tests/specs/worker/nonexistent_worker/__test__.jsonc
new file mode 100644
index 000000000..eada83352
--- /dev/null
+++ b/tests/specs/worker/nonexistent_worker/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --allow-read nonexistent_worker.ts",
+ "output": "nonexistent_worker.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/worker/nonexistent_worker/nonexistent_worker.out b/tests/specs/worker/nonexistent_worker/nonexistent_worker.out
new file mode 100644
index 000000000..977d2af48
--- /dev/null
+++ b/tests/specs/worker/nonexistent_worker/nonexistent_worker.out
@@ -0,0 +1,3 @@
+[WILDCARD]error: Uncaught (in worker "") Module not found "file:///[WILDCARD]/doesnt_exist.js".
+error: Uncaught (in promise) Error: Unhandled error in child worker.
+ at Worker.#pollControl[WILDCARD]
diff --git a/tests/specs/worker/nonexistent_worker/nonexistent_worker.ts b/tests/specs/worker/nonexistent_worker/nonexistent_worker.ts
new file mode 100644
index 000000000..b30d08636
--- /dev/null
+++ b/tests/specs/worker/nonexistent_worker/nonexistent_worker.ts
@@ -0,0 +1,5 @@
+const w = new Worker(import.meta.resolve("./doesnt_exist.js"), {
+ type: "module",
+});
+
+w.postMessage("hello");
diff --git a/tests/specs/worker/worker_async_error/__test__.jsonc b/tests/specs/worker/worker_async_error/__test__.jsonc
new file mode 100644
index 000000000..0e48d3f32
--- /dev/null
+++ b/tests/specs/worker/worker_async_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run -A --quiet --reload worker_async_error.ts",
+ "output": "worker_async_error.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/worker/worker_async_error/async_error.ts b/tests/specs/worker/worker_async_error/async_error.ts
new file mode 100644
index 000000000..154b957b1
--- /dev/null
+++ b/tests/specs/worker/worker_async_error/async_error.ts
@@ -0,0 +1,4 @@
+// deno-lint-ignore require-await
+(async () => {
+ throw new Error("bar");
+})();
diff --git a/tests/specs/worker/worker_async_error/worker_async_error.ts b/tests/specs/worker/worker_async_error/worker_async_error.ts
new file mode 100644
index 000000000..7941a5bbe
--- /dev/null
+++ b/tests/specs/worker/worker_async_error/worker_async_error.ts
@@ -0,0 +1,5 @@
+const worker = new Worker(
+ import.meta.resolve("./async_error.ts"),
+ { type: "module", name: "foo" },
+);
+setTimeout(() => worker.terminate(), 30000);
diff --git a/tests/specs/worker/worker_async_error/worker_async_error.ts.out b/tests/specs/worker/worker_async_error/worker_async_error.ts.out
new file mode 100644
index 000000000..8d017859c
--- /dev/null
+++ b/tests/specs/worker/worker_async_error/worker_async_error.ts.out
@@ -0,0 +1,7 @@
+error: Uncaught (in worker "foo") (in promise) Error: bar
+ throw new Error("bar");
+ ^
+ at [WILDCARD]/async_error.ts:[WILDCARD]
+ at [WILDCARD]/async_error.ts:[WILDCARD]
+error: Uncaught (in promise) Error: Unhandled error in child worker.
+ at Worker.#pollControl [WILDCARD]
diff --git a/tests/specs/worker/worker_doest_stall_event_loop/__test__.jsonc b/tests/specs/worker/worker_doest_stall_event_loop/__test__.jsonc
new file mode 100644
index 000000000..a5ccc6cab
--- /dev/null
+++ b/tests/specs/worker/worker_doest_stall_event_loop/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet -A worker_doest_stall_event_loop.ts",
+ "output": "worker_doest_stall_event_loop.ts.out",
+ "exitCode": 0
+}
diff --git a/tests/specs/worker/worker_doest_stall_event_loop/worker_doest_stall_event_loop.ts b/tests/specs/worker/worker_doest_stall_event_loop/worker_doest_stall_event_loop.ts
new file mode 100644
index 000000000..bfddee2ec
--- /dev/null
+++ b/tests/specs/worker/worker_doest_stall_event_loop/worker_doest_stall_event_loop.ts
@@ -0,0 +1,29 @@
+const moduleCode = `
+console.log('module start');
+const hash = await crypto.subtle.digest('SHA-1', new TextEncoder().encode('data'));
+const __default = {};
+export { __default as default };
+console.log('module finish');
+`;
+
+const workerCode = `
+ console.log('worker!');
+
+ globalThis.onmessage = (msg) => {
+ const { moduleCode } = msg.data;
+ (async () => {
+ console.log('before import');
+ await import(URL.createObjectURL(new Blob([ moduleCode ])));
+ console.log('after import');
+ self.postMessage('thanks');
+ })();
+ }
+`;
+const worker = new Worker(URL.createObjectURL(new Blob([workerCode])), {
+ type: "module",
+});
+worker.onmessage = () => {
+ console.log("worker.terminate");
+ worker.terminate();
+};
+worker.postMessage({ moduleCode });
diff --git a/tests/specs/worker/worker_doest_stall_event_loop/worker_doest_stall_event_loop.ts.out b/tests/specs/worker/worker_doest_stall_event_loop/worker_doest_stall_event_loop.ts.out
new file mode 100644
index 000000000..5ed65b02f
--- /dev/null
+++ b/tests/specs/worker/worker_doest_stall_event_loop/worker_doest_stall_event_loop.ts.out
@@ -0,0 +1,6 @@
+worker!
+before import
+module start
+module finish
+after import
+worker.terminate
diff --git a/tests/specs/worker/worker_error/__test__.jsonc b/tests/specs/worker/worker_error/__test__.jsonc
new file mode 100644
index 000000000..9c50a7856
--- /dev/null
+++ b/tests/specs/worker/worker_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run -A worker_error.ts",
+ "output": "worker_error.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/worker/worker_error/error.ts b/tests/specs/worker/worker_error/error.ts
new file mode 100644
index 000000000..495971090
--- /dev/null
+++ b/tests/specs/worker/worker_error/error.ts
@@ -0,0 +1,5 @@
+function foo() {
+ throw new Error("foo");
+}
+
+foo();
diff --git a/tests/specs/worker/worker_error/worker_error.ts b/tests/specs/worker/worker_error/worker_error.ts
new file mode 100644
index 000000000..403223d0a
--- /dev/null
+++ b/tests/specs/worker/worker_error/worker_error.ts
@@ -0,0 +1,5 @@
+const worker = new Worker(
+ import.meta.resolve("./error.ts"),
+ { type: "module", name: "bar" },
+);
+setTimeout(() => worker.terminate(), 30000);
diff --git a/tests/specs/worker/worker_error/worker_error.ts.out b/tests/specs/worker/worker_error/worker_error.ts.out
new file mode 100644
index 000000000..1dd017770
--- /dev/null
+++ b/tests/specs/worker/worker_error/worker_error.ts.out
@@ -0,0 +1,5 @@
+[WILDCARD]error: Uncaught (in worker "bar") (in promise) Error: foo[WILDCARD]
+ at foo ([WILDCARD])
+ at [WILDCARD]
+error: Uncaught (in promise) Error: Unhandled error in child worker.
+ at Worker.#pollControl [WILDCARD]
diff --git a/tests/specs/worker/worker_error_event/__test__.jsonc b/tests/specs/worker/worker_error_event/__test__.jsonc
new file mode 100644
index 000000000..a05481a13
--- /dev/null
+++ b/tests/specs/worker/worker_error_event/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet -A error_event.ts",
+ "output": "error_event.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/worker/worker_error_event/error.ts b/tests/specs/worker/worker_error_event/error.ts
new file mode 100644
index 000000000..495971090
--- /dev/null
+++ b/tests/specs/worker/worker_error_event/error.ts
@@ -0,0 +1,5 @@
+function foo() {
+ throw new Error("foo");
+}
+
+foo();
diff --git a/tests/specs/worker/worker_error_event/error_event.ts b/tests/specs/worker/worker_error_event/error_event.ts
new file mode 100644
index 000000000..70e7728ab
--- /dev/null
+++ b/tests/specs/worker/worker_error_event/error_event.ts
@@ -0,0 +1,11 @@
+const worker = new Worker(import.meta.resolve("./error.ts"), {
+ type: "module",
+});
+worker.addEventListener("error", (e) => {
+ console.log({
+ "message": e.message,
+ "filename": e.filename?.slice?.(-100),
+ "lineno": e.lineno,
+ "colno": e.colno,
+ });
+});
diff --git a/tests/specs/worker/worker_error_event/error_event.ts.out b/tests/specs/worker/worker_error_event/error_event.ts.out
new file mode 100644
index 000000000..833cca8be
--- /dev/null
+++ b/tests/specs/worker/worker_error_event/error_event.ts.out
@@ -0,0 +1,13 @@
+error: Uncaught (in worker "") (in promise) Error: foo
+ throw new Error("foo");
+ ^
+ at foo ([WILDCARD]/error.ts:2:9)
+ at [WILDCARD]/error.ts:5:1
+{
+ message: "Uncaught (in promise) Error: foo",
+ filename: "[WILDCARD]/error.ts",
+ lineno: 2,
+ colno: 9
+}
+error: Uncaught (in promise) Error: Unhandled error in child worker.
+ at [WILDCARD]
diff --git a/tests/specs/worker/worker_ids_are_sequential/__test__.jsonc b/tests/specs/worker/worker_ids_are_sequential/__test__.jsonc
new file mode 100644
index 000000000..b90bebac8
--- /dev/null
+++ b/tests/specs/worker/worker_ids_are_sequential/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet -A worker_ids_are_sequential.ts",
+ "output": "worker_ids_are_sequential.ts.out",
+ "exitCode": 0
+}
diff --git a/tests/specs/worker/worker_ids_are_sequential/worker_ids_are_sequential.ts b/tests/specs/worker/worker_ids_are_sequential/worker_ids_are_sequential.ts
new file mode 100644
index 000000000..eb90f0d47
--- /dev/null
+++ b/tests/specs/worker/worker_ids_are_sequential/worker_ids_are_sequential.ts
@@ -0,0 +1,34 @@
+import {
+ isMainThread,
+ parentPort,
+ threadId,
+ Worker,
+} from "node:worker_threads";
+
+console.log("threadId", threadId);
+
+if (isMainThread) {
+ const worker = new Worker(new URL(import.meta.url));
+ worker.on("message", (msg) => console.log("from worker:", msg));
+ worker.on("error", () => {
+ throw new Error("error");
+ });
+ worker.on("exit", (code) => {
+ if (code !== 0) {
+ reject(new Error(`Worker stopped with exit code ${code}`));
+ }
+ });
+} else if (threadId == 1) {
+ const worker = new Worker(new URL(import.meta.url));
+ worker.on("message", (msg) => console.log("from worker:", msg));
+ worker.on("error", () => {
+ throw new Error("error");
+ });
+ worker.on("exit", (code) => {
+ if (code !== 0) {
+ reject(new Error(`Worker stopped with exit code ${code}`));
+ }
+ });
+} else {
+ parentPort.postMessage("hello!");
+}
diff --git a/tests/specs/worker/worker_ids_are_sequential/worker_ids_are_sequential.ts.out b/tests/specs/worker/worker_ids_are_sequential/worker_ids_are_sequential.ts.out
new file mode 100644
index 000000000..1f0552864
--- /dev/null
+++ b/tests/specs/worker/worker_ids_are_sequential/worker_ids_are_sequential.ts.out
@@ -0,0 +1,4 @@
+threadId 0
+threadId 1
+threadId 2
+from worker: hello!
diff --git a/tests/specs/worker/worker_message_handler_error/__test__.jsonc b/tests/specs/worker/worker_message_handler_error/__test__.jsonc
new file mode 100644
index 000000000..ea00753a7
--- /dev/null
+++ b/tests/specs/worker/worker_message_handler_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run -A --quiet --reload worker_message_handler_error.ts",
+ "output": "worker_message_handler_error.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/worker/worker_message_handler_error/message_handler_error.ts b/tests/specs/worker/worker_message_handler_error/message_handler_error.ts
new file mode 100644
index 000000000..3416faad1
--- /dev/null
+++ b/tests/specs/worker/worker_message_handler_error/message_handler_error.ts
@@ -0,0 +1,4 @@
+postMessage("ready");
+onmessage = () => {
+ throw new Error("bar");
+};
diff --git a/tests/specs/worker/worker_message_handler_error/worker_message_handler_error.ts b/tests/specs/worker/worker_message_handler_error/worker_message_handler_error.ts
new file mode 100644
index 000000000..355d86770
--- /dev/null
+++ b/tests/specs/worker/worker_message_handler_error/worker_message_handler_error.ts
@@ -0,0 +1,8 @@
+const worker = new Worker(
+ import.meta.resolve("./message_handler_error.ts"),
+ { type: "module", name: "foo" },
+);
+worker.onmessage = () => {
+ worker.postMessage("ready");
+};
+setTimeout(() => worker.terminate(), 30000);
diff --git a/tests/specs/worker/worker_message_handler_error/worker_message_handler_error.ts.out b/tests/specs/worker/worker_message_handler_error/worker_message_handler_error.ts.out
new file mode 100644
index 000000000..0f97e9703
--- /dev/null
+++ b/tests/specs/worker/worker_message_handler_error/worker_message_handler_error.ts.out
@@ -0,0 +1,7 @@
+error: Uncaught (in worker "foo") Error: bar
+ throw new Error("bar");
+ ^
+ at onmessage ([WILDCARD]/message_handler_error.ts:[WILDCARD])
+ at [WILDCARD]
+error: Uncaught (in promise) Error: Unhandled error in child worker.
+ at Worker.#pollControl [WILDCARD]
diff --git a/tests/specs/worker/worker_nested_error/__test__.jsonc b/tests/specs/worker/worker_nested_error/__test__.jsonc
new file mode 100644
index 000000000..71d7c8109
--- /dev/null
+++ b/tests/specs/worker/worker_nested_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run -A worker_nested_error.ts",
+ "output": "worker_nested_error.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/worker/worker_nested_error/error.ts b/tests/specs/worker/worker_nested_error/error.ts
new file mode 100644
index 000000000..495971090
--- /dev/null
+++ b/tests/specs/worker/worker_nested_error/error.ts
@@ -0,0 +1,5 @@
+function foo() {
+ throw new Error("foo");
+}
+
+foo();
diff --git a/tests/specs/worker/worker_nested_error/worker_error.ts b/tests/specs/worker/worker_nested_error/worker_error.ts
new file mode 100644
index 000000000..403223d0a
--- /dev/null
+++ b/tests/specs/worker/worker_nested_error/worker_error.ts
@@ -0,0 +1,5 @@
+const worker = new Worker(
+ import.meta.resolve("./error.ts"),
+ { type: "module", name: "bar" },
+);
+setTimeout(() => worker.terminate(), 30000);
diff --git a/tests/specs/worker/worker_nested_error/worker_nested_error.ts b/tests/specs/worker/worker_nested_error/worker_nested_error.ts
new file mode 100644
index 000000000..48bdea109
--- /dev/null
+++ b/tests/specs/worker/worker_nested_error/worker_nested_error.ts
@@ -0,0 +1,5 @@
+const worker = new Worker(
+ import.meta.resolve("./worker_error.ts"),
+ { type: "module", name: "baz" },
+);
+setTimeout(() => worker.terminate(), 30000);
diff --git a/tests/specs/worker/worker_nested_error/worker_nested_error.ts.out b/tests/specs/worker/worker_nested_error/worker_nested_error.ts.out
new file mode 100644
index 000000000..404b0aa3d
--- /dev/null
+++ b/tests/specs/worker/worker_nested_error/worker_nested_error.ts.out
@@ -0,0 +1,9 @@
+[WILDCARD]error: Uncaught (in worker "bar") (in promise) Error: foo[WILDCARD]
+ throw new Error("foo");
+ ^
+ at foo ([WILDCARD]/error.ts:[WILDCARD])
+ at [WILDCARD]/error.ts:[WILDCARD]
+error: Uncaught (in worker "baz") (in promise) Error: Unhandled error in child worker.
+ at Worker.#pollControl [WILDCARD]
+error: Uncaught (in promise) Error: Unhandled error in child worker.
+ at Worker.#pollControl [WILDCARD]
diff --git a/tests/specs/worker/worker_permissions_blob_local/__test__.jsonc b/tests/specs/worker/worker_permissions_blob_local/__test__.jsonc
new file mode 100644
index 000000000..27a747b3a
--- /dev/null
+++ b/tests/specs/worker/worker_permissions_blob_local/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload --allow-net=localhost:4545 permissions_blob_local.ts",
+ "output": "permissions_blob_local.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/worker/worker_permissions_blob_local/permissions_blob_local.ts b/tests/specs/worker/worker_permissions_blob_local/permissions_blob_local.ts
new file mode 100644
index 000000000..52f630bd8
--- /dev/null
+++ b/tests/specs/worker/worker_permissions_blob_local/permissions_blob_local.ts
@@ -0,0 +1,6 @@
+// This file doesn't really exist, but it doesn't matter, a "PermissionsDenied" error should be thrown.
+const code = `import "file:///${
+ Deno.build.os == "windows" ? "C:/" : ""
+}local_file.ts";`;
+const blob = new Blob([code]);
+new Worker(URL.createObjectURL(blob), { type: "module" });
diff --git a/tests/specs/worker/worker_permissions_blob_local/permissions_blob_local.ts.out b/tests/specs/worker/worker_permissions_blob_local/permissions_blob_local.ts.out
new file mode 100644
index 000000000..0cd581f7b
--- /dev/null
+++ b/tests/specs/worker/worker_permissions_blob_local/permissions_blob_local.ts.out
@@ -0,0 +1,4 @@
+error: Uncaught (in worker "") Requires read access to "[WILDCARD]local_file.ts", run again with the --allow-read flag
+ at blob:null/[WILDCARD]:1:8
+error: Uncaught (in promise) Error: Unhandled error in child worker.
+ at Worker.#pollControl [WILDCARD]
diff --git a/tests/specs/worker/worker_permissions_blob_remote/__test__.jsonc b/tests/specs/worker/worker_permissions_blob_remote/__test__.jsonc
new file mode 100644
index 000000000..f9d66b6b3
--- /dev/null
+++ b/tests/specs/worker/worker_permissions_blob_remote/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload --allow-net=localhost:4545 permissions_blob_remote.ts",
+ "output": "permissions_blob_remote.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/worker/worker_permissions_blob_remote/permissions_blob_remote.ts b/tests/specs/worker/worker_permissions_blob_remote/permissions_blob_remote.ts
new file mode 100644
index 000000000..4808bc57b
--- /dev/null
+++ b/tests/specs/worker/worker_permissions_blob_remote/permissions_blob_remote.ts
@@ -0,0 +1,4 @@
+// This file doesn't really exist, but it doesn't matter, a "PermissionsDenied" error should be thrown.
+const code = `import "https://example.com/some/file.ts";`;
+const blob = new Blob([code]);
+new Worker(URL.createObjectURL(blob), { type: "module" });
diff --git a/tests/specs/worker/worker_permissions_blob_remote/permissions_blob_remote.ts.out b/tests/specs/worker/worker_permissions_blob_remote/permissions_blob_remote.ts.out
new file mode 100644
index 000000000..6dc4f0f5f
--- /dev/null
+++ b/tests/specs/worker/worker_permissions_blob_remote/permissions_blob_remote.ts.out
@@ -0,0 +1,4 @@
+error: Uncaught (in worker "") Requires net access to "example.com:443", run again with the --allow-net flag
+ at blob:null/[WILDCARD]:1:8
+error: Uncaught (in promise) Error: Unhandled error in child worker.
+ at Worker.#pollControl[WILDCARD]
diff --git a/tests/specs/worker/worker_permissions_data_local/__test__.jsonc b/tests/specs/worker/worker_permissions_data_local/__test__.jsonc
new file mode 100644
index 000000000..8f118d8be
--- /dev/null
+++ b/tests/specs/worker/worker_permissions_data_local/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload --allow-net=localhost:4545 permissions_data_local.ts",
+ "output": "permissions_data_local.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/worker/worker_permissions_data_local/permissions_data_local.ts b/tests/specs/worker/worker_permissions_data_local/permissions_data_local.ts
new file mode 100644
index 000000000..cda80bed6
--- /dev/null
+++ b/tests/specs/worker/worker_permissions_data_local/permissions_data_local.ts
@@ -0,0 +1,7 @@
+// This file doesn't really exist, but it doesn't matter, a "PermissionsDenied" error should be thrown.
+const code = `import "file:///${
+ Deno.build.os == "windows" ? "C:/" : ""
+}local_file.ts";`;
+new Worker(`data:application/javascript;base64,${btoa(code)}`, {
+ type: "module",
+});
diff --git a/tests/specs/worker/worker_permissions_data_local/permissions_data_local.ts.out b/tests/specs/worker/worker_permissions_data_local/permissions_data_local.ts.out
new file mode 100644
index 000000000..4e0f72779
--- /dev/null
+++ b/tests/specs/worker/worker_permissions_data_local/permissions_data_local.ts.out
@@ -0,0 +1,4 @@
+error: Uncaught (in worker "") Requires read access to "[WILDCARD]local_file.ts", run again with the --allow-read flag
+ at data:application/javascript;base64,[WILDCARD]:1:8
+error: Uncaught (in promise) Error: Unhandled error in child worker.
+ at Worker.#pollControl[WILDCARD]
diff --git a/tests/specs/worker/worker_permissions_data_remote/__test__.jsonc b/tests/specs/worker/worker_permissions_data_remote/__test__.jsonc
new file mode 100644
index 000000000..6096b4280
--- /dev/null
+++ b/tests/specs/worker/worker_permissions_data_remote/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload --allow-net=localhost:4545 permissions_data_remote.ts",
+ "output": "permissions_data_remote.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/worker/worker_permissions_data_remote/permissions_data_remote.ts b/tests/specs/worker/worker_permissions_data_remote/permissions_data_remote.ts
new file mode 100644
index 000000000..b37bd661d
--- /dev/null
+++ b/tests/specs/worker/worker_permissions_data_remote/permissions_data_remote.ts
@@ -0,0 +1,5 @@
+// This file doesn't really exist, but it doesn't matter, a "PermissionsDenied" error should be thrown.
+const code = `import "https://example.com/some/file.ts";`;
+new Worker(`data:application/javascript;base64,${btoa(code)}`, {
+ type: "module",
+});
diff --git a/tests/specs/worker/worker_permissions_data_remote/permissions_data_remote.ts.out b/tests/specs/worker/worker_permissions_data_remote/permissions_data_remote.ts.out
new file mode 100644
index 000000000..e7af110bb
--- /dev/null
+++ b/tests/specs/worker/worker_permissions_data_remote/permissions_data_remote.ts.out
@@ -0,0 +1,4 @@
+error: Uncaught (in worker "") Requires net access to "example.com:443", run again with the --allow-net flag
+ at data:application/javascript;base64,aW1wb3J0ICJodHRwczovL2V4YW1wbGUuY29tL3NvbWUvZmlsZS50cyI7:1:8
+error: Uncaught (in promise) Error: Unhandled error in child worker.
+ at Worker.#pollControl[WILDCARD]
diff --git a/tests/specs/worker/worker_permissions_dynamic_remote/__test__.jsonc b/tests/specs/worker/worker_permissions_dynamic_remote/__test__.jsonc
new file mode 100644
index 000000000..8343b17f6
--- /dev/null
+++ b/tests/specs/worker/worker_permissions_dynamic_remote/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload --allow-net --unstable-worker-options ../../../testdata/workers/permissions_dynamic_remote.ts",
+ "output": "../../../testdata/workers/permissions_dynamic_remote.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/worker/worker_permissions_remote_remote/__test__.jsonc b/tests/specs/worker/worker_permissions_remote_remote/__test__.jsonc
new file mode 100644
index 000000000..8cf700158
--- /dev/null
+++ b/tests/specs/worker/worker_permissions_remote_remote/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload --allow-net=localhost:4545 ../../../testdata/workers/permissions_remote_remote.ts",
+ "output": "permissions_remote_remote.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/worker/worker_permissions_remote_remote/permissions_remote_remote.ts.out b/tests/specs/worker/worker_permissions_remote_remote/permissions_remote_remote.ts.out
new file mode 100644
index 000000000..e5bdfc2dc
--- /dev/null
+++ b/tests/specs/worker/worker_permissions_remote_remote/permissions_remote_remote.ts.out
@@ -0,0 +1,4 @@
+error: Uncaught (in worker "") Requires net access to "example.com:443", run again with the --allow-net flag
+ at http://localhost:4545/[WILDCARD]/static_remote.ts:2:8
+error: Uncaught (in promise) Error: Unhandled error in child worker.
+ at Worker.#pollControl [WILDCARD]
diff --git a/tests/specs/worker/worker_terminate_tla_crash/__test__.jsonc b/tests/specs/worker/worker_terminate_tla_crash/__test__.jsonc
new file mode 100644
index 000000000..a3e04da85
--- /dev/null
+++ b/tests/specs/worker/worker_terminate_tla_crash/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload terminate_tla_crash.js",
+ "output": "terminate_tla_crash.js.out"
+}
diff --git a/tests/specs/worker/worker_terminate_tla_crash/terminate_tla_crash.js b/tests/specs/worker/worker_terminate_tla_crash/terminate_tla_crash.js
new file mode 100644
index 000000000..f793b8c8e
--- /dev/null
+++ b/tests/specs/worker/worker_terminate_tla_crash/terminate_tla_crash.js
@@ -0,0 +1,21 @@
+// Test for https://github.com/denoland/deno/issues/12658
+//
+// If a worker is terminated immediately after construction, and the worker's
+// main module uses top-level await, V8 has a chance to crash.
+//
+// These crashes are so rare in debug mode that I've only seen them once. They
+// happen a lot more often in release mode.
+
+const workerModule = `
+ await new Promise(resolve => setTimeout(resolve, 1000));
+`;
+
+// Iterating 10 times to increase the likelihood of triggering the crash, at
+// least in release mode.
+for (let i = 0; i < 10; i++) {
+ const worker = new Worker(
+ `data:application/javascript;base64,${btoa(workerModule)}`,
+ { type: "module" },
+ );
+ worker.terminate();
+}
diff --git a/tests/specs/worker/worker_terminate_tla_crash/terminate_tla_crash.js.out b/tests/specs/worker/worker_terminate_tla_crash/terminate_tla_crash.js.out
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/specs/worker/worker_terminate_tla_crash/terminate_tla_crash.js.out