blob: 33eb6b60557730c2b36b84976bb4476a45f7c6b6 [file]
import assert from 'node:assert/strict';
import { describe, test } from 'node:test';
import { isLikelySandboxDenial } from '../sandbox/detect.js';
describe('isLikelySandboxDenial regex branches', () => {
test('matches "operation not permitted" branch', () => {
assert.equal(
isLikelySandboxDenial({ stdout: '', stderr: 'Operation not permitted', sandboxed: true }),
true,
);
});
test('matches "sandbox-exec" branch', () => {
assert.equal(
isLikelySandboxDenial({
stdout: '',
stderr: 'launching sandbox-exec profile',
sandboxed: true,
}),
true,
);
});
test('matches macOS dyld file system sandbox failures', () => {
assert.equal(
isLikelySandboxDenial({
stdout: '',
stderr: 'dyld: file system sandbox blocked mmap() of a dependent library',
sandboxed: true,
}),
true,
);
});
test('matches "sandbox...denied" branch', () => {
assert.equal(
isLikelySandboxDenial({
stdout: '',
stderr: 'sandbox-denied: write outside',
sandboxed: true,
}),
true,
);
});
test('matches "sandboxed ... denied" variant', () => {
assert.equal(
isLikelySandboxDenial({
stdout: '',
stderr: 'The operation was sandboxed and denied by policy',
sandboxed: true,
}),
true,
);
});
});
describe('isLikelySandboxDenial stdout vs stderr', () => {
test('detects denial message in stdout (not just stderr)', () => {
assert.equal(
isLikelySandboxDenial({ stdout: 'Operation not permitted', stderr: '', sandboxed: true }),
true,
);
});
test('scans the combined stderr+stdout text', () => {
assert.equal(
isLikelySandboxDenial({ stdout: 'sandbox denied', stderr: '', sandboxed: true }),
true,
);
});
});
describe('isLikelySandboxDenial near-misses', () => {
test('returns false when sandboxed is false, even if text matches', () => {
assert.equal(
isLikelySandboxDenial({ stdout: '', stderr: 'Operation not permitted', sandboxed: false }),
false,
);
});
test('returns false for "operation permitted" (missing "not")', () => {
assert.equal(
isLikelySandboxDenial({ stdout: '', stderr: 'operation permitted', sandboxed: true }),
false,
);
});
test('returns false for "sandbox" alone (no deny/denied)', () => {
assert.equal(
isLikelySandboxDenial({
stdout: '',
stderr: 'running in sandbox environment',
sandboxed: true,
}),
false,
);
});
test('returns false for "permission denied" (no sandbox prefix)', () => {
assert.equal(
isLikelySandboxDenial({ stdout: '', stderr: 'permission denied', sandboxed: true }),
false,
);
});
test('returns false for "sandbox denial" (denial != deny/denied)', () => {
assert.equal(
isLikelySandboxDenial({
stdout: '',
stderr: 'sandbox denial detected',
sandboxed: true,
}),
false,
);
});
test('returns false for plain text without any sandbox signal', () => {
assert.equal(
isLikelySandboxDenial({
stdout: 'command not found',
stderr: 'exit code 127',
sandboxed: true,
}),
false,
);
});
test('returns false for denial split across stdout/stderr by a newline', () => {
// The predicate scans `${stderr}\n${stdout}`; regex branch 3 uses [^\n]*
// which cannot cross a newline, so "sandbox" and "denied" must be in the
// same field to match.
assert.equal(
isLikelySandboxDenial({ stdout: 'then denied', stderr: 'sandbox setup', sandboxed: true }),
false,
);
});
});
describe('isLikelySandboxDenial case-insensitive', () => {
test('matches uppercase "OPERATION NOT PERMITTED"', () => {
assert.equal(
isLikelySandboxDenial({
stdout: '',
stderr: 'OPERATION NOT PERMITTED',
sandboxed: true,
}),
true,
);
});
test('matches mixed case "Sandbox-Denied"', () => {
assert.equal(
isLikelySandboxDenial({ stdout: '', stderr: 'Sandbox-Denied', sandboxed: true }),
true,
);
});
});