summaryrefslogtreecommitdiff
path: root/cli/tests
diff options
context:
space:
mode:
Diffstat (limited to 'cli/tests')
-rw-r--r--cli/tests/integration/run_tests.rs5
-rw-r--r--cli/tests/testdata/worker_drop_handle_race_terminate.js40
-rw-r--r--cli/tests/testdata/worker_drop_handle_race_terminate.js.out4
3 files changed, 49 insertions, 0 deletions
diff --git a/cli/tests/integration/run_tests.rs b/cli/tests/integration/run_tests.rs
index e6004ba49..4c4b42142 100644
--- a/cli/tests/integration/run_tests.rs
+++ b/cli/tests/integration/run_tests.rs
@@ -1610,6 +1610,11 @@ itest!(worker_drop_handle_race {
exit_code: 1,
});
+itest!(worker_drop_handle_race_terminate {
+ args: "run --unstable worker_drop_handle_race_terminate.js",
+ output: "worker_drop_handle_race_terminate.js.out",
+});
+
itest!(worker_close_nested {
args: "run --quiet --reload --allow-read worker_close_nested.js",
output: "worker_close_nested.js.out",
diff --git a/cli/tests/testdata/worker_drop_handle_race_terminate.js b/cli/tests/testdata/worker_drop_handle_race_terminate.js
new file mode 100644
index 000000000..dfdd9c561
--- /dev/null
+++ b/cli/tests/testdata/worker_drop_handle_race_terminate.js
@@ -0,0 +1,40 @@
+// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
+
+// Test that the panic in https://github.com/denoland/deno/issues/11342 does not
+// happen when calling worker.terminate() after fixing
+// https://github.com/denoland/deno/issues/13705
+
+function getCodeBlobUrl(code) {
+ const blob = new Blob([code], { type: "text/javascript" });
+ return URL.createObjectURL(blob);
+}
+
+const WORKER2 = getCodeBlobUrl(`
+ console.log("Worker 2");
+ self.postMessage(undefined);
+
+ // We sleep for slightly under 2 seconds in order to make sure that worker 1
+ // has closed, and that this worker's thread finishes normally rather than
+ // being killed (which happens 2 seconds after calling terminate).
+ Deno.sleepSync(1800);
+ console.log("Finished sleeping in worker 2");
+`);
+
+const WORKER1 = getCodeBlobUrl(`
+ console.log("Worker 1");
+ const worker = new Worker(
+ ${JSON.stringify(WORKER2)},
+ { type: "module", deno: { namespace: true } }
+ );
+
+ worker.addEventListener("message", () => {
+ console.log("Terminating");
+ worker.terminate();
+ self.close();
+ });
+`);
+
+new Worker(WORKER1, { type: "module", deno: { namespace: true } });
+
+// Don't kill the process before worker 2 is finished.
+setTimeout(() => {}, 3000);
diff --git a/cli/tests/testdata/worker_drop_handle_race_terminate.js.out b/cli/tests/testdata/worker_drop_handle_race_terminate.js.out
new file mode 100644
index 000000000..5ec1e7ff8
--- /dev/null
+++ b/cli/tests/testdata/worker_drop_handle_race_terminate.js.out
@@ -0,0 +1,4 @@
+Worker 1
+Worker 2
+Terminating
+Finished sleeping in worker 2