• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2
3const common = require('../common');
4const assert = require('assert');
5const {
6  PerformanceObserver,
7  PerformanceEntry,
8  PerformanceMark,
9  performance: {
10    nodeTiming,
11    mark,
12    measure,
13    clearMarks,
14  },
15} = require('perf_hooks');
16
17assert(PerformanceObserver);
18assert(PerformanceEntry);
19assert(PerformanceMark);
20assert(mark);
21assert(measure);
22
23[undefined, 'a', 'null', 1, true].forEach((i) => {
24  const m = mark(i);
25  assert(m instanceof PerformanceEntry);
26  assert(m instanceof PerformanceMark);
27
28  assert.strictEqual(m.name, `${i}`);
29  assert.strictEqual(m.entryType, 'mark');
30  assert.strictEqual(typeof m.startTime, 'number');
31  assert.strictEqual(m.duration, 0);
32  assert.strictEqual(m.detail, null);
33});
34
35clearMarks();
36
37assert.throws(() => mark(Symbol('a')), {
38  message: /Cannot convert a Symbol value to a string/
39});
40
41[undefined, null].forEach((detail) => {
42  const m = mark('a', { detail });
43  assert.strictEqual(m.name, 'a');
44  assert.strictEqual(m.entryType, 'mark');
45  assert.strictEqual(m.detail, null);
46});
47[1, 'any', {}, [], /a/].forEach((detail) => {
48  const m = mark('a', { detail });
49  assert.strictEqual(m.name, 'a');
50  assert.strictEqual(m.entryType, 'mark');
51  // Value of detail is structured cloned.
52  assert.deepStrictEqual(m.detail, detail);
53  if (typeof detail === 'object') {
54    assert.notStrictEqual(m.detail, detail);
55  }
56});
57
58clearMarks();
59
60{
61  const m = mark('a', { startTime: 1 });
62  assert.strictEqual(m.startTime, 1);
63}
64
65assert.throws(() => mark('a', { startTime: 'a' }), {
66  code: 'ERR_INVALID_ARG_TYPE'
67});
68
69clearMarks();
70clearMarks(1);
71clearMarks(null);
72
73assert.throws(() => clearMarks(Symbol('foo')), {
74  message: /Cannot convert a Symbol value to a string/
75});
76
77{
78  mark('a', { startTime: 0 });
79  mark('b', { startTime: 10 });
80
81  {
82    const m3 = measure('foo', 'a', 'b');
83    assert.strictEqual(m3.name, 'foo');
84    assert.strictEqual(m3.entryType, 'measure');
85    assert.strictEqual(m3.startTime, 0);
86    assert.strictEqual(m3.duration, 10);
87  }
88
89  {
90    const m3 = measure('foo', 'a');
91    assert.strictEqual(m3.name, 'foo');
92    assert.strictEqual(m3.entryType, 'measure');
93    assert.strictEqual(m3.startTime, 0);
94    assert(m3.duration > 0);  // Duration is non-deterministic here.
95  }
96
97  {
98    const m3 = measure('foo', { start: 'a' });
99    assert.strictEqual(m3.name, 'foo');
100    assert.strictEqual(m3.entryType, 'measure');
101    assert.strictEqual(m3.startTime, 0);
102    assert(m3.duration > 0);  // Duration is non-deterministic here.
103  }
104
105  {
106    const m3 = measure('foo', { end: 'b' });
107    assert.strictEqual(m3.name, 'foo');
108    assert.strictEqual(m3.entryType, 'measure');
109    assert.strictEqual(m3.startTime, 0);
110    assert.strictEqual(m3.duration, 10);
111  }
112
113  {
114    const m3 = measure('foo', { duration: 11, end: 'b' });
115    assert.strictEqual(m3.name, 'foo');
116    assert.strictEqual(m3.entryType, 'measure');
117    assert.strictEqual(m3.startTime, -1);
118    assert.strictEqual(m3.duration, 11);
119  }
120
121  {
122    const m3 = measure('foo', { duration: 11, start: 'b' });
123    assert.strictEqual(m3.name, 'foo');
124    assert.strictEqual(m3.entryType, 'measure');
125    assert.strictEqual(m3.startTime, 10);
126    assert.strictEqual(m3.duration, 11);
127  }
128
129  {
130    const m3 = measure('foo', 'nodeStart');
131    assert.strictEqual(m3.name, 'foo');
132    assert.strictEqual(m3.entryType, 'measure');
133    assert.strictEqual(m3.startTime, nodeTiming.nodeStart);
134    assert(m3.duration > 0);  // Duration is non-deterministic here.
135  }
136
137  {
138    const m3 = measure('foo', 'nodeStart', 'bootstrapComplete');
139    assert.strictEqual(m3.name, 'foo');
140    assert.strictEqual(m3.entryType, 'measure');
141    assert.strictEqual(m3.startTime, nodeTiming.nodeStart);
142    assert.strictEqual(
143      m3.duration,
144      nodeTiming.bootstrapComplete - nodeTiming.nodeStart);
145  }
146
147  {
148    const m3 = measure('foo', { start: 'nodeStart', duration: 10 });
149    assert.strictEqual(m3.name, 'foo');
150    assert.strictEqual(m3.entryType, 'measure');
151    assert.strictEqual(m3.startTime, nodeTiming.nodeStart);
152    assert.strictEqual(m3.duration, 10);
153  }
154
155  clearMarks();
156}
157
158{
159  const obs = new PerformanceObserver(common.mustCall((list) => {
160    {
161      const entries = list.getEntries();
162      assert.strictEqual(entries.length, 3);
163    }
164    {
165      const entries = list.getEntriesByType('mark');
166      assert.strictEqual(entries.length, 2);
167    }
168    {
169      const entries = list.getEntriesByType('measure');
170      assert.strictEqual(entries.length, 1);
171    }
172    {
173      const entries = list.getEntriesByName('a');
174      assert.strictEqual(entries.length, 1);
175    }
176    {
177      const entries = list.getEntriesByName('b');
178      assert.strictEqual(entries.length, 1);
179    }
180    {
181      const entries = list.getEntriesByName('a to b');
182      assert.strictEqual(entries.length, 1);
183    }
184    obs.disconnect();
185  }));
186  obs.observe({ entryTypes: ['mark', 'measure'] });
187  mark('a');
188  mark('b');
189  measure('a to b', 'a', 'b');
190}
191