



























11import { spawn, spawnSync } from "node:child_process";
2-import { chmodSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
2+import {
3+chmodSync,
4+existsSync,
5+mkdirSync,
6+mkdtempSync,
7+readFileSync,
8+rmSync,
9+writeFileSync,
10+} from "node:fs";
311import { createServer } from "node:http";
412import { tmpdir } from "node:os";
513import path from "node:path";
@@ -88,6 +96,14 @@ function waitForDead(pid: number, timeoutMs = 2_000): void {
8896}
8997}
909899+function runPluginsSweepShell(script: string, env: NodeJS.ProcessEnv = {}) {
100+return spawnSync("/bin/bash", ["-c", script], {
101+cwd: process.cwd(),
102+encoding: "utf8",
103+env: { ...process.env, ...env },
104+});
105+}
106+91107describe("plugins Docker assertions", () => {
92108it("rejects loose ClawHub preflight limits instead of parsing prefixes", () => {
93109const timeoutResult = spawnSync(process.execPath, [ASSERTIONS_SCRIPT, "clawhub-preflight"], {
@@ -126,13 +142,68 @@ describe("plugins Docker assertions", () => {
126142127143for (const scriptPath of scripts) {
128144const script = readFileSync(scriptPath, "utf8");
145+const scriptWithoutDefaultScratch = script.replace('mktemp -d "/tmp/openclaw-plugins.XXXXXX"', "");
129146expect(script).toContain("OPENCLAW_PLUGINS_TMP_DIR");
130-expect(script).not.toMatch(
147+expect(scriptWithoutDefaultScratch).not.toMatch(
131148/\/tmp\/(?:plugins|marketplace|demo-plugin|is-number|openclaw-plugin|openclaw-clawhub)/,
132149);
133150}
134151});
135152153+it("cleans the default plugin sweep scratch root", () => {
154+const root = mkdtempSync(path.join(tmpdir(), "openclaw-plugin-sweep-cleanup-"));
155+const marker = path.join(root, "scratch-path.txt");
156+try {
157+const result = runPluginsSweepShell(
158+`
159+set -euo pipefail
160+export OPENCLAW_PLUGINS_SWEEP_SOURCE_ONLY=1
161+source scripts/e2e/lib/plugins/sweep.sh
162+printf '%s\\n' "$OPENCLAW_PLUGINS_TMP_DIR" > "$MARKER"
163+test -d "$OPENCLAW_PLUGINS_TMP_DIR"
164+cleanup_openclaw_plugins_sweep
165+test ! -e "$OPENCLAW_PLUGINS_TMP_DIR"
166+`,
167+{ MARKER: marker },
168+);
169+170+expect(result.stdout).toBe("");
171+expect(result.stderr).toBe("");
172+expect(result.status).toBe(0);
173+const scratchRoot = readFileSync(marker, "utf8").trim();
174+expect(scratchRoot).toContain("/tmp/openclaw-plugins.");
175+expect(existsSync(scratchRoot)).toBe(false);
176+} finally {
177+rmSync(root, { force: true, recursive: true });
178+}
179+});
180+181+it("preserves caller-provided plugin sweep scratch roots", () => {
182+const root = mkdtempSync(path.join(tmpdir(), "openclaw-plugin-sweep-caller-"));
183+const scratchRoot = path.join(root, "scratch");
184+try {
185+const result = runPluginsSweepShell(
186+`
187+set -euo pipefail
188+export OPENCLAW_PLUGINS_SWEEP_SOURCE_ONLY=1
189+export OPENCLAW_PLUGINS_TMP_DIR="$SCRATCH_ROOT"
190+source scripts/e2e/lib/plugins/sweep.sh
191+test -d "$OPENCLAW_PLUGINS_TMP_DIR"
192+cleanup_openclaw_plugins_sweep
193+test -d "$OPENCLAW_PLUGINS_TMP_DIR"
194+`,
195+{ SCRATCH_ROOT: scratchRoot },
196+);
197+198+expect(result.stdout).toBe("");
199+expect(result.stderr).toBe("");
200+expect(result.status).toBe(0);
201+expect(existsSync(scratchRoot)).toBe(true);
202+} finally {
203+rmSync(root, { force: true, recursive: true });
204+}
205+});
206+136207it("cleans npm fixture registry children when readiness times out", () => {
137208const root = mkdtempSync(path.join(tmpdir(), "openclaw-plugin-npm-fixture-cleanup-"));
138209try {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。