~/Projects/chrome-devtools-frontend
git clone https://code.lsong.org/chrome-devtools-frontend
Commit
- Commit
- e101509b2a86a088ea2a7911bdf7884ba1bb20a1
- Author
- Jack Franklin <[email protected]>
- Date
- 2022-11-11 11:25:56 +0000 +0000
- Diffstat
.gitignore | 1 test/unittests/BUILD.gn | 1 test/unittests/fixtures/traces/BUILD.gn | 9 ++ test/unittests/fixtures/traces/README.md | 7 + test/unittests/front_end/core/sdk/TracingModel_test.ts | 8 + test/unittests/front_end/helpers/BUILD.gn | 1 test/unittests/front_end/helpers/TraceHelpers.ts | 50 ++++++++++++ test/unittests/karma.conf.js | 3
Add trace file fixtures to unit test infrastructure This CL creates `test/unittests/fixtures/traces` and adds helpers to `TraceHelpers.ts` that can load a trace file and decode it from a GZ. Fixed: 1383445 Change-Id: Ieee6b9f050c1b9d7015157fa30804ae5609b28c1 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/4020266 Reviewed-by: Andres Olivares <[email protected]> Commit-Queue: Jack Franklin <[email protected]>
diff --git a/.gitignore b/.gitignore index 336c7f7419a65dd34b8d8abd1c4283b1516fc16b..035673bccb234d590b676053a71d7bad19878d1e 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,7 @@ !/third_party/typescript test/screenshots/.generated test/perf/.generated +test/unittests/fixtures/traces/*.json /.vscode/settings.json /.vscode/tasks.json diff --git a/test/unittests/BUILD.gn b/test/unittests/BUILD.gn index 5f76eca29d9c5e0ec04f366e8ecee68015b190c5..96f6cdfac2c8309dd838afd250a4eba7bf000059 100644 --- a/test/unittests/BUILD.gn +++ b/test/unittests/BUILD.gn @@ -13,6 +13,7 @@ deps = [ ":copy_debug_check", ":copy_to_gen", "../../front_end/ui/legacy:copy_stylesheets_for_server", + "fixtures/traces", "front_end", "inspector_overlay", ] diff --git a/test/unittests/fixtures/traces/BUILD.gn b/test/unittests/fixtures/traces/BUILD.gn new file mode 100644 index 0000000000000000000000000000000000000000..815a7d666d4c1c12815eafcdfd00162471198dc4 --- /dev/null +++ b/test/unittests/fixtures/traces/BUILD.gn @@ -0,0 +1,9 @@ +# Copyright 2022 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("../../../../scripts/build/ninja/copy.gni") + +copy_to_gen("traces") { + sources = [ "basic.json.gz" ] +} diff --git a/test/unittests/fixtures/traces/README.md b/test/unittests/fixtures/traces/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d6fe76442e26162a4be1c1f26709a6337fd466b1 --- /dev/null +++ b/test/unittests/fixtures/traces/README.md @@ -0,0 +1,7 @@ +# Traces + +This folder contains traces saved by the DevTools Performance Panel that can be used in tests. + +To add a trace, copy the `*.json.gz` file into this folder, and add it to the `BUILD.gn`. You can also add the unzipped `*.json` file, but these are git-ignored. However, it's useful when working with a trace file to have it extracted and inspectable! + +To load a trace in a test, use the `loadTraceFile` function from `helpers/TraceHelpers.ts`. diff --git a/test/unittests/fixtures/traces/basic.json.gz b/test/unittests/fixtures/traces/basic.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..4ccee04088a2dd245e32f7a374ce7a1e00fc8d34 Binary files /dev/null and b/test/unittests/fixtures/traces/basic.json.gz differ diff --git a/test/unittests/front_end/core/sdk/TracingModel_test.ts b/test/unittests/front_end/core/sdk/TracingModel_test.ts index f8829974bccd24dd3d101db3d1fd6f35c5c23763..b1a2be937ae8fb40c6ed73427ebdbbd073d9729b 100644 --- a/test/unittests/front_end/core/sdk/TracingModel_test.ts +++ b/test/unittests/front_end/core/sdk/TracingModel_test.ts @@ -5,6 +5,8 @@ const {assert} = chai; import * as SDK from '../../../../../front_end/core/sdk/sdk.js'; +import {loadTraceFile} from '../../helpers/TraceHelpers.js'; +import {FakeStorage} from '../../helpers/TimelineHelpers.js'; describe('TracingModel', () => { it('is able to determine if a phase is a nestable async phase', () => { @@ -29,5 +31,11 @@ '\'m\' should not be considered a nestable async phase'); }); // Use of this source code is governed by a BSD-style license that can be +import * as SDK from '../../../../../front_end/core/sdk/sdk.js'; // Use of this source code is governed by a BSD-style license that can be +describe('TracingModel', () => { + const model = new SDK.TracingModel.TracingModel(new FakeStorage()); + model.addEvents(events); + assert.strictEqual(model.sortedProcesses().length, 4); + }); }); diff --git a/test/unittests/front_end/helpers/BUILD.gn b/test/unittests/front_end/helpers/BUILD.gn index 75923f022684a07a8e14e93fb62f9deedb4e872c..0ba493cf4fe58547d4ea17155943768041c40b2c 100644 --- a/test/unittests/front_end/helpers/BUILD.gn +++ b/test/unittests/front_end/helpers/BUILD.gn @@ -22,6 +22,7 @@ "RealConnection.ts", "SourceMapEncoder.ts", "SourceMapEncoder_test.ts", "TimelineHelpers.ts", + "TraceHelpers.ts", "TrackAsyncOperations.ts", "UISourceCodeHelpers.ts", "UserMetricsHelpers.ts", diff --git a/test/unittests/front_end/helpers/TraceHelpers.ts b/test/unittests/front_end/helpers/TraceHelpers.ts new file mode 100644 index 0000000000000000000000000000000000000000..d439792b11eaeefe5bea31b1c11d2dd4a362d727 --- /dev/null +++ b/test/unittests/front_end/helpers/TraceHelpers.ts @@ -0,0 +1,50 @@ +// Copyright 2022 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 SDK from '../../../../front_end/core/sdk/sdk.js'; + +interface CompressionStream extends ReadableWritablePair<Uint8Array, Uint8Array> {} +interface DecompressionStream extends ReadableWritablePair<Uint8Array, Uint8Array> {} +declare const CompressionStream: { + prototype: CompressionStream, + new (type: string): CompressionStream, +}; + +declare const DecompressionStream: { + prototype: DecompressionStream, + new (type: string): DecompressionStream, +}; + +function codec(buffer: ArrayBuffer, codecStream: CompressionStream|DecompressionStream): Promise<ArrayBuffer> { + const {readable, writable} = new TransformStream(); + const codecReadable = readable.pipeThrough(codecStream); + + const writer = writable.getWriter(); + void writer.write(buffer); + void writer.close(); + + // Wrap in a response for convenience. + const response = new Response(codecReadable); + return response.arrayBuffer(); +} + +function decodeGzipBuffer(buffer: ArrayBuffer): Promise<ArrayBuffer> { + return codec(buffer, new DecompressionStream('gzip')); +} + +export async function loadTraceFile(name: string): Promise<Array<SDK.TracingManager.EventPayload>> { + const url = `/fixtures/traces/${name}`; + const response = await fetch(url); + if (response.status !== 200) { + throw new Error(`Unable to load ${url}`); + } + + const contentType = response.headers.get('content-type'); + const isGzipEncoded = contentType !== null && contentType.includes('gzip'); + let buffer = await response.arrayBuffer(); + if (isGzipEncoded) { + buffer = await decodeGzipBuffer(buffer); + } + const decoder = new TextDecoder('utf-8'); + return JSON.parse(decoder.decode(buffer)); +} diff --git a/test/unittests/karma.conf.js b/test/unittests/karma.conf.js index 89be8c4fc4c7bdbdcfec92adb8d9a819db57befe..c7b81b989528e1db0891c330bdd72ef48915c314 100644 --- a/test/unittests/karma.conf.js +++ b/test/unittests/karma.conf.js @@ -150,6 +150,8 @@ {pattern: path.join(ROOT_DIRECTORY, 'front_end/**/*.ts'), served: true, included: false, watched: false}, {pattern: path.join(GEN_DIRECTORY, 'inspector_overlay/**/*.js'), served: true, included: false}, {pattern: path.join(GEN_DIRECTORY, 'inspector_overlay/**/*.js.map'), served: true, included: false}, // Copyright 2019 The Chromium Authors. All rights reserved. + }) +// Copyright 2019 The Chromium Authors. All rights reserved. const COVERAGE_OUTPUT_DIRECTORY = 'karma-coverage'; reporters: [ @@ -201,6 +203,7 @@ proxies: { '/Images': `/base/${targetDir}/front_end/Images`, '/locales': `/base/${targetDir}/front_end/core/i18n/locales`, '/json': `http://localhost:${REMOTE_DEBUGGING_PORT}/json`, + '/fixtures': `/base/${targetDir}/test/unittests/fixtures`, }, coverageReporter: {