Skip to content

Commit 459abfc

Browse files
committed
fix(e2e): isolate plugin sweep scratch files
1 parent 340cc2c commit 459abfc

2 files changed

Lines changed: 103 additions & 10 deletions

File tree

scripts/e2e/lib/plugins/sweep.sh

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,19 @@ set -euo pipefail
33

44
source scripts/lib/openclaw-e2e-instance.sh
55
source scripts/lib/docker-e2e-logs.sh
6-
OPENCLAW_ENTRY="$(openclaw_e2e_resolve_entrypoint)"
6+
OPENCLAW_PLUGINS_SWEEP_SOURCE_ONLY="${OPENCLAW_PLUGINS_SWEEP_SOURCE_ONLY:-0}"
7+
if [[ -z "${OPENCLAW_ENTRY:-}" && "$OPENCLAW_PLUGINS_SWEEP_SOURCE_ONLY" != "1" ]]; then
8+
OPENCLAW_ENTRY="$(openclaw_e2e_resolve_entrypoint)"
9+
fi
710
export OPENCLAW_ENTRY
8-
export OPENCLAW_PLUGINS_TMP_DIR="${OPENCLAW_PLUGINS_TMP_DIR:-/tmp}"
11+
OPENCLAW_PLUGINS_CREATED_TMP_DIR=0
12+
if [[ -z "${OPENCLAW_PLUGINS_TMP_DIR:-}" ]]; then
13+
OPENCLAW_PLUGINS_TMP_DIR="$(mktemp -d "/tmp/openclaw-plugins.XXXXXX")"
14+
OPENCLAW_PLUGINS_CREATED_TMP_DIR=1
15+
fi
16+
export OPENCLAW_PLUGINS_TMP_DIR
917
OPENCLAW_PLUGINS_CLI_TIMEOUT="${OPENCLAW_PLUGINS_CLI_TIMEOUT:-180s}"
1018
mkdir -p "$OPENCLAW_PLUGINS_TMP_DIR"
11-
PACKAGE_VERSION="$(node -p 'require("./package.json").version')"
12-
OPENCLAW_PACKAGE_ACCEPTANCE_LEGACY_COMPAT="$(node scripts/e2e/lib/package-compat.mjs "$PACKAGE_VERSION")"
13-
export OPENCLAW_PACKAGE_ACCEPTANCE_LEGACY_COMPAT
1419

1520
run_plugins_openclaw_logged() {
1621
local label="$1"
@@ -31,13 +36,30 @@ run_plugins_shell_logged() {
3136
run_logged "$label" openclaw_e2e_maybe_timeout "$OPENCLAW_PLUGINS_CLI_TIMEOUT" bash -c "$command"
3237
}
3338

39+
source scripts/e2e/lib/plugins/fixtures.sh
40+
source scripts/e2e/lib/plugins/marketplace.sh
41+
source scripts/e2e/lib/plugins/clawhub.sh
42+
43+
cleanup_openclaw_plugins_sweep() {
44+
openclaw_plugins_cleanup_fixture_servers
45+
if [[ "${OPENCLAW_PLUGINS_CREATED_TMP_DIR:-0}" = "1" ]]; then
46+
rm -rf "$OPENCLAW_PLUGINS_TMP_DIR"
47+
fi
48+
}
49+
50+
if [[ "$OPENCLAW_PLUGINS_SWEEP_SOURCE_ONLY" = "1" ]]; then
51+
return 0 2>/dev/null || { cleanup_openclaw_plugins_sweep; exit 0; }
52+
fi
53+
54+
trap cleanup_openclaw_plugins_sweep EXIT
55+
3456
openclaw_e2e_eval_test_state_from_b64 "${OPENCLAW_TEST_STATE_SCRIPT_B64:?missing OPENCLAW_TEST_STATE_SCRIPT_B64}"
57+
PACKAGE_VERSION="$(node -p 'require("./package.json").version')"
58+
OPENCLAW_PACKAGE_ACCEPTANCE_LEGACY_COMPAT="$(node scripts/e2e/lib/package-compat.mjs "$PACKAGE_VERSION")"
59+
export OPENCLAW_PACKAGE_ACCEPTANCE_LEGACY_COMPAT
3560
BUNDLED_PLUGIN_ROOT_DIR="extensions"
3661
OPENCLAW_PLUGIN_HOME="$HOME/.openclaw/$BUNDLED_PLUGIN_ROOT_DIR"
3762

38-
source scripts/e2e/lib/plugins/fixtures.sh
39-
source scripts/e2e/lib/plugins/marketplace.sh
40-
source scripts/e2e/lib/plugins/clawhub.sh
4163
demo_plugin_id="demo-plugin"
4264
demo_plugin_root="$OPENCLAW_PLUGIN_HOME/$demo_plugin_id"
4365
write_demo_fixture_plugin "$demo_plugin_root"

test/scripts/plugins-assertions.test.ts

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
import { 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";
311
import { createServer } from "node:http";
412
import { tmpdir } from "node:os";
513
import path from "node:path";
@@ -88,6 +96,14 @@ function waitForDead(pid: number, timeoutMs = 2_000): void {
8896
}
8997
}
9098

99+
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+
91107
describe("plugins Docker assertions", () => {
92108
it("rejects loose ClawHub preflight limits instead of parsing prefixes", () => {
93109
const timeoutResult = spawnSync(process.execPath, [ASSERTIONS_SCRIPT, "clawhub-preflight"], {
@@ -126,13 +142,68 @@ describe("plugins Docker assertions", () => {
126142

127143
for (const scriptPath of scripts) {
128144
const script = readFileSync(scriptPath, "utf8");
145+
const scriptWithoutDefaultScratch = script.replace('mktemp -d "/tmp/openclaw-plugins.XXXXXX"', "");
129146
expect(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
});
135152

153+
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+
136207
it("cleans npm fixture registry children when readiness times out", () => {
137208
const root = mkdtempSync(path.join(tmpdir(), "openclaw-plugin-npm-fixture-cleanup-"));
138209
try {

0 commit comments

Comments
 (0)