




























@@ -846,6 +846,36 @@ setInterval(() => {}, 1000);
846846await expect(fs.stat(summary.isolatedRunRoot)).rejects.toHaveProperty("code", "ENOENT");
847847});
848848849+it("does not parse QA summary limit env when QA is skipped", () => {
850+const outputDir = path.join(repoRoot, "artifacts");
851+const result = spawnSync(
852+process.execPath,
853+[
854+path.resolve("scripts/check-plugin-gateway-gauntlet.mjs"),
855+"--repo-root",
856+repoRoot,
857+"--output-dir",
858+outputDir,
859+"--skip-prebuild",
860+"--skip-lifecycle",
861+"--skip-slash-help",
862+"--skip-qa",
863+"--allow-empty",
864+],
865+{
866+cwd: path.resolve("."),
867+encoding: "utf8",
868+env: {
869+ ...process.env,
870+OPENCLAW_PLUGIN_GATEWAY_GAUNTLET_QA_SUMMARY_MAX_BYTES: "not-a-number",
871+},
872+},
873+);
874+875+expect(result.status, result.stderr).toBe(0);
876+expect(result.stdout).toContain("failures=0");
877+});
878+849879it("probes plugin-owned slash help while the plugin is installed", async () => {
850880const outputDir = path.join(repoRoot, "artifacts");
851881await writeManifest(
@@ -1418,4 +1448,66 @@ setInterval(() => {}, 1000);
14181448expect(summary.isolatedRunRootPreserved).toBe(true);
14191449await fs.rm(summary.isolatedRunRoot, { recursive: true, force: true });
14201450});
1451+1452+it("fails successful QA chunks that write oversized summary JSON", async () => {
1453+const outputDir = path.join(repoRoot, "artifacts");
1454+await writeManifest("alpha", "openclaw.plugin.json", JSON.stringify({ id: "alpha" }));
1455+await fs.writeFile(path.join(repoRoot, "extensions", "alpha", "index.ts"), "export {};\n");
1456+await fs.mkdir(path.join(repoRoot, "scripts"), { recursive: true });
1457+await fs.writeFile(
1458+path.join(repoRoot, "scripts", "run-node.mjs"),
1459+[
1460+'import fs from "node:fs";',
1461+'import path from "node:path";',
1462+'const outputArgIndex = process.argv.indexOf("--output-dir");',
1463+"const outputDir = path.resolve(process.cwd(), process.argv[outputArgIndex + 1]);",
1464+"fs.mkdirSync(outputDir, { recursive: true });",
1465+'fs.writeFileSync(path.join(outputDir, "qa-suite-summary.json"), JSON.stringify({ filler: "x".repeat(128) }), "utf8");',
1466+].join("\n"),
1467+"utf8",
1468+);
1469+1470+const result = spawnSync(
1471+process.execPath,
1472+[
1473+path.resolve("scripts/check-plugin-gateway-gauntlet.mjs"),
1474+"--repo-root",
1475+repoRoot,
1476+"--output-dir",
1477+outputDir,
1478+"--skip-prebuild",
1479+"--skip-lifecycle",
1480+"--skip-slash-help",
1481+"--plugin",
1482+"alpha",
1483+"--qa-scenario",
1484+"channel-chat-baseline",
1485+],
1486+{
1487+cwd: path.resolve("."),
1488+encoding: "utf8",
1489+env: {
1490+ ...process.env,
1491+OPENCLAW_PLUGIN_GATEWAY_GAUNTLET_QA_SUMMARY_MAX_BYTES: "64",
1492+},
1493+},
1494+);
1495+1496+expect(result.status, result.stdout).toBe(1);
1497+expect(result.stdout).toContain("diagnostic=qa-summary-invalid");
1498+const summary = JSON.parse(
1499+await fs.readFile(path.join(outputDir, "plugin-gateway-gauntlet-summary.json"), "utf8"),
1500+);
1501+expect(summary.failures).toEqual([
1502+expect.objectContaining({
1503+diagnosticDetail: expect.stringContaining("QA suite summary exceeded 64 bytes"),
1504+diagnosticFailure: "qa-summary-invalid",
1505+phase: "qa:rpc",
1506+pluginId: "alpha",
1507+status: 0,
1508+}),
1509+]);
1510+expect(summary.isolatedRunRootPreserved).toBe(true);
1511+await fs.rm(summary.isolatedRunRoot, { recursive: true, force: true });
1512+});
14211513});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。