Liu Song’s Projects


~/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: {