@@ -759,6 +759,94 @@ grep -q '^pull openclaw-reuse-image$' "$TMPDIR/docker-seen"
|
759 | 759 | } |
760 | 760 | }); |
761 | 761 | |
| 762 | +it("derives the browser CDP image from the shared functional image", () => { |
| 763 | +const workDir = mkdtempSync(join(tmpdir(), "openclaw-browser-cdp-shared-image-")); |
| 764 | + |
| 765 | +try { |
| 766 | +const rootDir = process.cwd(); |
| 767 | +mkdirSync(join(workDir, "bin")); |
| 768 | +writeFileSync( |
| 769 | +join(workDir, "bin", "docker"), |
| 770 | +`#!/usr/bin/env bash |
| 771 | +printf "%s\\n" "$*" >>"$TMPDIR/docker-seen" |
| 772 | +case "$1 $2" in |
| 773 | + "image inspect") |
| 774 | + exit 0 |
| 775 | + ;; |
| 776 | + "inspect -f") |
| 777 | + printf "true\\n" |
| 778 | + exit 0 |
| 779 | + ;; |
| 780 | + "rm -f") |
| 781 | + exit 0 |
| 782 | + ;; |
| 783 | + "run "*) |
| 784 | + printf "container-id\\n" |
| 785 | + exit 0 |
| 786 | + ;; |
| 787 | + "exec "*) |
| 788 | + exit 0 |
| 789 | + ;; |
| 790 | +esac |
| 791 | +case "$1" in |
| 792 | + build) |
| 793 | + exit 0 |
| 794 | + ;; |
| 795 | +esac |
| 796 | +exit 9 |
| 797 | +`, |
| 798 | +); |
| 799 | +writeFileSync( |
| 800 | +join(workDir, "bin", "node"), |
| 801 | +`#!/usr/bin/env bash |
| 802 | +printf "echo state\\n" |
| 803 | +`, |
| 804 | +); |
| 805 | +writeFileSync( |
| 806 | +join(workDir, "bin", "timeout"), |
| 807 | +`#!/usr/bin/env bash |
| 808 | +case "\${1:-}" in |
| 809 | + --kill-after=1s | --kill-after=30s) |
| 810 | + shift 2 |
| 811 | + ;; |
| 812 | + *) |
| 813 | + shift |
| 814 | + ;; |
| 815 | +esac |
| 816 | +exec "$@" |
| 817 | +`, |
| 818 | +); |
| 819 | +chmodSync(join(workDir, "bin", "docker"), 0o755); |
| 820 | +chmodSync(join(workDir, "bin", "node"), 0o755); |
| 821 | +chmodSync(join(workDir, "bin", "timeout"), 0o755); |
| 822 | + |
| 823 | +const script = ` |
| 824 | +set -euo pipefail |
| 825 | +ROOT_DIR=${shellQuote(rootDir)} |
| 826 | +TMPDIR=${shellQuote(workDir)} |
| 827 | +export ROOT_DIR TMPDIR |
| 828 | +export PATH="$TMPDIR/bin:$PATH" |
| 829 | +export OPENCLAW_SKIP_DOCKER_BUILD=1 |
| 830 | +export OPENCLAW_DOCKER_E2E_IMAGE=shared-functional |
| 831 | +export OPENCLAW_DOCKER_ALL_LANE_NAME=browser-cdp-snapshot |
| 832 | + |
| 833 | +bash "$ROOT_DIR/scripts/e2e/browser-cdp-snapshot-docker.sh" |
| 834 | + |
| 835 | +grep -q '^image inspect shared-functional$' "$TMPDIR/docker-seen" |
| 836 | +grep -Fq 'build -t openclaw-browser-cdp-snapshot-e2e:browser-cdp-snapshot' "$TMPDIR/docker-seen" |
| 837 | +grep -Fq ' openclaw-browser-cdp-snapshot-e2e:browser-cdp-snapshot ' "$TMPDIR/docker-seen" |
| 838 | +if grep -Fq ' shared-functional ' "$TMPDIR/docker-seen"; then |
| 839 | + echo "browser CDP lane reused the shared image without Chromium" >&2 |
| 840 | + exit 1 |
| 841 | +fi |
| 842 | +`; |
| 843 | + |
| 844 | +execFileSync("bash", ["-lc", script], { encoding: "utf8" }); |
| 845 | +} finally { |
| 846 | +rmSync(workDir, { recursive: true, force: true }); |
| 847 | +} |
| 848 | +}); |
| 849 | + |
762 | 850 | it("fails Docker commands fast when timeout is unavailable", () => { |
763 | 851 | const workDir = mkdtempSync(join(tmpdir(), "openclaw-docker-timeout-required-")); |
764 | 852 | |
|