chrome-devtools-frontend
Version:
Chrome DevTools UI
80 lines (73 loc) • 3.18 kB
text/typescript
// Copyright 2023 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import type * as Trace from '../../models/trace/trace.js';
import {defaultTraceEvent} from '../../testing/TraceHelpers.js';
import * as Timeline from './timeline.js';
describe('SaveFileFormatter', () => {
function assertValidJSON(input: string) {
try {
JSON.parse(input);
} catch {
assert.fail('Parsing input as JSON failed');
}
}
describe('arrayOfObjectsJsonGenerator', () => {
it('generates JSON where each event is on its own line', async () => {
const eventOne = {...defaultTraceEvent, name: 'event_one'};
const eventTwo = {...defaultTraceEvent, name: 'event_two'};
const formatted =
Array.from(Timeline.SaveFileFormatter.arrayOfObjectsJsonGenerator([eventOne, eventTwo])).join('');
assertValidJSON(formatted);
assert.strictEqual(formatted, `[
{"name":"event_one","tid":0,"pid":0,"ts":0,"cat":"test","ph":"M"},
{"name":"event_two","tid":0,"pid":0,"ts":0,"cat":"test","ph":"M"}
]`);
});
});
describe('traceJsonGenerator', () => {
it('contains top level keys for the events and for the metadata', async () => {
const eventOne = {...defaultTraceEvent, name: 'event_one'};
const eventTwo = {...defaultTraceEvent, name: 'event_two'};
const events = [eventOne, eventTwo];
const metadata: Trace.Types.File.MetaData = {
source: 'DevTools',
startTime: '1234',
modifications: undefined, // Undefined values are removed within JSON.stringify
networkThrottling: '4',
cpuThrottling: 1,
hardwareConcurrency: 1,
enhancedTraceVersion: 1,
};
const formatted = Array.from(Timeline.SaveFileFormatter.traceJsonGenerator(events, metadata)).join('');
assertValidJSON(formatted);
assert.strictEqual(formatted, `{"metadata": {
"enhancedTraceVersion": 1,
"source": "DevTools",
"startTime": "1234",
"networkThrottling": "4",
"cpuThrottling": 1,
"hardwareConcurrency": 1
},
"traceEvents": [
{"name":"event_one","tid":0,"pid":0,"ts":0,"cat":"test","ph":"M"},
{"name":"event_two","tid":0,"pid":0,"ts":0,"cat":"test","ph":"M"}
]}\n`);
// Extra check that enhancedTraceVersion is first, to ensure maximumTraceFileLengthToDetermineEnhancedTraces has no problem.
const trace = JSON.parse(formatted);
assert.strictEqual(Object.keys(trace.metadata).at(0), 'enhancedTraceVersion');
});
it('will emit {} for the metadata if none is provided', async () => {
const eventOne = {...defaultTraceEvent, name: 'event_one'};
const eventTwo = {...defaultTraceEvent, name: 'event_two'};
const events = [eventOne, eventTwo];
const formatted = Array.from(Timeline.SaveFileFormatter.traceJsonGenerator(events, null)).join('');
assertValidJSON(formatted);
assert.strictEqual(formatted, `{"metadata": {},
"traceEvents": [
{"name":"event_one","tid":0,"pid":0,"ts":0,"cat":"test","ph":"M"},
{"name":"event_two","tid":0,"pid":0,"ts":0,"cat":"test","ph":"M"}
]}\n`);
});
});
});