|
1 | 1 | 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"; |
3 | 11 | import { createServer } from "node:http"; |
4 | 12 | import { tmpdir } from "node:os"; |
5 | 13 | import path from "node:path"; |
@@ -88,6 +96,14 @@ function waitForDead(pid: number, timeoutMs = 2_000): void { |
88 | 96 | } |
89 | 97 | } |
90 | 98 |
|
| 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 | + |
91 | 107 | describe("plugins Docker assertions", () => { |
92 | 108 | it("rejects loose ClawHub preflight limits instead of parsing prefixes", () => { |
93 | 109 | const timeoutResult = spawnSync(process.execPath, [ASSERTIONS_SCRIPT, "clawhub-preflight"], { |
@@ -126,13 +142,68 @@ describe("plugins Docker assertions", () => { |
126 | 142 |
|
127 | 143 | for (const scriptPath of scripts) { |
128 | 144 | const script = readFileSync(scriptPath, "utf8"); |
| 145 | + const scriptWithoutDefaultScratch = script.replace('mktemp -d "/tmp/openclaw-plugins.XXXXXX"', ""); |
129 | 146 | expect(script).toContain("OPENCLAW_PLUGINS_TMP_DIR"); |
130 | | - expect(script).not.toMatch( |
| 147 | + expect(scriptWithoutDefaultScratch).not.toMatch( |
131 | 148 | /\/tmp\/(?:plugins|marketplace|demo-plugin|is-number|openclaw-plugin|openclaw-clawhub)/, |
132 | 149 | ); |
133 | 150 | } |
134 | 151 | }); |
135 | 152 |
|
| 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 | + |
136 | 207 | it("cleans npm fixture registry children when readiness times out", () => { |
137 | 208 | const root = mkdtempSync(path.join(tmpdir(), "openclaw-plugin-npm-fixture-cleanup-")); |
138 | 209 | try { |
|
0 commit comments