// Flags: --expose-internals --no-warnings 'use strict'; const common = require('../common'); const assert = require('assert'); const { inspect } = require('util'); const { internalBinding } = require('internal/test/binding'); const { observerCounts: counts } = internalBinding('performance'); const { performance, PerformanceObserver, constants } = require('perf_hooks'); const { NODE_PERFORMANCE_ENTRY_TYPE_GC, NODE_PERFORMANCE_ENTRY_TYPE_HTTP2, } = constants; assert.strictEqual(counts[NODE_PERFORMANCE_ENTRY_TYPE_GC], 0); assert.strictEqual(counts[NODE_PERFORMANCE_ENTRY_TYPE_HTTP2], 0); { [1, null, undefined, {}, [], Infinity].forEach((i) => { assert.throws( () => new PerformanceObserver(i), { code: 'ERR_INVALID_CALLBACK', name: 'TypeError', message: `Callback must be a function. Received ${inspect(i)}` } ); }); const observer = new PerformanceObserver(common.mustNotCall()); [1, 'test'].forEach((input) => { assert.throws( () => observer.observe(input), { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError', message: 'The "options" argument must be of type object.' + common.invalidArgTypeHelper(input) }); }); [1, null, {}, Infinity].forEach((i) => { assert.throws(() => observer.observe({ entryTypes: i }), { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' }); }); const obs = new PerformanceObserver(common.mustNotCall()); obs.observe({ entryTypes: ['mark', 'mark'] }); obs.disconnect(); performance.mark('42'); } // Test Non-Buffered { const observer = new PerformanceObserver(common.mustCall(callback)); function callback(list, obs) { assert.strictEqual(obs, observer); const entries = list.getEntries(); assert.strictEqual(entries.length, 3); observer.disconnect(); } observer.observe({ entryTypes: ['mark', 'node'] }); performance.mark('test1'); performance.mark('test2'); performance.mark('test3'); }