54 lines
2.1 KiB
JavaScript
54 lines
2.1 KiB
JavaScript
import { executeTool } from '../src/capabilities/executor.js'
|
|
|
|
const checks = []
|
|
|
|
function assert(condition, label, detail = '') {
|
|
checks.push({ ok: !!condition, label, detail })
|
|
if (!condition) {
|
|
console.error(`[FAIL] ${label}${detail ? `\n ${detail}` : ''}`)
|
|
} else {
|
|
console.log(`[PASS] ${label}`)
|
|
}
|
|
}
|
|
|
|
function parseJsonResult(value) {
|
|
try {
|
|
return JSON.parse(String(value || ''))
|
|
} catch {
|
|
return null
|
|
}
|
|
}
|
|
|
|
const testPath = `smoke/verifiable-${Date.now()}.txt`
|
|
const testContent = 'hello verifiable completion'
|
|
|
|
const writeResultText = await executeTool('write_file', {
|
|
path: testPath,
|
|
content: testContent,
|
|
}, { source: 'smoke-test' })
|
|
const writeResult = parseJsonResult(writeResultText)
|
|
assert(writeResult?.ok === true && writeResult?.verified === true, 'write_file returns verified evidence', writeResultText)
|
|
assert(writeResult?.bytes === Buffer.byteLength(testContent, 'utf-8'), 'write_file reports byte count', writeResultText)
|
|
|
|
const readResult = await executeTool('read_file', { path: testPath }, { source: 'smoke-test' })
|
|
assert(readResult === testContent, 'read_file reads back exact content', readResult)
|
|
|
|
const outsideRead = await executeTool('read_file', { path: '../package.json' }, { source: 'smoke-test' })
|
|
assert(/^执行失败:访问被拒绝/.test(String(outsideRead)), 'read_file rejects sandbox escape', outsideRead)
|
|
|
|
const deniedCommandText = await executeTool('exec_command', {
|
|
command: 'type ..\\package.json',
|
|
}, { source: 'smoke-test' })
|
|
const deniedCommand = parseJsonResult(deniedCommandText)
|
|
assert(deniedCommand?.ok === false && deniedCommand?.error === 'permission denied', 'exec_command rejects parent directory access', deniedCommandText)
|
|
|
|
const deleteResultText = await executeTool('delete_file', { path: testPath }, { source: 'smoke-test' })
|
|
const deleteResult = parseJsonResult(deleteResultText)
|
|
assert(deleteResult?.ok === true && deleteResult?.verified_absent === true, 'delete_file returns absence verification', deleteResultText)
|
|
|
|
const failed = checks.filter(item => !item.ok)
|
|
console.log(`\nSmoke checks: ${checks.length - failed.length}/${checks.length} passed`)
|
|
if (failed.length) {
|
|
process.exitCode = 1
|
|
}
|