1'use strict'; 2 3require('../common'); 4 5const TIMEOUT = 50; 6 7const assert = require('assert'); 8const { performance } = require('perf_hooks'); 9const { Worker, parentPort } = require('worker_threads'); 10 11const { nodeTiming, eventLoopUtilization } = performance; 12const elu = eventLoopUtilization(); 13 14// Take into account whether this test was started as a Worker. 15if (nodeTiming.loopStart === -1) { 16 assert.strictEqual(nodeTiming.idleTime, 0); 17 assert.deepStrictEqual(elu, { idle: 0, active: 0, utilization: 0 }); 18 assert.deepStrictEqual(eventLoopUtilization(elu), 19 { idle: 0, active: 0, utilization: 0 }); 20 assert.deepStrictEqual(eventLoopUtilization(elu, eventLoopUtilization()), 21 { idle: 0, active: 0, utilization: 0 }); 22} 23 24// Place in setTimeout() to make sure there is some idle time, but not going to 25// assert this since it could make the test flaky. 26setTimeout(() => { 27 const t = Date.now(); 28 const elu1 = eventLoopUtilization(); 29 30 while (Date.now() - t < 50) { } 31 32 const elu2 = eventLoopUtilization(); 33 const elu3 = eventLoopUtilization(elu1); 34 const elu4 = eventLoopUtilization(elu2, elu1); 35 36 assert.strictEqual(elu3.idle, 0); 37 assert.strictEqual(elu4.idle, 0); 38 assert.strictEqual(elu3.utilization, 1); 39 assert.strictEqual(elu4.utilization, 1); 40 assert.strictEqual(elu2.active - elu1.active, elu4.active); 41 assert.ok(elu2.active > elu3.active); 42 assert.ok(elu2.active > elu4.active); 43 assert.ok(elu3.active > elu4.active); 44 45 setTimeout(runIdleTimeTest, TIMEOUT); 46}, 5); 47 48function runIdleTimeTest() { 49 const idleTime = nodeTiming.idleTime; 50 const elu1 = eventLoopUtilization(); 51 const sum = elu1.idle + elu1.active; 52 53 assert.ok(sum >= elu1.idle && sum >= elu1.active, 54 `idle: ${elu1.idle} active: ${elu1.active} sum: ${sum}`); 55 assert.strictEqual(elu1.idle, idleTime); 56 assert.strictEqual(elu1.utilization, elu1.active / sum); 57 58 setTimeout(runCalcTest, TIMEOUT, elu1); 59} 60 61function runCalcTest(elu1) { 62 const now = performance.now(); 63 const elu2 = eventLoopUtilization(); 64 const elu3 = eventLoopUtilization(elu2, elu1); 65 const active_delta = elu2.active - elu1.active; 66 const idle_delta = elu2.idle - elu1.idle; 67 68 assert.ok(elu2.idle >= 0); 69 assert.ok(elu2.active >= 0); 70 assert.ok(elu3.idle >= 0); 71 assert.ok(elu3.active >= 0); 72 assert.ok(elu2.idle + elu2.active > elu1.idle + elu2.active); 73 assert.ok(elu2.idle + elu2.active >= now - nodeTiming.loopStart); 74 assert.strictEqual(elu3.active, elu2.active - elu1.active); 75 assert.strictEqual(elu3.idle, elu2.idle - elu1.idle); 76 assert.strictEqual(elu3.utilization, 77 active_delta / (idle_delta + active_delta)); 78 79 setImmediate(runWorkerTest); 80} 81 82function runWorkerTest() { 83 // Use argv to detect whether we're running as a Worker called by this test 84 // vs. this test also being called as a Worker. 85 if (process.argv[2] === 'iamalive') { 86 parentPort.postMessage(JSON.stringify(eventLoopUtilization())); 87 return; 88 } 89 90 const elu1 = eventLoopUtilization(); 91 const worker = new Worker(__filename, { argv: [ 'iamalive' ] }); 92 93 worker.on('message', (msg) => { 94 const elu2 = eventLoopUtilization(elu1); 95 const data = JSON.parse(msg); 96 97 assert.ok(elu2.active + elu2.idle > data.active + data.idle); 98 }); 99} 100