From c2a88d17111184ea199742e55e3ee67d247f1aff Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Fri, 13 May 2022 10:53:30 +0100 Subject: [PATCH 1/9] Silence Cypress window access from support modules --- cypress/support/bot.ts | 2 +- cypress/support/client.ts | 4 ++-- cypress/support/login.ts | 4 ++-- cypress/support/synapse.ts | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cypress/support/bot.ts b/cypress/support/bot.ts index 3ba7b89cde7..a2488c0081e 100644 --- a/cypress/support/bot.ts +++ b/cypress/support/bot.ts @@ -40,7 +40,7 @@ Cypress.Commands.add("getBot", (synapse: SynapseInstance, displayName?: string): const username = Cypress._.uniqueId("userId_"); const password = Cypress._.uniqueId("password_"); return cy.registerUser(synapse, username, password, displayName).then(credentials => { - return cy.window().then(win => { + return cy.window({ log: false }).then(win => { const cli = new win.matrixcs.MatrixClient({ baseUrl: synapse.baseUrl, userId: credentials.userId, diff --git a/cypress/support/client.ts b/cypress/support/client.ts index eef3aa1086e..682f3ee426c 100644 --- a/cypress/support/client.ts +++ b/cypress/support/client.ts @@ -46,11 +46,11 @@ declare global { } Cypress.Commands.add("getClient", (): Chainable => { - return cy.window().then(win => win.mxMatrixClientPeg.matrixClient); + return cy.window({ log: false }).then(win => win.mxMatrixClientPeg.matrixClient); }); Cypress.Commands.add("createRoom", (options: ICreateRoomOpts): Chainable => { - return cy.window().then(async win => { + return cy.window({ log: false }).then(async win => { const cli = win.mxMatrixClientPeg.matrixClient; const resp = await cli.createRoom(options); const roomId = resp.room_id; diff --git a/cypress/support/login.ts b/cypress/support/login.ts index 90e5c5dbdcd..50be88ae670 100644 --- a/cypress/support/login.ts +++ b/cypress/support/login.ts @@ -43,7 +43,7 @@ declare global { Cypress.Commands.add("initTestUser", (synapse: SynapseInstance, displayName: string): Chainable => { // XXX: work around Cypress not clearing IDB between tests - cy.window().then(win => { + cy.window({ log: false }).then(win => { win.indexedDB.databases().then(databases => { databases.forEach(database => { win.indexedDB.deleteDatabase(database.name); @@ -73,7 +73,7 @@ Cypress.Commands.add("initTestUser", (synapse: SynapseInstance, displayName: str }, }); }).then(response => { - cy.window().then(win => { + cy.window({ log: false }).then(win => { // Seed the localStorage with the required credentials win.localStorage.setItem("mx_hs_url", synapse.baseUrl); win.localStorage.setItem("mx_user_id", response.body.user_id); diff --git a/cypress/support/synapse.ts b/cypress/support/synapse.ts index aa1ba085f5d..5696e8c015f 100644 --- a/cypress/support/synapse.ts +++ b/cypress/support/synapse.ts @@ -63,7 +63,7 @@ function startSynapse(template: string): Chainable { function stopSynapse(synapse?: SynapseInstance): Chainable { if (!synapse) return; // Navigate away from app to stop the background network requests which will race with Synapse shutting down - return cy.window().then((win) => { + return cy.window({ log: false }).then((win) => { win.location.href = 'about:blank'; cy.task("synapseStop", synapse.synapseId); }); From e75f4b3010ac262b7d3c991bc060b8e9722abcf8 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Fri, 13 May 2022 18:04:27 +0100 Subject: [PATCH 2/9] Add basic performance testing via Cypress This adds a basic approach to performance testing within Cypress tests. You sprinkle `cy.startMeasuring` / `cy.stopMeasuring` pairs in the areas of interest. The measurements are added to the Cypress log shown in interactive runs and they are also assembled into a dashboard (https://matrix-org.github.io/matrix-react-sdk/cypress/bench/) for tracking changes across time. Fixes https://github.com/vector-im/element-web/issues/21738 --- .github/workflows/element-build-and-test.yaml | 13 ++++ .github/workflows/end-to-end-tests.yaml | 11 ++- .gitignore | 1 + cypress/global.d.ts | 3 + .../integration/1-register/register.spec.ts | 4 ++ cypress/integration/2-login/login.spec.ts | 2 + .../4-create-room/create-room.spec.ts | 2 + cypress/plugins/index.ts | 4 +- cypress/plugins/performance.ts | 48 +++++++++++++ cypress/plugins/synapsedocker/index.ts | 2 +- cypress/support/index.ts | 1 + cypress/support/performance.ts | 71 +++++++++++++++++++ src/performance/index.ts | 2 +- 13 files changed, 155 insertions(+), 9 deletions(-) create mode 100644 cypress/plugins/performance.ts create mode 100644 cypress/support/performance.ts diff --git a/.github/workflows/element-build-and-test.yaml b/.github/workflows/element-build-and-test.yaml index 9b3d0f373a0..59ac1c43fb7 100644 --- a/.github/workflows/element-build-and-test.yaml +++ b/.github/workflows/element-build-and-test.yaml @@ -88,6 +88,19 @@ jobs: cypress/videos cypress/synapselogs + - name: Store benchmark result + uses: matrix-org/github-action-benchmark@jsperfentry-1 + with: + name: Cypress measurements + tool: 'jsperformanceentry' + output-file-path: cypress/performance/measurements.json + # The dashboard is available at https://matrix-org.github.io/matrix-react-sdk/cypress/bench/ + benchmark-data-dir-path: cypress/bench + fail-on-alert: false + comment-on-alert: false + github-token: ${{ secrets.DEPLOY_GH_PAGES }} + auto-push: ${{ github.ref == 'refs/heads/develop' }} + app-tests: name: Element Web Integration Tests runs-on: ubuntu-latest diff --git a/.github/workflows/end-to-end-tests.yaml b/.github/workflows/end-to-end-tests.yaml index 6c663a0e018..11fddfe3ee6 100644 --- a/.github/workflows/end-to-end-tests.yaml +++ b/.github/workflows/end-to-end-tests.yaml @@ -40,17 +40,16 @@ jobs: test/end-to-end-tests/synapse/installations/consent/homeserver.log retention-days: 14 - - name: Download previous benchmark data - uses: actions/cache@v1 - with: - path: ./cache - key: ${{ runner.os }}-benchmark - - name: Store benchmark result uses: matrix-org/github-action-benchmark@jsperfentry-1 with: tool: 'jsperformanceentry' output-file-path: test/end-to-end-tests/performance-entries.json + # This is the default dashboard path. It's included here anyway to + # make the difference from the Cypress variant in + # `element-build-and-test.yaml` more obvious. + # The dashboard is available at https://matrix-org.github.io/matrix-react-sdk/dev/bench/ + benchmark-data-dir-path: dev/bench fail-on-alert: false comment-on-alert: false # Only temporary to monitor where failures occur diff --git a/.gitignore b/.gitignore index 8e14ba9057b..e360df7767f 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ package-lock.json # These could have files in them but don't currently # Cypress will still auto-create them though... /cypress/fixtures +/cypress/performance diff --git a/cypress/global.d.ts b/cypress/global.d.ts index d0fb7327780..2e291ee43e6 100644 --- a/cypress/global.d.ts +++ b/cypress/global.d.ts @@ -18,6 +18,7 @@ import "matrix-js-sdk/src/@types/global"; import type { MatrixClient, ClientEvent } from "matrix-js-sdk/src/client"; import type { RoomMemberEvent } from "matrix-js-sdk/src/models/room-member"; import type { MatrixDispatcher } from "../src/dispatcher/dispatcher"; +import type PerformanceMonitor from "../src/performance"; declare global { // eslint-disable-next-line @typescript-eslint/no-namespace @@ -27,6 +28,8 @@ declare global { matrixClient?: MatrixClient; }; mxDispatcher: MatrixDispatcher; + mxPerformanceMonitor: PerformanceMonitor; + cyPerformanceCallback?: boolean; // tracks callback installation beforeReload?: boolean; // for detecting reloads // Partial type for the matrix-js-sdk module, exported by browser-matrix matrixcs: { diff --git a/cypress/integration/1-register/register.spec.ts b/cypress/integration/1-register/register.spec.ts index f61a10e3046..2e8c65425ab 100644 --- a/cypress/integration/1-register/register.spec.ts +++ b/cypress/integration/1-register/register.spec.ts @@ -42,11 +42,15 @@ describe("Registration", () => { cy.get("#mx_RegistrationForm_username").type("alice"); cy.get("#mx_RegistrationForm_password").type("totally a great password"); cy.get("#mx_RegistrationForm_passwordConfirm").type("totally a great password"); + cy.startMeasuring("registration:create-acccount"); cy.get(".mx_Login_submit").click(); cy.get(".mx_RegistrationEmailPromptDialog button.mx_Dialog_primary").click(); + cy.stopMeasuring("registration:create-account"); cy.get(".mx_InteractiveAuthEntryComponents_termsPolicy input").click(); + cy.startMeasuring("registration:from-submit-to-home"); cy.get(".mx_InteractiveAuthEntryComponents_termsSubmit").click(); cy.url().should('contain', '/#/home'); + cy.stopMeasuring("registration:from-submit-to-home"); }); }); diff --git a/cypress/integration/2-login/login.spec.ts b/cypress/integration/2-login/login.spec.ts index 9fb7ba4792b..ec7886266f1 100644 --- a/cypress/integration/2-login/login.spec.ts +++ b/cypress/integration/2-login/login.spec.ts @@ -49,9 +49,11 @@ describe("Login", () => { cy.get("#mx_LoginForm_username").type(username); cy.get("#mx_LoginForm_password").type(password); + cy.startMeasuring("login:from-submit-to-home"); cy.get(".mx_Login_submit").click(); cy.url().should('contain', '/#/home'); + cy.stopMeasuring("login:from-submit-to-home"); }); }); }); diff --git a/cypress/integration/4-create-room/create-room.spec.ts b/cypress/integration/4-create-room/create-room.spec.ts index d6abab814d8..86058a04ac3 100644 --- a/cypress/integration/4-create-room/create-room.spec.ts +++ b/cypress/integration/4-create-room/create-room.spec.ts @@ -54,10 +54,12 @@ describe("Create Room", () => { // Fill room address cy.get('[label="Room address"]').type("test-room-1"); // Submit + cy.startMeasuring("create-room:from-submit-to-room"); cy.get(".mx_Dialog_primary").click(); }); cy.url().should("contain", "/#/room/#test-room-1:localhost"); + cy.stopMeasuring("create-room:from-submit-to-room"); cy.get(".mx_RoomHeader_nametext").contains(name); cy.get(".mx_RoomHeader_topic").contains(topic); }); diff --git a/cypress/plugins/index.ts b/cypress/plugins/index.ts index 9438d136064..eab5441c203 100644 --- a/cypress/plugins/index.ts +++ b/cypress/plugins/index.ts @@ -16,13 +16,15 @@ limitations under the License. /// -import { synapseDocker } from "./synapsedocker"; import PluginEvents = Cypress.PluginEvents; import PluginConfigOptions = Cypress.PluginConfigOptions; +import { performance } from "./performance"; +import { synapseDocker } from "./synapsedocker"; /** * @type {Cypress.PluginConfig} */ export default function(on: PluginEvents, config: PluginConfigOptions) { + performance(on, config); synapseDocker(on, config); } diff --git a/cypress/plugins/performance.ts b/cypress/plugins/performance.ts new file mode 100644 index 00000000000..5c4d3bf7214 --- /dev/null +++ b/cypress/plugins/performance.ts @@ -0,0 +1,48 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/// + +import * as path from "path"; +import * as fse from "fs-extra"; + +import PluginEvents = Cypress.PluginEvents; +import PluginConfigOptions = Cypress.PluginConfigOptions; + +// This holds all the performance measurements throughout the run +let bufferedMeasurements: PerformanceEntry[] = []; + +function addMeasurements(measurements: PerformanceEntry[]): void { + bufferedMeasurements = bufferedMeasurements.concat(measurements); + return null; +} + +async function writeMeasurementsFile() { + console.log("After run!") + try { + const measurementsPath = path.join("cypress", "performance", "measurements.json"); + await fse.outputJSON(measurementsPath, bufferedMeasurements, { + spaces: 4, + }); + } finally { + bufferedMeasurements = []; + } +} + +export function performance(on: PluginEvents, config: PluginConfigOptions) { + on("task", { addMeasurements }); + on("after:run", writeMeasurementsFile); +} diff --git a/cypress/plugins/synapsedocker/index.ts b/cypress/plugins/synapsedocker/index.ts index af8ddac73c6..292c74ee670 100644 --- a/cypress/plugins/synapsedocker/index.ts +++ b/cypress/plugins/synapsedocker/index.ts @@ -201,7 +201,7 @@ async function synapseStop(id: string): Promise { synapses.delete(id); console.log(`Stopped synapse id ${id}.`); - // cypres deliberately fails if you return 'undefined', so + // cypress deliberately fails if you return 'undefined', so // return null to signal all is well and we've handled the task. return null; } diff --git a/cypress/support/index.ts b/cypress/support/index.ts index 6535d3a0b1f..197b2ddc0cc 100644 --- a/cypress/support/index.ts +++ b/cypress/support/index.ts @@ -16,6 +16,7 @@ limitations under the License. /// +import "./performance"; import "./synapse"; import "./login"; import "./client"; diff --git a/cypress/support/performance.ts b/cypress/support/performance.ts new file mode 100644 index 00000000000..7b8af620083 --- /dev/null +++ b/cypress/support/performance.ts @@ -0,0 +1,71 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/// + +import Chainable = Cypress.Chainable; +import AUTWindow = Cypress.AUTWindow; + +declare global { + // eslint-disable-next-line @typescript-eslint/no-namespace + namespace Cypress { + interface Chainable { + /** + * Start measuring the duration of some task. + * @param task The task name. + */ + startMeasuring(task: string): Chainable; + /** + * Stop measuring the duration of some task. + * The duration is reported in the Cypress log. + * @param task The task name. + */ + stopMeasuring(task: string): Chainable; + } + } +} + +const PREFIX = "cy:"; + +function startMeasuring(task: string): Chainable { + return cy.window({ log: false }).then((win) => { + win.mxPerformanceMonitor.start(PREFIX + task); + }); +} + +function stopMeasuring(task: string): Chainable { + return cy.window({ log: false }).then((win) => { + const measure = win.mxPerformanceMonitor.stop(PREFIX + task); + cy.log(`**${task}** ${measure.duration} ms`); + }); +} + +Cypress.Commands.add("startMeasuring", startMeasuring); +Cypress.Commands.add("stopMeasuring", stopMeasuring); + +Cypress.on("window:before:unload", (event: BeforeUnloadEvent) => { + const doc = event.target as Document; + if (doc.location.href === "about:blank") return; + const win = doc.defaultView as AUTWindow; + if (!win.mxPerformanceMonitor) return; + const entries = win.mxPerformanceMonitor.getEntries().filter(entry => { + return entry.name.startsWith(PREFIX); + }); + cy.task("addMeasurements", entries); +}); + +// Needed to make this file a module +export { }; diff --git a/src/performance/index.ts b/src/performance/index.ts index 35319c23f05..9ea8dbd2151 100644 --- a/src/performance/index.ts +++ b/src/performance/index.ts @@ -71,7 +71,7 @@ export default class PerformanceMonitor { * with the start marker * @param name Name of the recording * @param id Specify an identifier appended to the measurement name - * @returns {void} + * @returns The measurement */ stop(name: string, id?: string): PerformanceEntry { if (!this.supportsPerformanceApi()) { From 9438a4d8ec73a396c78e1dd2aa1655e6911dda9d Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Fri, 13 May 2022 18:15:38 +0100 Subject: [PATCH 3/9] Remove leftovers --- cypress/global.d.ts | 1 - cypress/plugins/performance.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/cypress/global.d.ts b/cypress/global.d.ts index 2e291ee43e6..07e9b3508aa 100644 --- a/cypress/global.d.ts +++ b/cypress/global.d.ts @@ -29,7 +29,6 @@ declare global { }; mxDispatcher: MatrixDispatcher; mxPerformanceMonitor: PerformanceMonitor; - cyPerformanceCallback?: boolean; // tracks callback installation beforeReload?: boolean; // for detecting reloads // Partial type for the matrix-js-sdk module, exported by browser-matrix matrixcs: { diff --git a/cypress/plugins/performance.ts b/cypress/plugins/performance.ts index 5c4d3bf7214..c6bd3e4ce9f 100644 --- a/cypress/plugins/performance.ts +++ b/cypress/plugins/performance.ts @@ -31,7 +31,6 @@ function addMeasurements(measurements: PerformanceEntry[]): void { } async function writeMeasurementsFile() { - console.log("After run!") try { const measurementsPath = path.join("cypress", "performance", "measurements.json"); await fse.outputJSON(measurementsPath, bufferedMeasurements, { From 8be46ba4017f56523ecad52badd6ab90ea5c9de4 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Sun, 15 May 2022 21:30:30 +0100 Subject: [PATCH 4/9] Fix types --- cypress/global.d.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cypress/global.d.ts b/cypress/global.d.ts index 07e9b3508aa..efbb255b081 100644 --- a/cypress/global.d.ts +++ b/cypress/global.d.ts @@ -40,7 +40,11 @@ declare global { } interface Window { - mxDispatcher: MatrixDispatcher; // to appease the MatrixDispatcher import + // to appease the MatrixDispatcher import + mxDispatcher: MatrixDispatcher; + // to appease the PerformanceMonitor import + mxPerformanceMonitor: PerformanceMonitor; + mxPerformanceEntryNames: any; } } From 6081ba998c0fa89b9c181b07aa6a2f614fbe91c7 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Sun, 15 May 2022 22:01:38 +0100 Subject: [PATCH 5/9] Fix register measurement --- cypress/integration/1-register/register.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/integration/1-register/register.spec.ts b/cypress/integration/1-register/register.spec.ts index 2e8c65425ab..946366ae42d 100644 --- a/cypress/integration/1-register/register.spec.ts +++ b/cypress/integration/1-register/register.spec.ts @@ -42,7 +42,7 @@ describe("Registration", () => { cy.get("#mx_RegistrationForm_username").type("alice"); cy.get("#mx_RegistrationForm_password").type("totally a great password"); cy.get("#mx_RegistrationForm_passwordConfirm").type("totally a great password"); - cy.startMeasuring("registration:create-acccount"); + cy.startMeasuring("registration:create-account"); cy.get(".mx_Login_submit").click(); cy.get(".mx_RegistrationEmailPromptDialog button.mx_Dialog_primary").click(); From 60b4d2006c397de019d35c3be9d64b6b10e94624 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Sun, 15 May 2022 22:17:41 +0100 Subject: [PATCH 6/9] Only add measurements when we have some --- cypress/support/performance.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/cypress/support/performance.ts b/cypress/support/performance.ts index 7b8af620083..0caf222cfbf 100644 --- a/cypress/support/performance.ts +++ b/cypress/support/performance.ts @@ -64,6 +64,7 @@ Cypress.on("window:before:unload", (event: BeforeUnloadEvent) => { const entries = win.mxPerformanceMonitor.getEntries().filter(entry => { return entry.name.startsWith(PREFIX); }); + if (!entries || entries.length === 0) return; cy.task("addMeasurements", entries); }); From 30dc7a1d7882d87290e00dd9927836ea869b2ca1 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Tue, 17 May 2022 11:53:05 +0100 Subject: [PATCH 7/9] Use the spec name as the measurement category --- cypress/integration/1-register/register.spec.ts | 8 ++++---- cypress/integration/2-login/login.spec.ts | 4 ++-- cypress/integration/4-create-room/create-room.spec.ts | 4 ++-- cypress/support/performance.ts | 10 ++++++---- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/cypress/integration/1-register/register.spec.ts b/cypress/integration/1-register/register.spec.ts index 946366ae42d..b470932c613 100644 --- a/cypress/integration/1-register/register.spec.ts +++ b/cypress/integration/1-register/register.spec.ts @@ -42,15 +42,15 @@ describe("Registration", () => { cy.get("#mx_RegistrationForm_username").type("alice"); cy.get("#mx_RegistrationForm_password").type("totally a great password"); cy.get("#mx_RegistrationForm_passwordConfirm").type("totally a great password"); - cy.startMeasuring("registration:create-account"); + cy.startMeasuring("create-account"); cy.get(".mx_Login_submit").click(); cy.get(".mx_RegistrationEmailPromptDialog button.mx_Dialog_primary").click(); - cy.stopMeasuring("registration:create-account"); + cy.stopMeasuring("create-account"); cy.get(".mx_InteractiveAuthEntryComponents_termsPolicy input").click(); - cy.startMeasuring("registration:from-submit-to-home"); + cy.startMeasuring("from-submit-to-home"); cy.get(".mx_InteractiveAuthEntryComponents_termsSubmit").click(); cy.url().should('contain', '/#/home'); - cy.stopMeasuring("registration:from-submit-to-home"); + cy.stopMeasuring("from-submit-to-home"); }); }); diff --git a/cypress/integration/2-login/login.spec.ts b/cypress/integration/2-login/login.spec.ts index ec7886266f1..ea8eefa5738 100644 --- a/cypress/integration/2-login/login.spec.ts +++ b/cypress/integration/2-login/login.spec.ts @@ -49,11 +49,11 @@ describe("Login", () => { cy.get("#mx_LoginForm_username").type(username); cy.get("#mx_LoginForm_password").type(password); - cy.startMeasuring("login:from-submit-to-home"); + cy.startMeasuring("from-submit-to-home"); cy.get(".mx_Login_submit").click(); cy.url().should('contain', '/#/home'); - cy.stopMeasuring("login:from-submit-to-home"); + cy.stopMeasuring("from-submit-to-home"); }); }); }); diff --git a/cypress/integration/4-create-room/create-room.spec.ts b/cypress/integration/4-create-room/create-room.spec.ts index 86058a04ac3..9bf38194d92 100644 --- a/cypress/integration/4-create-room/create-room.spec.ts +++ b/cypress/integration/4-create-room/create-room.spec.ts @@ -54,12 +54,12 @@ describe("Create Room", () => { // Fill room address cy.get('[label="Room address"]').type("test-room-1"); // Submit - cy.startMeasuring("create-room:from-submit-to-room"); + cy.startMeasuring("from-submit-to-room"); cy.get(".mx_Dialog_primary").click(); }); cy.url().should("contain", "/#/room/#test-room-1:localhost"); - cy.stopMeasuring("create-room:from-submit-to-room"); + cy.stopMeasuring("from-submit-to-room"); cy.get(".mx_RoomHeader_nametext").contains(name); cy.get(".mx_RoomHeader_topic").contains(topic); }); diff --git a/cypress/support/performance.ts b/cypress/support/performance.ts index 0caf222cfbf..bbd1fe217d4 100644 --- a/cypress/support/performance.ts +++ b/cypress/support/performance.ts @@ -38,17 +38,19 @@ declare global { } } -const PREFIX = "cy:"; +function getPrefix(task: string): string { + return `cy:${Cypress.spec.name.split(".")[0]}:${task}`; +} function startMeasuring(task: string): Chainable { return cy.window({ log: false }).then((win) => { - win.mxPerformanceMonitor.start(PREFIX + task); + win.mxPerformanceMonitor.start(getPrefix(task)); }); } function stopMeasuring(task: string): Chainable { return cy.window({ log: false }).then((win) => { - const measure = win.mxPerformanceMonitor.stop(PREFIX + task); + const measure = win.mxPerformanceMonitor.stop(getPrefix(task)); cy.log(`**${task}** ${measure.duration} ms`); }); } @@ -62,7 +64,7 @@ Cypress.on("window:before:unload", (event: BeforeUnloadEvent) => { const win = doc.defaultView as AUTWindow; if (!win.mxPerformanceMonitor) return; const entries = win.mxPerformanceMonitor.getEntries().filter(entry => { - return entry.name.startsWith(PREFIX); + return entry.name.startsWith("cy:"); }); if (!entries || entries.length === 0) return; cy.task("addMeasurements", entries); From 61b28ac4383338a6743d9f9d596f3653c9aa0886 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Tue, 17 May 2022 11:57:45 +0100 Subject: [PATCH 8/9] Only run benchmarking on develop --- .github/workflows/element-build-and-test.yaml | 1 + .github/workflows/end-to-end-tests.yaml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/element-build-and-test.yaml b/.github/workflows/element-build-and-test.yaml index 59ac1c43fb7..07a7ed0f5df 100644 --- a/.github/workflows/element-build-and-test.yaml +++ b/.github/workflows/element-build-and-test.yaml @@ -89,6 +89,7 @@ jobs: cypress/synapselogs - name: Store benchmark result + if: github.ref == 'refs/heads/develop' uses: matrix-org/github-action-benchmark@jsperfentry-1 with: name: Cypress measurements diff --git a/.github/workflows/end-to-end-tests.yaml b/.github/workflows/end-to-end-tests.yaml index 11fddfe3ee6..9bc07aeb051 100644 --- a/.github/workflows/end-to-end-tests.yaml +++ b/.github/workflows/end-to-end-tests.yaml @@ -41,6 +41,7 @@ jobs: retention-days: 14 - name: Store benchmark result + if: github.ref == 'refs/heads/develop' uses: matrix-org/github-action-benchmark@jsperfentry-1 with: tool: 'jsperformanceentry' From cfc88e703a3dbb6c7e9095c3c4447248f8efea92 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Tue, 17 May 2022 11:58:14 +0100 Subject: [PATCH 9/9] Remove unused alert configuration --- .github/workflows/end-to-end-tests.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/end-to-end-tests.yaml b/.github/workflows/end-to-end-tests.yaml index 9bc07aeb051..7008791607c 100644 --- a/.github/workflows/end-to-end-tests.yaml +++ b/.github/workflows/end-to-end-tests.yaml @@ -53,7 +53,5 @@ jobs: benchmark-data-dir-path: dev/bench fail-on-alert: false comment-on-alert: false - # Only temporary to monitor where failures occur - alert-comment-cc-users: '@gsouquet' github-token: ${{ secrets.DEPLOY_GH_PAGES }} auto-push: ${{ github.ref == 'refs/heads/develop' }}