UNPKG

@napi-rs/cli

Version:

Cli tools for napi-rs

114 lines (102 loc) 3.22 kB
import { existsSync } from 'node:fs' import { mkdir, rm, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' import ava, { type TestFn } from 'ava' import { buildProject } from '../build.js' const test = ava as TestFn<{ tmpDir: string; projectDir: string }> test.beforeEach(async (t) => { const tmpDir = join( tmpdir(), 'napi-rs-test', `android-build-${Date.now()}-${Math.random().toString(36).slice(2)}`, ) const projectDir = join(tmpDir, 'project') await mkdir(join(projectDir, 'src'), { recursive: true }) await writeFile( join(projectDir, 'Cargo.toml'), `[package] name = "android_build" version = "0.1.0" edition = "2021" [[bin]] name = "android-build" path = "src/main.rs" `, ) await writeFile(join(projectDir, 'src', 'main.rs'), 'fn main() {}\n') await writeFile( join(projectDir, 'package.json'), JSON.stringify({ name: 'android-build', version: '0.1.0' }), ) t.context = { tmpDir, projectDir } }) test.afterEach.always(async (t) => { if (existsSync(t.context.tmpDir)) { await rm(t.context.tmpDir, { recursive: true, force: true }) } }) test.serial( 'requires ANDROID_NDK_LATEST_HOME before spawning an Android cross-build', async (t) => { const { projectDir } = t.context const originalCargo = process.env.CARGO const originalNdkHome = process.env.ANDROID_NDK_LATEST_HOME process.env.CARGO = join(projectDir, 'cargo-must-not-run') delete process.env.ANDROID_NDK_LATEST_HOME try { const error = await t.throwsAsync(() => buildProject({ cwd: projectDir, target: 'aarch64-linux-android', bin: 'android-build', }), ) t.regex(error!.message, /ANDROID_NDK_LATEST_HOME.+required/) } finally { if (originalCargo === undefined) { delete process.env.CARGO } else { process.env.CARGO = originalCargo } if (originalNdkHome === undefined) { delete process.env.ANDROID_NDK_LATEST_HOME } else { process.env.ANDROID_NDK_LATEST_HOME = originalNdkHome } } }, ) test.serial( 'skips host Android NDK setup when building with cross', async (t) => { const { projectDir } = t.context const originalCargo = process.env.CARGO const originalNdkHome = process.env.ANDROID_NDK_LATEST_HOME const cargoPath = join(projectDir, 'cross-must-be-spawned') process.env.CARGO = cargoPath delete process.env.ANDROID_NDK_LATEST_HOME try { const { task } = await buildProject({ cwd: projectDir, target: 'aarch64-linux-android', bin: 'android-build', useCross: true, }) const error = await t.throwsAsync(task) t.is((error!.cause as NodeJS.ErrnoException).path, cargoPath) t.notRegex(error!.message, /ANDROID_NDK_LATEST_HOME/) } finally { if (originalCargo === undefined) { delete process.env.CARGO } else { process.env.CARGO = originalCargo } if (originalNdkHome === undefined) { delete process.env.ANDROID_NDK_LATEST_HOME } else { process.env.ANDROID_NDK_LATEST_HOME = originalNdkHome } } }, )