Files
orca/src/main/wsl-unc-delete.wsl.test.ts
T
mirror 34fa2cd5ca
Skill update round trip / roundtrip (false, macos-latest, copy, 1.5.17) (push) Canceled after 0s
Skill update round trip / roundtrip (false, macos-latest, symlink, 1.5.17) (push) Canceled after 0s
Skill update round trip / roundtrip (false, ubuntu-latest, copy, 1.5.17) (push) Canceled after 0s
Skill update round trip / roundtrip (false, ubuntu-latest, symlink, 1.5.17) (push) Canceled after 0s
Skill update round trip / roundtrip (false, ubuntu-latest, symlink, latest) (push) Canceled after 0s
Skill update round trip / roundtrip (false, windows-latest, copy, 1.5.17) (push) Canceled after 0s
Skill update round trip / roundtrip (false, windows-latest, symlink, 1.5.17) (push) Canceled after 0s
Skill update round trip / roundtrip (true, macos-latest, copy, 1.5.17) (push) Canceled after 0s
Skill update round trip / roundtrip (true, macos-latest, symlink, 1.5.17) (push) Canceled after 0s
Skill update round trip / roundtrip (true, ubuntu-latest, copy, 1.5.17) (push) Canceled after 0s
Skill update round trip / roundtrip (true, ubuntu-latest, symlink, 1.5.17) (push) Canceled after 0s
Skill update round trip / roundtrip (true, windows-latest, copy, 1.5.17) (push) Canceled after 0s
Skill update round trip / roundtrip (true, windows-latest, symlink, 1.5.17) (push) Canceled after 0s
source snapshot 2026-09-02
2026-09-02 02:03:16 +08:00

83 lines
2.8 KiB
TypeScript

import { execFile } from 'node:child_process'
import { promisify } from 'node:util'
import { afterAll, beforeAll, describe, expect, it } from 'vitest'
import { tryDeleteWslUncPath } from './wsl-unc-delete'
const execFileAsync = promisify(execFile)
const DISTRO = process.env.ORCA_WSL_TEST_DISTRO ?? 'Ubuntu-24.04'
const runRealWsl = process.platform === 'win32' && process.env.ORCA_REAL_WSL_DELETE_TEST === '1'
function unc(linuxPath: string): string {
return `\\\\wsl.localhost\\${DISTRO}${linuxPath.replaceAll('/', '\\')}`
}
async function wsl(command: string, ...args: string[]): Promise<string> {
const result = await execFileAsync(
'wsl.exe',
['-d', DISTRO, '--exec', 'sh', '-c', command, 'orca-wsl-test', ...args],
{ encoding: 'utf-8', timeout: 30000 }
)
return result.stdout.trim()
}
describe.skipIf(!runRealWsl)('WSL contained delete integration', () => {
let fixtureRoot: string
beforeAll(async () => {
fixtureRoot = await wsl("mktemp -d -p /tmp 'orca-wsl-delete-real.XXXXXX'")
await wsl(
'mkdir -p "$1/vault" "$1/outside/file-parent" "$1/outside/dir-parent/session" "$1/vault/benign/session" && ' +
'ln -s "$1/outside/file-parent" "$1/vault/file-link" && ' +
'ln -s "$1/outside/dir-parent" "$1/vault/dir-link" && ' +
'printf sentinel > "$1/outside/file-parent/session.json" && ' +
'printf nested > "$1/outside/dir-parent/session/inside" && ' +
'printf unrelated > "$1/outside/unrelated" && ' +
'printf benign > "$1/vault/benign/session/inside"',
fixtureRoot
)
})
afterAll(async () => {
if (/^\/tmp\/orca-wsl-delete-real\.[A-Za-z0-9]+$/u.test(fixtureRoot)) {
await wsl('rm -rf -- "$1"', fixtureRoot)
}
})
it.each([
['file-shaped', 'file-link/session.json', false],
['directory-shaped', 'dir-link/session', true]
])('rejects a %s escape and preserves all outside entries', async (_shape, path, recursive) => {
const vaultRoot = `${fixtureRoot}/vault`
await expect(
tryDeleteWslUncPath(unc(`${vaultRoot}/${path}`), {
recursive,
approvedRoots: [unc(vaultRoot)]
})
).rejects.toMatchObject({ reason: 'path-outside-known-roots' })
await expect(
wsl(
'test -f "$1/outside/file-parent/session.json" && ' +
'test -f "$1/outside/dir-parent/session/inside" && test -f "$1/outside/unrelated"',
fixtureRoot
)
).resolves.toBe('')
})
it('deletes a benign directory without touching an unrelated sentinel', async () => {
const vaultRoot = `${fixtureRoot}/vault`
await expect(
tryDeleteWslUncPath(unc(`${vaultRoot}/benign/session`), {
recursive: true,
approvedRoots: [unc(vaultRoot)]
})
).resolves.toBe(true)
await expect(
wsl('test ! -e "$1/vault/benign/session" && test -f "$1/outside/unrelated"', fixtureRoot)
).resolves.toBe('')
})
})