The test was flaky because the histogram sampling might not have completed before the assertions ran. By using setImmediate before disabling the histogram and checking values, we give the event loop a chance to record final samples on slower systems. Also added an explicit check for histogram.count > 0 to provide a clearer error message if no samples are recorded. Refs: https://github.com/nodejs/reliability/issues/1450 PR-URL: https://github.com/nodejs/node/pull/61629 Reviewed-By: Chengzhong Wu <legendecas@gmail.com> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
115 lines
3.1 KiB
JavaScript
115 lines
3.1 KiB
JavaScript
// Flags: --expose-gc --expose-internals
|
|
'use strict';
|
|
|
|
const common = require('../common');
|
|
const assert = require('assert');
|
|
const os = require('os');
|
|
const {
|
|
monitorEventLoopDelay
|
|
} = require('perf_hooks');
|
|
const { sleep } = require('internal/util');
|
|
|
|
{
|
|
const histogram = monitorEventLoopDelay();
|
|
assert(histogram);
|
|
assert(histogram.enable());
|
|
assert(!histogram.enable());
|
|
histogram.reset();
|
|
assert(histogram.disable());
|
|
assert(!histogram.disable());
|
|
}
|
|
|
|
{
|
|
[null, 'a', 1, false, Infinity].forEach((i) => {
|
|
assert.throws(
|
|
() => monitorEventLoopDelay(i),
|
|
{
|
|
name: 'TypeError',
|
|
code: 'ERR_INVALID_ARG_TYPE'
|
|
}
|
|
);
|
|
});
|
|
|
|
[null, 'a', false, {}, []].forEach((i) => {
|
|
assert.throws(
|
|
() => monitorEventLoopDelay({ resolution: i }),
|
|
{
|
|
name: 'TypeError',
|
|
code: 'ERR_INVALID_ARG_TYPE'
|
|
}
|
|
);
|
|
});
|
|
|
|
[-1, 0, 2 ** 53, Infinity].forEach((i) => {
|
|
assert.throws(
|
|
() => monitorEventLoopDelay({ resolution: i }),
|
|
{
|
|
name: 'RangeError',
|
|
code: 'ERR_OUT_OF_RANGE'
|
|
}
|
|
);
|
|
});
|
|
}
|
|
|
|
{
|
|
const s390x = os.arch() === 's390x';
|
|
const histogram = monitorEventLoopDelay({ resolution: 1 });
|
|
histogram.enable();
|
|
let m = 5;
|
|
if (s390x) {
|
|
m = m * 2;
|
|
}
|
|
function spinAWhile() {
|
|
sleep(1000);
|
|
if (--m > 0) {
|
|
setTimeout(spinAWhile, common.platformTimeout(500));
|
|
} else {
|
|
// Give the histogram a chance to record final samples before disabling.
|
|
// This helps on slower systems where sampling may be delayed.
|
|
setImmediate(common.mustCall(() => {
|
|
histogram.disable();
|
|
// The values are non-deterministic, so we just check that a value is
|
|
// present, as opposed to a specific value.
|
|
assert(histogram.count > 0, `Expected samples to be recorded, got count=${histogram.count}`);
|
|
assert(histogram.min > 0);
|
|
assert(histogram.max > 0);
|
|
assert(histogram.stddev > 0);
|
|
assert(histogram.mean > 0);
|
|
assert(histogram.percentiles.size > 0);
|
|
for (let n = 1; n < 100; n = n + 0.1) {
|
|
assert(histogram.percentile(n) >= 0);
|
|
}
|
|
histogram.reset();
|
|
assert.strictEqual(histogram.min, 9223372036854776000);
|
|
assert.strictEqual(histogram.max, 0);
|
|
assert(Number.isNaN(histogram.stddev));
|
|
assert(Number.isNaN(histogram.mean));
|
|
assert.strictEqual(histogram.percentiles.size, 1);
|
|
|
|
['a', false, {}, []].forEach((i) => {
|
|
assert.throws(
|
|
() => histogram.percentile(i),
|
|
{
|
|
name: 'TypeError',
|
|
code: 'ERR_INVALID_ARG_TYPE',
|
|
}
|
|
);
|
|
});
|
|
[-1, 0, 101, NaN].forEach((i) => {
|
|
assert.throws(
|
|
() => histogram.percentile(i),
|
|
{
|
|
name: 'RangeError',
|
|
code: 'ERR_OUT_OF_RANGE',
|
|
}
|
|
);
|
|
});
|
|
}));
|
|
}
|
|
}
|
|
spinAWhile();
|
|
}
|
|
|
|
// Make sure that the histogram instances can be garbage-collected without
|
|
// and not just implictly destroyed when the Environment is torn down.
|
|
process.on('exit', global.gc);
|