Files
hermes-agent/apps/desktop/electron/bootstrap-quit.test.ts

66 lines
1.9 KiB
TypeScript

import assert from 'node:assert/strict'
import fs from 'node:fs'
import os from 'node:os'
import path from 'node:path'
import { test } from 'vitest'
import { runBootstrap } from './bootstrap-runner'
for (const boundary of ['resolution', 'manifest'] as const) {
test.skipIf(process.platform === 'win32')(`quit during ${boundary} cancels bootstrap before stages`, async () => {
const home = fs.mkdtempSync(path.join(os.tmpdir(), 'hermes-bootstrap-quit-'))
const controller = new AbortController()
const marker = path.join(home, 'manifest-started')
let manifestPid: number | undefined
fs.mkdirSync(path.join(home, 'scripts'))
fs.writeFileSync(
path.join(home, 'scripts/install.sh'),
`#!/usr/bin/env bash\nprintf started > "$HERMES_HOME/manifest-started"\nprintf 'manifest-pid=%s\\n' "$$"\nwhile :; do :; done\n`
)
try {
const result = await runBootstrap({
installStamp: null,
activeRoot: path.join(home, 'agent'),
sourceRepoRoot: home,
hermesHome: home,
abortSignal: controller.signal,
onEvent: event => {
if (boundary === 'resolution' && event.line?.includes('using local')) {
controller.abort()
}
const match = event.line?.match(/^manifest-pid=(\d+)$/)
if (match) {
manifestPid = Number(match[1])
controller.abort()
}
}
})
assert.equal(result.ok, false)
assert.equal(result.cancelled, true)
assert.equal(fs.existsSync(marker), boundary === 'manifest')
if (manifestPid) {
assert.throws(() => process.kill(manifestPid!, 0))
}
} finally {
controller.abort()
if (manifestPid) {
try {
process.kill(manifestPid, 'SIGKILL')
} catch {
/* already exited */
}
}
fs.rmSync(home, { recursive: true, force: true })
}
})
}