From 70ccec2d91ffc33434907ec5482ce9d0a6a93610 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Tue, 18 Sep 2018 22:42:51 -0700 Subject: [PATCH] test: increase coverage for worker_threads Provide a test to cover adding setting `onmessage` to a non-function. This provides previously-missing coverage for an else block in the `onmessage` setter. PR-URL: https://github.com/nodejs/node/pull/22942 Reviewed-By: Colin Ihrig Reviewed-By: Anna Henningsen Reviewed-By: Sakthipriyan Vairamani Reviewed-By: James M Snell Reviewed-By: Yuta Hiroto --- .../test-worker-onmessage-not-a-function.js | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 test/parallel/test-worker-onmessage-not-a-function.js diff --git a/test/parallel/test-worker-onmessage-not-a-function.js b/test/parallel/test-worker-onmessage-not-a-function.js new file mode 100644 index 00000000000000..9142c19b3211fc --- /dev/null +++ b/test/parallel/test-worker-onmessage-not-a-function.js @@ -0,0 +1,26 @@ +// When MessagePort.onmessage is set to a value that is not a function, the +// setter should call .unref() and .stop(), clearing a previous onmessage +// listener from holding the event loop open. This test confirms that +// functionality. + +// Flags: --experimental-worker +'use strict'; +const common = require('../common'); +const { Worker, parentPort } = require('worker_threads'); + +// Do not use isMainThread so that this test itself can be run inside a Worker. +if (!process.env.HAS_STARTED_WORKER) { + process.env.HAS_STARTED_WORKER = 1; + const w = new Worker(__filename); + w.postMessage(2); +} else { + // .onmessage uses a setter. Set .onmessage to a function that ultimately + // should not be called. This will call .ref() and .start() which will keep + // the event loop open (and prevent this from exiting) if the subsequent + // assignment of a value to .onmessage doesn't call .unref() and .stop(). + parentPort.onmessage = common.mustNotCall(); + // Setting `onmessage` to a value that is not a function should clear the + // previous value and also should allow the event loop to exit. (In other + // words, this test should exit rather than run indefinitely.) + parentPort.onmessage = 'fhqwhgads'; +}