Files
bun.sh/test/js/web/abort/abort.test.ts
2024-09-03 21:32:52 -07:00

74 lines
1.8 KiB
TypeScript

import { describe, expect, test } from "bun:test";
import { writeFileSync } from "fs";
import { bunEnv, bunExe, tmpdirSync } from "harness";
import { tmpdir } from "os";
import { join } from "path";
describe("AbortSignal", () => {
test("spawn test", async () => {
const fileName = `/abort.test.ts`;
const testFileContents = await Bun.file(join(import.meta.dir, "abort.ts")).arrayBuffer();
writeFileSync(join(tmpdirSync(), fileName), testFileContents, "utf8");
const { stderr } = Bun.spawnSync({
cmd: [bunExe(), "test", fileName],
env: bunEnv,
cwd: tmpdir(),
});
expect(stderr?.toString()).not.toContain("✗");
});
test("AbortSignal.timeout(n) should not freeze the process", async () => {
const fileName = join(import.meta.dir, "abort.signal.ts");
const server = Bun.spawn({
cmd: [bunExe(), fileName],
env: bunEnv,
cwd: tmpdir(),
});
const exitCode = await Promise.race([
server.exited,
(async () => {
await Bun.sleep(5000);
server.kill();
return 2;
})(),
]);
expect(exitCode).toBe(0);
});
test("AbortSignal.any() should fire abort event", async () => {
async function testAny(signalToAbort: number) {
const { promise, resolve } = Promise.withResolvers();
const a = new AbortController();
const b = new AbortController();
// @ts-ignore
const signal = AbortSignal.any([a.signal, b.signal]);
const timeout = setTimeout(() => {
resolve(false);
}, 100);
signal.addEventListener("abort", () => {
clearTimeout(timeout);
resolve(true);
});
if (signalToAbort) {
b.abort();
} else {
a.abort();
}
expect(await promise).toBe(true);
expect(signal.aborted).toBe(true);
}
await testAny(0);
await testAny(1);
});
});