11cb0ef41Sopenharmony_ci'use strict'; 21cb0ef41Sopenharmony_ci 31cb0ef41Sopenharmony_ciconst common = require('../common'); 41cb0ef41Sopenharmony_ciconst assert = require('assert'); 51cb0ef41Sopenharmony_ciconst { 61cb0ef41Sopenharmony_ci PerformanceObserver, 71cb0ef41Sopenharmony_ci PerformanceEntry, 81cb0ef41Sopenharmony_ci PerformanceMark, 91cb0ef41Sopenharmony_ci performance: { 101cb0ef41Sopenharmony_ci nodeTiming, 111cb0ef41Sopenharmony_ci mark, 121cb0ef41Sopenharmony_ci measure, 131cb0ef41Sopenharmony_ci clearMarks, 141cb0ef41Sopenharmony_ci }, 151cb0ef41Sopenharmony_ci} = require('perf_hooks'); 161cb0ef41Sopenharmony_ci 171cb0ef41Sopenharmony_ciassert(PerformanceObserver); 181cb0ef41Sopenharmony_ciassert(PerformanceEntry); 191cb0ef41Sopenharmony_ciassert(PerformanceMark); 201cb0ef41Sopenharmony_ciassert(mark); 211cb0ef41Sopenharmony_ciassert(measure); 221cb0ef41Sopenharmony_ci 231cb0ef41Sopenharmony_ci[undefined, 'a', 'null', 1, true].forEach((i) => { 241cb0ef41Sopenharmony_ci const m = mark(i); 251cb0ef41Sopenharmony_ci assert(m instanceof PerformanceEntry); 261cb0ef41Sopenharmony_ci assert(m instanceof PerformanceMark); 271cb0ef41Sopenharmony_ci 281cb0ef41Sopenharmony_ci assert.strictEqual(m.name, `${i}`); 291cb0ef41Sopenharmony_ci assert.strictEqual(m.entryType, 'mark'); 301cb0ef41Sopenharmony_ci assert.strictEqual(typeof m.startTime, 'number'); 311cb0ef41Sopenharmony_ci assert.strictEqual(m.duration, 0); 321cb0ef41Sopenharmony_ci assert.strictEqual(m.detail, null); 331cb0ef41Sopenharmony_ci}); 341cb0ef41Sopenharmony_ci 351cb0ef41Sopenharmony_ciclearMarks(); 361cb0ef41Sopenharmony_ci 371cb0ef41Sopenharmony_ciassert.throws(() => mark(Symbol('a')), { 381cb0ef41Sopenharmony_ci message: /Cannot convert a Symbol value to a string/ 391cb0ef41Sopenharmony_ci}); 401cb0ef41Sopenharmony_ci 411cb0ef41Sopenharmony_ci[undefined, null].forEach((detail) => { 421cb0ef41Sopenharmony_ci const m = mark('a', { detail }); 431cb0ef41Sopenharmony_ci assert.strictEqual(m.name, 'a'); 441cb0ef41Sopenharmony_ci assert.strictEqual(m.entryType, 'mark'); 451cb0ef41Sopenharmony_ci assert.strictEqual(m.detail, null); 461cb0ef41Sopenharmony_ci}); 471cb0ef41Sopenharmony_ci[1, 'any', {}, [], /a/].forEach((detail) => { 481cb0ef41Sopenharmony_ci const m = mark('a', { detail }); 491cb0ef41Sopenharmony_ci assert.strictEqual(m.name, 'a'); 501cb0ef41Sopenharmony_ci assert.strictEqual(m.entryType, 'mark'); 511cb0ef41Sopenharmony_ci // Value of detail is structured cloned. 521cb0ef41Sopenharmony_ci assert.deepStrictEqual(m.detail, detail); 531cb0ef41Sopenharmony_ci if (typeof detail === 'object') { 541cb0ef41Sopenharmony_ci assert.notStrictEqual(m.detail, detail); 551cb0ef41Sopenharmony_ci } 561cb0ef41Sopenharmony_ci}); 571cb0ef41Sopenharmony_ci 581cb0ef41Sopenharmony_ciclearMarks(); 591cb0ef41Sopenharmony_ci 601cb0ef41Sopenharmony_ci{ 611cb0ef41Sopenharmony_ci const m = mark('a', { startTime: 1 }); 621cb0ef41Sopenharmony_ci assert.strictEqual(m.startTime, 1); 631cb0ef41Sopenharmony_ci} 641cb0ef41Sopenharmony_ci 651cb0ef41Sopenharmony_ciassert.throws(() => mark('a', { startTime: 'a' }), { 661cb0ef41Sopenharmony_ci code: 'ERR_INVALID_ARG_TYPE' 671cb0ef41Sopenharmony_ci}); 681cb0ef41Sopenharmony_ci 691cb0ef41Sopenharmony_ciclearMarks(); 701cb0ef41Sopenharmony_ciclearMarks(1); 711cb0ef41Sopenharmony_ciclearMarks(null); 721cb0ef41Sopenharmony_ci 731cb0ef41Sopenharmony_ciassert.throws(() => clearMarks(Symbol('foo')), { 741cb0ef41Sopenharmony_ci message: /Cannot convert a Symbol value to a string/ 751cb0ef41Sopenharmony_ci}); 761cb0ef41Sopenharmony_ci 771cb0ef41Sopenharmony_ci{ 781cb0ef41Sopenharmony_ci mark('a', { startTime: 0 }); 791cb0ef41Sopenharmony_ci mark('b', { startTime: 10 }); 801cb0ef41Sopenharmony_ci 811cb0ef41Sopenharmony_ci { 821cb0ef41Sopenharmony_ci const m3 = measure('foo', 'a', 'b'); 831cb0ef41Sopenharmony_ci assert.strictEqual(m3.name, 'foo'); 841cb0ef41Sopenharmony_ci assert.strictEqual(m3.entryType, 'measure'); 851cb0ef41Sopenharmony_ci assert.strictEqual(m3.startTime, 0); 861cb0ef41Sopenharmony_ci assert.strictEqual(m3.duration, 10); 871cb0ef41Sopenharmony_ci } 881cb0ef41Sopenharmony_ci 891cb0ef41Sopenharmony_ci { 901cb0ef41Sopenharmony_ci const m3 = measure('foo', 'a'); 911cb0ef41Sopenharmony_ci assert.strictEqual(m3.name, 'foo'); 921cb0ef41Sopenharmony_ci assert.strictEqual(m3.entryType, 'measure'); 931cb0ef41Sopenharmony_ci assert.strictEqual(m3.startTime, 0); 941cb0ef41Sopenharmony_ci assert(m3.duration > 0); // Duration is non-deterministic here. 951cb0ef41Sopenharmony_ci } 961cb0ef41Sopenharmony_ci 971cb0ef41Sopenharmony_ci { 981cb0ef41Sopenharmony_ci const m3 = measure('foo', { start: 'a' }); 991cb0ef41Sopenharmony_ci assert.strictEqual(m3.name, 'foo'); 1001cb0ef41Sopenharmony_ci assert.strictEqual(m3.entryType, 'measure'); 1011cb0ef41Sopenharmony_ci assert.strictEqual(m3.startTime, 0); 1021cb0ef41Sopenharmony_ci assert(m3.duration > 0); // Duration is non-deterministic here. 1031cb0ef41Sopenharmony_ci } 1041cb0ef41Sopenharmony_ci 1051cb0ef41Sopenharmony_ci { 1061cb0ef41Sopenharmony_ci const m3 = measure('foo', { end: 'b' }); 1071cb0ef41Sopenharmony_ci assert.strictEqual(m3.name, 'foo'); 1081cb0ef41Sopenharmony_ci assert.strictEqual(m3.entryType, 'measure'); 1091cb0ef41Sopenharmony_ci assert.strictEqual(m3.startTime, 0); 1101cb0ef41Sopenharmony_ci assert.strictEqual(m3.duration, 10); 1111cb0ef41Sopenharmony_ci } 1121cb0ef41Sopenharmony_ci 1131cb0ef41Sopenharmony_ci { 1141cb0ef41Sopenharmony_ci const m3 = measure('foo', { duration: 11, end: 'b' }); 1151cb0ef41Sopenharmony_ci assert.strictEqual(m3.name, 'foo'); 1161cb0ef41Sopenharmony_ci assert.strictEqual(m3.entryType, 'measure'); 1171cb0ef41Sopenharmony_ci assert.strictEqual(m3.startTime, -1); 1181cb0ef41Sopenharmony_ci assert.strictEqual(m3.duration, 11); 1191cb0ef41Sopenharmony_ci } 1201cb0ef41Sopenharmony_ci 1211cb0ef41Sopenharmony_ci { 1221cb0ef41Sopenharmony_ci const m3 = measure('foo', { duration: 11, start: 'b' }); 1231cb0ef41Sopenharmony_ci assert.strictEqual(m3.name, 'foo'); 1241cb0ef41Sopenharmony_ci assert.strictEqual(m3.entryType, 'measure'); 1251cb0ef41Sopenharmony_ci assert.strictEqual(m3.startTime, 10); 1261cb0ef41Sopenharmony_ci assert.strictEqual(m3.duration, 11); 1271cb0ef41Sopenharmony_ci } 1281cb0ef41Sopenharmony_ci 1291cb0ef41Sopenharmony_ci { 1301cb0ef41Sopenharmony_ci const m3 = measure('foo', 'nodeStart'); 1311cb0ef41Sopenharmony_ci assert.strictEqual(m3.name, 'foo'); 1321cb0ef41Sopenharmony_ci assert.strictEqual(m3.entryType, 'measure'); 1331cb0ef41Sopenharmony_ci assert.strictEqual(m3.startTime, nodeTiming.nodeStart); 1341cb0ef41Sopenharmony_ci assert(m3.duration > 0); // Duration is non-deterministic here. 1351cb0ef41Sopenharmony_ci } 1361cb0ef41Sopenharmony_ci 1371cb0ef41Sopenharmony_ci { 1381cb0ef41Sopenharmony_ci const m3 = measure('foo', 'nodeStart', 'bootstrapComplete'); 1391cb0ef41Sopenharmony_ci assert.strictEqual(m3.name, 'foo'); 1401cb0ef41Sopenharmony_ci assert.strictEqual(m3.entryType, 'measure'); 1411cb0ef41Sopenharmony_ci assert.strictEqual(m3.startTime, nodeTiming.nodeStart); 1421cb0ef41Sopenharmony_ci assert.strictEqual( 1431cb0ef41Sopenharmony_ci m3.duration, 1441cb0ef41Sopenharmony_ci nodeTiming.bootstrapComplete - nodeTiming.nodeStart); 1451cb0ef41Sopenharmony_ci } 1461cb0ef41Sopenharmony_ci 1471cb0ef41Sopenharmony_ci { 1481cb0ef41Sopenharmony_ci const m3 = measure('foo', { start: 'nodeStart', duration: 10 }); 1491cb0ef41Sopenharmony_ci assert.strictEqual(m3.name, 'foo'); 1501cb0ef41Sopenharmony_ci assert.strictEqual(m3.entryType, 'measure'); 1511cb0ef41Sopenharmony_ci assert.strictEqual(m3.startTime, nodeTiming.nodeStart); 1521cb0ef41Sopenharmony_ci assert.strictEqual(m3.duration, 10); 1531cb0ef41Sopenharmony_ci } 1541cb0ef41Sopenharmony_ci 1551cb0ef41Sopenharmony_ci clearMarks(); 1561cb0ef41Sopenharmony_ci} 1571cb0ef41Sopenharmony_ci 1581cb0ef41Sopenharmony_ci{ 1591cb0ef41Sopenharmony_ci const obs = new PerformanceObserver(common.mustCall((list) => { 1601cb0ef41Sopenharmony_ci { 1611cb0ef41Sopenharmony_ci const entries = list.getEntries(); 1621cb0ef41Sopenharmony_ci assert.strictEqual(entries.length, 3); 1631cb0ef41Sopenharmony_ci } 1641cb0ef41Sopenharmony_ci { 1651cb0ef41Sopenharmony_ci const entries = list.getEntriesByType('mark'); 1661cb0ef41Sopenharmony_ci assert.strictEqual(entries.length, 2); 1671cb0ef41Sopenharmony_ci } 1681cb0ef41Sopenharmony_ci { 1691cb0ef41Sopenharmony_ci const entries = list.getEntriesByType('measure'); 1701cb0ef41Sopenharmony_ci assert.strictEqual(entries.length, 1); 1711cb0ef41Sopenharmony_ci } 1721cb0ef41Sopenharmony_ci { 1731cb0ef41Sopenharmony_ci const entries = list.getEntriesByName('a'); 1741cb0ef41Sopenharmony_ci assert.strictEqual(entries.length, 1); 1751cb0ef41Sopenharmony_ci } 1761cb0ef41Sopenharmony_ci { 1771cb0ef41Sopenharmony_ci const entries = list.getEntriesByName('b'); 1781cb0ef41Sopenharmony_ci assert.strictEqual(entries.length, 1); 1791cb0ef41Sopenharmony_ci } 1801cb0ef41Sopenharmony_ci { 1811cb0ef41Sopenharmony_ci const entries = list.getEntriesByName('a to b'); 1821cb0ef41Sopenharmony_ci assert.strictEqual(entries.length, 1); 1831cb0ef41Sopenharmony_ci } 1841cb0ef41Sopenharmony_ci obs.disconnect(); 1851cb0ef41Sopenharmony_ci })); 1861cb0ef41Sopenharmony_ci obs.observe({ entryTypes: ['mark', 'measure'] }); 1871cb0ef41Sopenharmony_ci mark('a'); 1881cb0ef41Sopenharmony_ci mark('b'); 1891cb0ef41Sopenharmony_ci measure('a to b', 'a', 'b'); 1901cb0ef41Sopenharmony_ci} 191