























@@ -79,6 +79,24 @@ function writeFixtureServerShims(binDir: string, pidPath: string): void {
7979writeFileSync(pidPath, "");
8080}
818182+function writeStubbornFixtureServerShims(binDir: string, pidPath: string): void {
83+mkdirSync(binDir, { recursive: true });
84+writeFileSync(
85+path.join(binDir, "node"),
86+[
87+"#!/bin/bash",
88+'printf "%s\\n" "$$" >"$OPENCLAW_TEST_FIXTURE_SERVER_PID"',
89+"trap ':' TERM",
90+"while true; do /bin/sleep 1; done",
91+"",
92+].join("\n"),
93+);
94+writeFileSync(path.join(binDir, "sleep"), "#!/bin/bash\nexit 0\n");
95+chmodSync(path.join(binDir, "node"), 0o755);
96+chmodSync(path.join(binDir, "sleep"), 0o755);
97+writeFileSync(pidPath, "");
98+}
99+82100function writeCrashingFixtureServerShim(binDir: string): void {
83101mkdirSync(binDir, { recursive: true });
84102writeFileSync(
@@ -327,6 +345,51 @@ test -d "$OPENCLAW_PLUGINS_TMP_DIR"
327345}
328346});
329347348+it("force-kills stubborn npm fixture registry children during cleanup", () => {
349+const root = mkdtempSync(path.join(tmpdir(), "openclaw-plugin-npm-fixture-kill-"));
350+try {
351+const binDir = path.join(root, "bin");
352+const fixtureDir = path.join(root, "fixture");
353+const pidPath = path.join(root, "server.pid");
354+mkdirSync(fixtureDir);
355+writeStubbornFixtureServerShims(binDir, pidPath);
356+357+const result = spawnSync(
358+"/bin/bash",
359+[
360+"-c",
361+[
362+"set -euo pipefail",
363+"source scripts/e2e/lib/plugins/fixtures.sh",
364+"set +e",
365+`( start_npm_fixture_registry fixture-pkg 1.0.0 ${shellQuote(path.join(root, "fixture.tgz"))} ${shellQuote(fixtureDir)} )`,
366+'status="$?"',
367+"set -e",
368+'[ "$status" != "0" ]',
369+].join("\n"),
370+],
371+{
372+cwd: process.cwd(),
373+encoding: "utf8",
374+env: {
375+ ...process.env,
376+OPENCLAW_PLUGINS_FIXTURE_STOP_ATTEMPTS: "2",
377+OPENCLAW_PLUGINS_FIXTURE_STOP_INTERVAL_SECONDS: "0.05",
378+OPENCLAW_TEST_FIXTURE_SERVER_PID: pidPath,
379+PATH: `${binDir}${path.delimiter}/usr/bin${path.delimiter}/bin`,
380+},
381+},
382+);
383+384+expect(result.status, result.stderr || result.stdout).toBe(0);
385+const pid = Number(readFileSync(pidPath, "utf8"));
386+expect(Number.isInteger(pid)).toBe(true);
387+waitForDead(pid);
388+} finally {
389+rmSync(root, { force: true, recursive: true });
390+}
391+});
392+330393it("bounds npm fixture registry logs when readiness fails", () => {
331394const root = mkdtempSync(path.join(tmpdir(), "openclaw-plugin-npm-fixture-log-"));
332395try {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。