From 5707a084414bf68a2e3a97fc9e772545af73f3f8 Mon Sep 17 00:00:00 2001 From: Abdurrahman SASTIM Date: Fri, 27 Sep 2024 10:59:18 +0200 Subject: [PATCH] test: get logs for failed tests --- apps/ledger-live-desktop/index-types.d.ts | 1 + .../renderer/components/debug/DebugMock.tsx | 21 +++++++++++++++++++ .../tests/utils/allureUtils.ts | 11 ++++++++++ 3 files changed, 33 insertions(+) diff --git a/apps/ledger-live-desktop/index-types.d.ts b/apps/ledger-live-desktop/index-types.d.ts index 64587364fbb3..d1e41cc52d9f 100644 --- a/apps/ledger-live-desktop/index-types.d.ts +++ b/apps/ledger-live-desktop/index-types.d.ts @@ -63,6 +63,7 @@ interface Window { getAllFeatureFlags: (appLanguage: string) => Partial<{ [key in FeatureId]: Feature }>; getAllEnvs: () => { [key in EnvName]: unknown }; + saveLogs: (path: string) => void; // for mocking purposes apparently? // eslint-disable-next-line diff --git a/apps/ledger-live-desktop/src/renderer/components/debug/DebugMock.tsx b/apps/ledger-live-desktop/src/renderer/components/debug/DebugMock.tsx index 2a67cc95d45a..d969436677e4 100644 --- a/apps/ledger-live-desktop/src/renderer/components/debug/DebugMock.tsx +++ b/apps/ledger-live-desktop/src/renderer/components/debug/DebugMock.tsx @@ -26,6 +26,8 @@ import { ListAppsResult } from "@ledgerhq/live-common/apps/types"; import { AnnouncementDeviceModelId } from "@ledgerhq/live-common/notifications/AnnouncementProvider/types"; import { getAllFeatureFlags } from "@ledgerhq/live-common/e2e/index"; import { getAllEnvs } from "@ledgerhq/live-env"; +import { ipcRenderer } from "electron"; +import { memoryLogger } from "~/renderer/logger"; const mockListAppsResult = ( appDesc: string, @@ -281,6 +283,25 @@ interface RawEvents { } window.getAllFeatureFlags = getAllFeatureFlags; window.getAllEnvs = getAllEnvs; +window.saveLogs = async (path: string): Promise => { + const memoryLogs = memoryLogger.getMemoryLogs(); + + try { + // Serializes ourself with `stringify` to avoid "object could not be cloned" errors from the electron IPC serializer. + const memoryLogsStr = JSON.stringify(memoryLogs, null, 2); + // Requests the main process to save logs in a file + await ipcRenderer.invoke( + "save-logs", + { + canceled: false, + filePath: path, + }, + memoryLogsStr, + ); + } catch (error) { + console.error("Error while requesting to save logs from the renderer process", error); + } +}; if (getEnv("MOCK")) { window.mock = { diff --git a/apps/ledger-live-desktop/tests/utils/allureUtils.ts b/apps/ledger-live-desktop/tests/utils/allureUtils.ts index 49a90707c53f..291f1b754388 100644 --- a/apps/ledger-live-desktop/tests/utils/allureUtils.ts +++ b/apps/ledger-live-desktop/tests/utils/allureUtils.ts @@ -30,4 +30,15 @@ export async function captureArtifacts(page: Page, testInfo: TestInfo) { await testInfo.attach("Test Video", { body: videoData, contentType: "video/webm" }); } } + + const filePath = `tests/artifacts/${testInfo.title.replace(/[^a-zA-Z0-9]/g, " ")}.json`; + + await page.evaluate(filePath => { + window.saveLogs(filePath); + }, filePath); + + await testInfo.attach("Test logs", { + path: filePath, + contentType: "application/json", + }); }