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