diff options
Diffstat (limited to 'tests/specs')
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 |