summaryrefslogtreecommitdiff
path: root/test/sequential
diff options
context:
space:
mode:
authorRich Trott <rtrott@gmail.com>2020-11-06 05:20:17 -0800
committerNode.js GitHub Bot <github-bot@iojs.org>2020-11-12 20:26:49 +0000
commit660265e1080e587d33c8819a0a4b5e25735684e7 (patch)
tree19a6aaa54622c6589020f283428daac52cf57aad /test/sequential
parentf5a86b5e13bcc29f948d4fad4b44370cee561e4b (diff)
downloadnode-new-660265e1080e587d33c8819a0a4b5e25735684e7.tar.gz
test: move test-worker-eventlooputil to sequential
The test is not nearly as unreliable as it used to be but we're still seeing failures around the timing checks that will definitely be affected by other tests running in other processes. So move it to sequential. Refs: https://github.com/nodejs/node/pull/35961#issuecomment-722222696 PR-URL: https://github.com/nodejs/node/pull/35996 Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Gerhard Stöbich <deb2001-github@yahoo.de> Reviewed-By: Daijiro Wachi <daijiro.wachi@gmail.com>
Diffstat (limited to 'test/sequential')
-rw-r--r--test/sequential/test-worker-eventlooputil.js114
1 files changed, 114 insertions, 0 deletions
diff --git a/test/sequential/test-worker-eventlooputil.js b/test/sequential/test-worker-eventlooputil.js
new file mode 100644
index 0000000000..7e012cb2b0
--- /dev/null
+++ b/test/sequential/test-worker-eventlooputil.js
@@ -0,0 +1,114 @@
+'use strict';
+
+const { mustCall, mustCallAtLeast } = require('../common');
+
+const assert = require('assert');
+const {
+ Worker,
+ MessageChannel,
+ MessagePort,
+ parentPort,
+} = require('worker_threads');
+const { eventLoopUtilization, now } = require('perf_hooks').performance;
+
+// Use argv to detect whether we're running as a Worker called by this test vs.
+// this test also being called as a Worker.
+if (process.argv[2] === 'iamalive') {
+ const iaElu = idleActive(eventLoopUtilization());
+ // Checks that the worker bootstrap is running after the event loop started.
+ assert.ok(iaElu > 0, `${iaElu} <= 0`);
+ parentPort.once('message', mustCall((msg) => {
+ assert.ok(msg.metricsCh instanceof MessagePort);
+ msg.metricsCh.on('message', mustCallAtLeast(workerOnMetricsMsg, 1));
+ }));
+ return;
+}
+
+function workerOnMetricsMsg(msg) {
+ if (msg.cmd === 'close') {
+ return this.close();
+ }
+
+ if (msg.cmd === 'elu') {
+ return this.postMessage(eventLoopUtilization());
+ }
+
+ if (msg.cmd === 'spin') {
+ const elu = eventLoopUtilization();
+ const t = now();
+ while (now() - t < msg.dur);
+ return this.postMessage(eventLoopUtilization(elu));
+ }
+}
+
+let worker;
+let metricsCh;
+let mainElu;
+let workerELU;
+
+(function r() {
+ // Force some idle time to accumulate before proceeding with test.
+ if (eventLoopUtilization().idle <= 0)
+ return setTimeout(mustCall(r), 5);
+
+ mainElu = eventLoopUtilization();
+
+ worker = new Worker(__filename, { argv: [ 'iamalive' ] });
+ metricsCh = new MessageChannel();
+ worker.postMessage({ metricsCh: metricsCh.port1 }, [ metricsCh.port1 ]);
+
+ workerELU = worker.performance.eventLoopUtilization;
+ metricsCh.port2.once('message', mustCall(checkWorkerIdle));
+ metricsCh.port2.postMessage({ cmd: 'elu' });
+ // Make sure it's still safe to call eventLoopUtilization() after the worker
+ // hass been closed.
+ worker.on('exit', mustCall(() => {
+ assert.deepStrictEqual(worker.performance.eventLoopUtilization(),
+ { idle: 0, active: 0, utilization: 0 });
+ }));
+})();
+
+function checkWorkerIdle(wElu) {
+ const perfWorkerElu = workerELU();
+ const tmpMainElu = eventLoopUtilization(mainElu);
+
+ assert.ok(idleActive(wElu) > 0, `${idleActive(wElu)} <= 0`);
+ assert.ok(idleActive(workerELU(wElu)) > 0,
+ `${idleActive(workerELU(wElu))} <= 0`);
+ assert.ok(idleActive(perfWorkerElu) > idleActive(wElu),
+ `${idleActive(perfWorkerElu)} <= ${idleActive(wElu)}`);
+ assert.ok(idleActive(tmpMainElu) > idleActive(perfWorkerElu),
+ `${idleActive(tmpMainElu)} <= ${idleActive(perfWorkerElu)}`);
+
+ wElu = workerELU();
+ setTimeout(mustCall(() => {
+ wElu = workerELU(wElu);
+ // Some clocks fire early. Removing a few milliseconds to cover that.
+ assert.ok(idleActive(wElu) >= 45, `${idleActive(wElu)} < 45`);
+ // Cutting the idle time in half since it's possible that the call took a
+ // lot of resources to process?
+ assert.ok(wElu.idle >= 25, `${wElu.idle} < 25`);
+
+ checkWorkerActive();
+ }), 50);
+}
+
+function checkWorkerActive() {
+ const w = workerELU();
+
+ metricsCh.port2.postMessage({ cmd: 'spin', dur: 50 });
+ metricsCh.port2.once('message', (wElu) => {
+ const w2 = workerELU(w);
+
+ assert.ok(w2.active >= 50, `${w2.active} < 50`);
+ assert.ok(wElu.active >= 50, `${wElu.active} < 50`);
+ assert.ok(idleActive(wElu) < idleActive(w2),
+ `${idleActive(wElu)} >= ${idleActive(w2)}`);
+
+ metricsCh.port2.postMessage({ cmd: 'close' });
+ });
+}
+
+function idleActive(elu) {
+ return elu.idle + elu.active;
+}