48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
import { stat, truncate, writeFile } from "node:fs/promises";
|
|
import { join } from "node:path";
|
|
|
|
import { expect, it } from "vitest";
|
|
|
|
import { snapshotAndroidTarget } from "../../../src/android/AndroidTargetSnapshot.js";
|
|
import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js";
|
|
|
|
it.skipIf(process.platform === "win32")(
|
|
"cancels an in-flight APK snapshot and removes its partial output",
|
|
async () => {
|
|
const root = await createTestTempDirectory("rea-android-snapshot-cancel-");
|
|
const source = join(root, "large.apk");
|
|
const snapshot = join(root, "target.apk");
|
|
await writeFile(source, "");
|
|
// A sparse extent keeps fixture setup cheap while ensuring the copy cannot
|
|
// finish before the test observes its first output bytes and aborts it.
|
|
await truncate(source, 64 * 1024 * 1024 * 1024);
|
|
|
|
const controller = new AbortController();
|
|
const pending = snapshotAndroidTarget(
|
|
source,
|
|
"0".repeat(64),
|
|
root,
|
|
"inspect_android_package",
|
|
controller.signal,
|
|
);
|
|
try {
|
|
await expect
|
|
.poll(
|
|
() =>
|
|
stat(snapshot).then(
|
|
({ size }) => size > 0,
|
|
() => false,
|
|
),
|
|
{ timeout: 10_000, interval: 10 },
|
|
)
|
|
.toBe(true);
|
|
controller.abort();
|
|
await expect(pending).rejects.toMatchObject({ name: "AbortError" });
|
|
await expect(stat(snapshot)).rejects.toMatchObject({ code: "ENOENT" });
|
|
} finally {
|
|
controller.abort();
|
|
await pending.catch(() => undefined);
|
|
}
|
|
},
|
|
);
|