From 1a6249c9717288e37873b692abac831f11c30f4e Mon Sep 17 00:00:00 2001 From: Andreu Botella Date: Sat, 25 Sep 2021 04:26:57 +0200 Subject: [PATCH] chore(workers): Test that closing a worker closes any child workers (#12215) Before #12156, closing a worker which had children would cause a panic (https://github.com/denoland/deno/issues/11342#issuecomment-918327693). After that PR, closing a worker will also close any child workers. --- cli/tests/integration/run_tests.rs | 5 +++++ cli/tests/testdata/worker_close_nested.js | 20 +++++++++++++++++++ cli/tests/testdata/worker_close_nested.js.out | 5 +++++ .../testdata/workers/close_nested_child.js | 7 +++++++ .../testdata/workers/close_nested_parent.js | 13 ++++++++++++ 5 files changed, 50 insertions(+) create mode 100644 cli/tests/testdata/worker_close_nested.js create mode 100644 cli/tests/testdata/worker_close_nested.js.out create mode 100644 cli/tests/testdata/workers/close_nested_child.js create mode 100644 cli/tests/testdata/workers/close_nested_parent.js diff --git a/cli/tests/integration/run_tests.rs b/cli/tests/integration/run_tests.rs index 5116db2951..8c196d6e35 100644 --- a/cli/tests/integration/run_tests.rs +++ b/cli/tests/integration/run_tests.rs @@ -1194,6 +1194,11 @@ itest!(worker_drop_handle_race { exit_code: 1, }); +itest!(worker_close_nested { + args: "run --quiet --reload --allow-read worker_close_nested.js", + output: "worker_close_nested.js.out", +}); + itest!(worker_message_before_close { args: "run --quiet --reload --allow-read worker_message_before_close.js", output: "worker_message_before_close.js.out", diff --git a/cli/tests/testdata/worker_close_nested.js b/cli/tests/testdata/worker_close_nested.js new file mode 100644 index 0000000000..fd47a5ae44 --- /dev/null +++ b/cli/tests/testdata/worker_close_nested.js @@ -0,0 +1,20 @@ +// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. + +// Test that closing a worker which has living child workers will automatically +// close the children. + +console.log("Starting the main thread"); + +const worker = new Worker( + new URL("./workers/close_nested_parent.js", import.meta.url), + { type: "module" }, +); + +setTimeout(() => { + console.log("About to close"); + worker.postMessage({}); + + // Keep the process running for another two seconds, to make sure there's no + // output from the child worker. + setTimeout(() => {}, 2000); +}, 1000); diff --git a/cli/tests/testdata/worker_close_nested.js.out b/cli/tests/testdata/worker_close_nested.js.out new file mode 100644 index 0000000000..496bc62510 --- /dev/null +++ b/cli/tests/testdata/worker_close_nested.js.out @@ -0,0 +1,5 @@ +Starting the main thread +Starting the parent worker +Starting the child worker +About to close +Closing diff --git a/cli/tests/testdata/workers/close_nested_child.js b/cli/tests/testdata/workers/close_nested_child.js new file mode 100644 index 0000000000..627a176aa3 --- /dev/null +++ b/cli/tests/testdata/workers/close_nested_child.js @@ -0,0 +1,7 @@ +// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. + +console.log("Starting the child worker"); + +setTimeout(() => { + console.log("The child worker survived the death of the parent!!!"); +}, 2000); diff --git a/cli/tests/testdata/workers/close_nested_parent.js b/cli/tests/testdata/workers/close_nested_parent.js new file mode 100644 index 0000000000..c528632ce8 --- /dev/null +++ b/cli/tests/testdata/workers/close_nested_parent.js @@ -0,0 +1,13 @@ +// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. + +console.log("Starting the parent worker"); + +new Worker( + new URL("./close_nested_child.js", import.meta.url), + { type: "module" }, +); + +self.addEventListener("message", () => { + console.log("Closing"); + self.close(); +});