• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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