Files
goodbuddy/tests/loongarch-cross.test.ts
mesalogo 49700bc7cf fix: make LoongArch preview checksum portable
Generate SHA256SUMS from inside the timestamped artifact directory so it records only the DEB filename and remains verifiable after copying the preview output elsewhere.
2026-08-26 17:12:20 +08:00

118 lines
3.4 KiB
TypeScript

import {
mkdirSync,
mkdtempSync,
readFileSync,
rmSync,
writeFileSync
} from 'node:fs'
import { createRequire } from 'node:module'
import { tmpdir } from 'node:os'
import { dirname, join } from 'node:path'
import { afterEach, describe, expect, it } from 'vitest'
interface LoongArchInputBuilderModule {
inputPaths: string[]
parseArguments(arguments_: string[]): { output: string }
verifyInputs(projectRoot?: string): void
}
const require = createRequire(import.meta.url)
const inputBuilder = require(
'../build/loongarch-cross/prepare-input.cjs'
) as LoongArchInputBuilderModule
const previewScript = readFileSync(
join(
process.cwd(),
'build',
'loongarch-cross',
'preview-deb.sh'
),
'utf8'
)
let temporaryDirectories: string[] = []
afterEach(() => {
for (const directory of temporaryDirectories) {
rmSync(directory, { recursive: true, force: true })
}
temporaryDirectories = []
})
describe('LoongArch cross-build input', () => {
it('supports an explicit output path and rejects unknown arguments', () => {
const output = join(tmpdir(), 'goodbuddy-loongarch-input.tgz')
expect(
inputBuilder.parseArguments(['--output', output]).output
).toBe(output)
expect(() =>
inputBuilder.parseArguments(['--unknown'])
).toThrow('未知参数')
expect(() =>
inputBuilder.parseArguments(['--output'])
).toThrow('--output 缺少值')
})
it('requires every architecture-neutral packaging input', () => {
const root = mkdtempSync(
join(tmpdir(), 'goodbuddy-loongarch-input-test-')
)
temporaryDirectories.push(root)
for (const relativePath of inputBuilder.inputPaths) {
const absolutePath = join(root, relativePath)
mkdirSync(dirname(absolutePath), { recursive: true })
writeFileSync(absolutePath, 'input')
}
expect(() => inputBuilder.verifyInputs(root)).not.toThrow()
const missingPath = inputBuilder.inputPaths.at(-1)
expect(missingPath).toBeDefined()
rmSync(join(root, missingPath!), { force: true })
expect(() => inputBuilder.verifyInputs(root)).toThrow(
`龙芯交叉构建输入缺失:${missingPath}`
)
})
})
describe('LoongArch preview package contract', () => {
it('keeps the preview isolated and verifies target native code', () => {
expect(previewScript).toContain(
'Package: goodbuddy-loongarch-preview'
)
expect(previewScript).toContain('Architecture: loong64')
expect(previewScript).toContain(
'goodbuddy-loongarch-preview'
)
expect(previewScript).toContain(
'@koromix/koffi-linux-loong64'
)
expect(previewScript).toContain(
'assert_loongarch_elf "${node_pty_binding}"'
)
expect(previewScript).toContain(
"packages['node_modules/node-pty'].version"
)
expect(previewScript).not.toContain(
'node_pty_version="1.1.0"'
)
expect(previewScript).toContain(
'sha256sum "${artifact_name}" > SHA256SUMS'
)
expect(previewScript).toContain(
'assert_loongarch_elf "${koffi_binding}"'
)
expect(previewScript).toContain('libpulse0')
expect(previewScript).toContain('"bundledAgent": false')
expect(previewScript).toContain(
'"bundledRemoteRuntime": false'
)
expect(previewScript).toContain(
'"bundledOpenCode": false'
)
expect(previewScript).toContain('"nativeCanvas": false')
expect(previewScript).not.toContain('--no-sandbox')
})
})