Z ZPI 文档 v0.3.8
介绍页

源码

tests/desktop/performance-diagnostics.spec.ts

typescript74 行查看原文
import { mkdtemp, readFile, rm } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
import type { ElectronApplication } from "@playwright/test";
import { runCleanup } from "../helpers/cleanup.ts";
import { launchDesktop } from "../helpers/desktop.ts";
import { expect, test } from "../helpers/test.ts";

test("records a renderer long task and responsiveness events in the isolated local log", async () => {
  const dir = await mkdtemp(join(tmpdir(), "zpi-performance-"));
  let app: ElectronApplication | undefined;
  try {
    app = await launchDesktop({ dir, url: "" });
    const page = await app.firstWindow();
    const editor = page.getByLabel("消息", { exact: true });
    await expect(editor).toBeVisible();
    expect(await page.evaluate(() => PerformanceObserver.supportedEntryTypes)).toContain("longtask");
    await editor.fill("PRIVATE_DIAGNOSTIC_CONTENT");
    await app.evaluate(({ BrowserWindow }) => {
      const contents = BrowserWindow.getAllWindows()[0].webContents;
      contents.emit("unresponsive");
      contents.emit("responsive");
    });
    // Exercise Chromium's real observer; this short stall affects only the hidden test renderer.
    await page.evaluate(
      () =>
        new Promise<void>((resolve) => {
          setTimeout(() => {
            const end = performance.now() + 300;
            while (performance.now() < end) {}
            resolve();
          }, 0);
        }),
    );
    const logPath = join(dir, "agent", "logs", "error.log");
    await expect
      .poll(
        async () =>
          (await readFile(logPath, "utf8"))
            .trim()
            .split("\n")
            .some((line) => {
              const record = JSON.parse(line);
              return (
                record.source === "renderer.performance" &&
                JSON.parse(record.message).operation === "long-task"
              );
            }),
        { timeout: 15_000 },
      )
      .toBe(true);
    const contents = await readFile(logPath, "utf8");
    const records = contents
      .trim()
      .split("\n")
      .map((line) => JSON.parse(line));
    const summary = records.find(
      (record) =>
        record.source === "renderer.performance" && JSON.parse(record.message).operation === "long-task",
    );
    expect(JSON.parse(summary.message)).toMatchObject({ operation: "long-task", count: expect.any(Number) });
    expect(JSON.parse(summary.message).maxMs).toBeGreaterThanOrEqual(200);
    expect(records).toContainEqual(expect.objectContaining({ source: "renderer.unresponsive" }));
    expect(records).toContainEqual(
      expect.objectContaining({ source: "renderer.responsive", durationMs: expect.any(Number) }),
    );
    expect(contents).not.toContain("PRIVATE_DIAGNOSTIC_CONTENT");
    await editor.fill("仍可输入");
    await expect(editor).toHaveText("仍可输入");
  } finally {
    await runCleanup([() => rm(dir, { recursive: true, force: true }), () => app?.close()]);
  }
});