66 lines
1.9 KiB
TypeScript
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 })
|
|
}
|
|
})
|
|
}
|