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