| import { describe, expect, it } from "vitest"; |
| import { resolveSandboxDockerUser } from "./context.js"; |
| import type { SandboxDockerConfig } from "./types.js"; |
|
|
| const baseDocker: SandboxDockerConfig = { |
| image: "ghcr.io/example/sandbox:latest", |
| containerPrefix: "openclaw-sandbox-", |
| workdir: "/workspace", |
| readOnlyRoot: true, |
| tmpfs: ["/tmp"], |
| network: "none", |
| capDrop: ["ALL"], |
| }; |
|
|
| describe("resolveSandboxDockerUser", () => { |
| it("keeps configured docker.user", async () => { |
| const resolved = await resolveSandboxDockerUser({ |
| docker: { ...baseDocker, user: "2000:2000" }, |
| workspaceDir: "/tmp/unused", |
| stat: async () => ({ uid: 1000, gid: 1000 }), |
| }); |
| expect(resolved.user).toBe("2000:2000"); |
| }); |
|
|
| it("falls back to workspace ownership when docker.user is unset", async () => { |
| const resolved = await resolveSandboxDockerUser({ |
| docker: baseDocker, |
| workspaceDir: "/tmp/workspace", |
| stat: async () => ({ uid: 1001, gid: 1002 }), |
| }); |
| expect(resolved.user).toBe("1001:1002"); |
| }); |
|
|
| it("leaves docker.user unset when workspace stat fails", async () => { |
| const resolved = await resolveSandboxDockerUser({ |
| docker: baseDocker, |
| workspaceDir: "/tmp/workspace", |
| stat: async () => { |
| throw new Error("ENOENT"); |
| }, |
| }); |
| expect(resolved.user).toBeUndefined(); |
| }); |
| }); |
|
|