|
2 | 2 | // Use of this source code is governed by a BSD-style license that can be |
3 | 3 | // found in the LICENSE file. |
4 | 4 |
|
| 5 | +import * as Trace from '../../../models/trace/trace.js'; |
5 | 6 | import {describeWithEnvironment} from '../../../testing/EnvironmentHelpers.js'; |
6 | 7 | import {TraceLoader} from '../../../testing/TraceLoader.js'; |
7 | 8 |
|
@@ -77,4 +78,108 @@ self: 0.2 |
77 | 78 | const fibCallCount = lines.filter(line => line.includes('fibonacci')).length; |
78 | 79 | assert.isTrue(fibCallCount > 10); |
79 | 80 | }); |
| 81 | + |
| 82 | + it('AITreeFilter includes the right items in the tree', async function() { |
| 83 | + const {parsedTrace} = await TraceLoader.traceEngine(this, 'two-workers.json.gz'); |
| 84 | + const mainEvents = parsedTrace.Renderer.allTraceEntries; |
| 85 | + |
| 86 | + // A very small 'get storage' event. It's 6µs long |
| 87 | + const tinyEvent = mainEvents.find(event => event.ts === 107350149168); |
| 88 | + if (!tinyEvent) { |
| 89 | + throw new Error('Could not find expected event.'); |
| 90 | + } |
| 91 | + const tinyStr = Utils.AICallTree.AICallTree.from(tinyEvent, mainEvents, parsedTrace).serialize(); |
| 92 | + assert.strictEqual(tinyStr.split('\n').filter(l => l.startsWith('Node:')).join('\n'), ` |
| 93 | +Node: 1 – Task |
| 94 | +Node: 2 – Parse HTML |
| 95 | +Node: 3 – Evaluate script |
| 96 | +Node: 4 – (anonymous) |
| 97 | +Node: 5 – get storage`.trim()); |
| 98 | + assert.include(tinyStr, 'get storage'); |
| 99 | + |
| 100 | + // An evaluateScript that has 3 'Compile code' children |
| 101 | + const evaluateEvent = mainEvents.find(event => event.ts === 107350147808); |
| 102 | + if (!evaluateEvent) { |
| 103 | + throw new Error('Could not find expected event.'); |
| 104 | + } |
| 105 | + const treeStr = Utils.AICallTree.AICallTree.from(evaluateEvent, mainEvents, parsedTrace).serialize(); |
| 106 | + assert.strictEqual(treeStr.split('\n').filter(l => l.startsWith('Node:')).join('\n'), ` |
| 107 | +Node: 1 – Task |
| 108 | +Node: 2 – Parse HTML |
| 109 | +Node: 3 – Evaluate script |
| 110 | +Node: 4 – Compile script |
| 111 | +Node: 5 – (anonymous) |
| 112 | +Node: 6 – H.la`.trim()); |
| 113 | + assert.notInclude(treeStr, 'Compile code'); |
| 114 | + |
| 115 | + // An Compile code event within the evaluateEvent call tree |
| 116 | + const compileEvent = mainEvents.find(event => event.ts === 107350148218); |
| 117 | + if (!compileEvent) { |
| 118 | + throw new Error('Could not find expected event.'); |
| 119 | + } |
| 120 | + const compileStr = Utils.AICallTree.AICallTree.from(compileEvent, mainEvents, parsedTrace).serialize(); |
| 121 | + assert.strictEqual(compileStr.split('\n').filter(l => l.startsWith('Node:')).join('\n'), ` |
| 122 | +Node: 1 – Task |
| 123 | +Node: 2 – Parse HTML |
| 124 | +Node: 3 – Evaluate script |
| 125 | +Node: 4 – (anonymous) |
| 126 | +Node: 5 – Compile code`.trim()); |
| 127 | + assert.include(compileStr, 'Compile code'); |
| 128 | + }); |
| 129 | +}); |
| 130 | + |
| 131 | +describe('AITreeFilter', () => { |
| 132 | + const makeEvent = ( |
| 133 | + name: string, |
| 134 | + ts: number, |
| 135 | + dur: number, |
| 136 | + ): Trace.Types.Events.Event => ({ |
| 137 | + name, |
| 138 | + cat: 'disabled-by-default-devtools.timeline', |
| 139 | + ph: Trace.Types.Events.Phase.COMPLETE, |
| 140 | + ts: Trace.Types.Timing.MicroSeconds(ts), |
| 141 | + dur: Trace.Types.Timing.MicroSeconds(dur), |
| 142 | + pid: Trace.Types.Events.ProcessID(1), |
| 143 | + tid: Trace.Types.Events.ThreadID(4), |
| 144 | + args: {}, |
| 145 | + }); |
| 146 | + |
| 147 | + it('always includes the selected event', () => { |
| 148 | + const selectedEvent = makeEvent('selected', 0, 100); |
| 149 | + const filter = new Utils.AICallTree.AITreeFilter(selectedEvent); |
| 150 | + assert.strictEqual(filter.accept(selectedEvent), true); |
| 151 | + }); |
| 152 | + |
| 153 | + it('includes events that are long enough', () => { |
| 154 | + const selectedEvent = makeEvent('selected', 0, 100); |
| 155 | + const filter = new Utils.AICallTree.AITreeFilter(selectedEvent); |
| 156 | + |
| 157 | + assert.strictEqual(filter.accept(makeEvent('short', 0, 1)), true); |
| 158 | + assert.strictEqual(filter.accept(makeEvent('short', 0, 0.6)), true); |
| 159 | + assert.strictEqual(filter.accept(makeEvent('long', 0, 101)), true); |
| 160 | + assert.strictEqual(filter.accept(makeEvent('long', 0, 200)), true); |
| 161 | + assert.strictEqual(filter.accept(makeEvent('long', 0, 1000)), true); |
| 162 | + }); |
| 163 | + |
| 164 | + it('excludes events that are too short', () => { |
| 165 | + const selectedEvent = makeEvent('selected', 0, 100); |
| 166 | + const filter = new Utils.AICallTree.AITreeFilter(selectedEvent); |
| 167 | + |
| 168 | + assert.strictEqual(filter.accept(makeEvent('short', 0, 0)), false); |
| 169 | + assert.strictEqual(filter.accept(makeEvent('short', 0, 0.1)), false); |
| 170 | + assert.strictEqual(filter.accept(makeEvent('short', 0, 0.4)), false); |
| 171 | + }); |
| 172 | + |
| 173 | + it('excludes COMPILE_CODE nodes if non-selected', () => { |
| 174 | + const selectedEvent = makeEvent('selected', 0, 100); |
| 175 | + const compileCodeEvent = makeEvent(Trace.Types.Events.Name.COMPILE_CODE, 0, 100); |
| 176 | + const filter = new Utils.AICallTree.AITreeFilter(selectedEvent); |
| 177 | + assert.strictEqual(filter.accept(compileCodeEvent), false); |
| 178 | + }); |
| 179 | + |
| 180 | + it('includes COMPILE_CODE nodes if selected', () => { |
| 181 | + const selectedEvent = makeEvent(Trace.Types.Events.Name.COMPILE_CODE, 0, 100); |
| 182 | + const filter = new Utils.AICallTree.AITreeFilter(selectedEvent); |
| 183 | + assert.strictEqual(filter.accept(selectedEvent), true); |
| 184 | + }); |
80 | 185 | }); |
0 commit comments