current commit
251125.7 · test: add lint rule to forbid use of `assert.ok(/regex/.test(…))`
'use strict';
const common = require('../common');
const { isSunOS } = require('../common');
const assert = require('assert');
const {
  Worker,
} = require('worker_threads');

function validate(result) {
  assert.ok(typeof result == 'object' && result !== null);
  assert.ok(result.user >= 0);
  assert.ok(result.system >= 0);
  assert.ok(Number.isFinite(result.user));
  assert.ok(Number.isFinite(result.system));
}

function check(worker) {
  [
    NaN,
    undefined,
    null,
  ].forEach((value) => {
    worker.cpuUsage(value);
  });
  [
    -1,
    1.1,
    {},
    [],
    function() {},
    Symbol(),
    true,
    Infinity,
    { user: -1, system: 1 },
    { user: 1, system: -1 },
  ].forEach((value) => {
    assert.throws(() => {
      worker.cpuUsage(value);
    }, /ERR_OUT_OF_RANGE|ERR_INVALID_ARG_TYPE/i);
  });
}

const worker = new Worker(`
  const { parentPort } = require('worker_threads');
  parentPort.on('message', () => {});
  `, { eval: true });

// See test-process-threadCpuUsage-main-thread.js
if (isSunOS) {
  assert.throws(
    () => worker.cpuUsage(),
    {
      code: 'ERR_OPERATION_FAILED',
      name: 'Error',
      message: 'Operation failed: worker.cpuUsage() is not available on SunOS'
    }
  );
  worker.terminate();
} else {
  worker.on('online', common.mustCall(async () => {
    check(worker);

    const prev = await worker.cpuUsage();
    validate(prev);

    const curr = await worker.cpuUsage();
    validate(curr);

    assert.ok(curr.user >= prev.user);
    assert.ok(curr.system >= prev.system);

    const delta = await worker.cpuUsage(curr);
    validate(delta);

    worker.terminate();
  }));

  worker.once('exit', common.mustCall(async () => {
    await assert.rejects(worker.cpuUsage(), {
      code: 'ERR_WORKER_NOT_RUNNING'
    });
  }));
}