node/test/parallel/test-perf-hooks-usertiming.js
Daeyeon Jeong 631bdb4f3e
perf_hooks: align toStringTag with other Web Performance implementations
This gets `Symbol.toStringTag` on Web Performance APIs to be aligned
with the other runtime implementations.

Signed-off-by: Daeyeon Jeong <daeyeon.dev@gmail.com>
PR-URL: https://github.com/nodejs/node/pull/45157
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Feng Yu <F3n67u@outlook.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
2022-10-27 23:34:39 +00:00

202 lines
5.4 KiB
JavaScript

'use strict';
const common = require('../common');
const assert = require('assert');
const {
PerformanceObserver,
PerformanceEntry,
PerformanceMark,
PerformanceMeasure,
performance,
performance: {
nodeTiming,
},
} = require('perf_hooks');
assert(PerformanceObserver);
assert(PerformanceEntry);
assert(PerformanceMark);
assert(performance.mark);
assert(performance.measure);
[PerformanceMark, PerformanceMeasure].forEach((c) => {
assert.deepStrictEqual(
Object.getOwnPropertyDescriptor(c.prototype, Symbol.toStringTag),
{
configurable: true,
enumerable: false,
writable: false,
value: c.name,
}
);
});
[undefined, 'a', 'null', 1, true].forEach((i) => {
const m = performance.mark(i);
assert(m instanceof PerformanceEntry);
assert(m instanceof PerformanceMark);
assert.strictEqual(m.name, `${i}`);
assert.strictEqual(m.entryType, 'mark');
assert.strictEqual(typeof m.startTime, 'number');
assert.strictEqual(m.duration, 0);
assert.strictEqual(m.detail, null);
});
performance.clearMarks();
assert.throws(() => performance.mark(Symbol('a')), {
message: /Cannot convert a Symbol value to a string/
});
[undefined, null].forEach((detail) => {
const m = performance.mark('a', { detail });
assert.strictEqual(m.name, 'a');
assert.strictEqual(m.entryType, 'mark');
assert.strictEqual(m.detail, null);
});
[1, 'any', {}, [], /a/].forEach((detail) => {
const m = performance.mark('a', { detail });
assert.strictEqual(m.name, 'a');
assert.strictEqual(m.entryType, 'mark');
// Value of detail is structured cloned.
assert.deepStrictEqual(m.detail, detail);
if (typeof detail === 'object') {
assert.notStrictEqual(m.detail, detail);
}
});
performance.clearMarks();
{
const m = performance.mark('a', { startTime: 1 });
assert.strictEqual(m.startTime, 1);
}
assert.throws(() => performance.mark('a', { startTime: 'a' }), {
code: 'ERR_INVALID_ARG_TYPE'
});
performance.clearMarks();
performance.clearMarks(1);
performance.clearMarks(null);
assert.throws(() => performance.clearMarks(Symbol('foo')), {
message: /Cannot convert a Symbol value to a string/
});
{
performance.mark('a', { startTime: 0 });
performance.mark('b', { startTime: 10 });
{
const m3 = performance.measure('foo', 'a', 'b');
assert.strictEqual(m3.name, 'foo');
assert.strictEqual(m3.entryType, 'measure');
assert.strictEqual(m3.startTime, 0);
assert.strictEqual(m3.duration, 10);
}
{
const m3 = performance.measure('foo', 'a');
assert.strictEqual(m3.name, 'foo');
assert.strictEqual(m3.entryType, 'measure');
assert.strictEqual(m3.startTime, 0);
assert(m3.duration > 0); // Duration is non-deterministic here.
}
{
const m3 = performance.measure('foo', { start: 'a' });
assert.strictEqual(m3.name, 'foo');
assert.strictEqual(m3.entryType, 'measure');
assert.strictEqual(m3.startTime, 0);
assert(m3.duration > 0); // Duration is non-deterministic here.
}
{
const m3 = performance.measure('foo', { end: 'b' });
assert.strictEqual(m3.name, 'foo');
assert.strictEqual(m3.entryType, 'measure');
assert.strictEqual(m3.startTime, 0);
assert.strictEqual(m3.duration, 10);
}
{
const m3 = performance.measure('foo', { duration: 11, end: 'b' });
assert.strictEqual(m3.name, 'foo');
assert.strictEqual(m3.entryType, 'measure');
assert.strictEqual(m3.startTime, -1);
assert.strictEqual(m3.duration, 11);
}
{
const m3 = performance.measure('foo', { duration: 11, start: 'b' });
assert.strictEqual(m3.name, 'foo');
assert.strictEqual(m3.entryType, 'measure');
assert.strictEqual(m3.startTime, 10);
assert.strictEqual(m3.duration, 11);
}
{
const m3 = performance.measure('foo', 'nodeStart');
assert.strictEqual(m3.name, 'foo');
assert.strictEqual(m3.entryType, 'measure');
assert.strictEqual(m3.startTime, nodeTiming.nodeStart);
assert(m3.duration > 0); // Duration is non-deterministic here.
}
{
const m3 = performance.measure('foo', 'nodeStart', 'bootstrapComplete');
assert.strictEqual(m3.name, 'foo');
assert.strictEqual(m3.entryType, 'measure');
assert.strictEqual(m3.startTime, nodeTiming.nodeStart);
assert.strictEqual(
m3.duration,
nodeTiming.bootstrapComplete - nodeTiming.nodeStart);
}
{
const m3 = performance.measure('foo', { start: 'nodeStart', duration: 10 });
assert.strictEqual(m3.name, 'foo');
assert.strictEqual(m3.entryType, 'measure');
assert.strictEqual(m3.startTime, nodeTiming.nodeStart);
assert.strictEqual(m3.duration, 10);
}
performance.clearMarks();
}
{
const obs = new PerformanceObserver(common.mustCall((list) => {
{
const entries = list.getEntries();
assert.strictEqual(entries.length, 3);
}
{
const entries = list.getEntriesByType('mark');
assert.strictEqual(entries.length, 2);
}
{
const entries = list.getEntriesByType('measure');
assert.strictEqual(entries.length, 1);
}
{
const entries = list.getEntriesByName('a');
assert.strictEqual(entries.length, 1);
}
{
const entries = list.getEntriesByName('b');
assert.strictEqual(entries.length, 1);
}
{
const entries = list.getEntriesByName('a to b');
assert.strictEqual(entries.length, 1);
}
obs.disconnect();
}));
obs.observe({ entryTypes: ['mark', 'measure'] });
performance.mark('a');
performance.mark('b');
performance.measure('a to b', 'a', 'b');
}