feat: support abort reasons in Deno APIs and WebSocketStream (#13066)

This commit is contained in:
Andreu Botella 2021-12-16 12:57:26 +01:00 committed by GitHub
parent 9ffc7edc23
commit 01a6b66034
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 241 additions and 63 deletions

View file

@ -4,6 +4,7 @@ import {
assertEquals,
assertRejects,
assertThrows,
unreachable,
} from "./test_util.ts";
Deno.test(
@ -250,6 +251,7 @@ Deno.test(
queueMicrotask(() => ac.abort());
try {
await Deno.writeFile(filename, data, { signal: ac.signal });
unreachable();
} catch (e) {
assert(e instanceof Error);
assertEquals(e.name, "AbortError");
@ -259,6 +261,45 @@ Deno.test(
},
);
Deno.test(
{ permissions: { read: true, write: true } },
async function writeFileAbortSignalReason(): Promise<void> {
const ac = new AbortController();
const enc = new TextEncoder();
const data = enc.encode("Hello");
const filename = Deno.makeTempDirSync() + "/test.txt";
const abortReason = new Error();
queueMicrotask(() => ac.abort(abortReason));
try {
await Deno.writeFile(filename, data, { signal: ac.signal });
unreachable();
} catch (e) {
assertEquals(e, abortReason);
}
const stat = Deno.statSync(filename);
assertEquals(stat.size, 0);
},
);
Deno.test(
{ permissions: { read: true, write: true } },
async function writeFileAbortSignalPrimitiveReason(): Promise<void> {
const ac = new AbortController();
const enc = new TextEncoder();
const data = enc.encode("Hello");
const filename = Deno.makeTempDirSync() + "/test.txt";
queueMicrotask(() => ac.abort("Some string"));
try {
await Deno.writeFile(filename, data, { signal: ac.signal });
unreachable();
} catch (e) {
assertEquals(e, "Some string");
}
const stat = Deno.statSync(filename);
assertEquals(stat.size, 0);
},
);
Deno.test(
{ permissions: { read: true, write: true } },
async function writeFileAbortSignalPreAborted(): Promise<void> {
@ -269,6 +310,7 @@ Deno.test(
const filename = Deno.makeTempDirSync() + "/test.txt";
try {
await Deno.writeFile(filename, data, { signal: ac.signal });
unreachable();
} catch (e) {
assert(e instanceof Error);
assertEquals(e.name, "AbortError");
@ -277,3 +319,44 @@ Deno.test(
assertEquals(stat.size, 0);
},
);
Deno.test(
{ permissions: { read: true, write: true } },
async function writeFileAbortSignalReasonPreAborted(): Promise<void> {
const ac = new AbortController();
const abortReason = new Error();
ac.abort(abortReason);
const enc = new TextEncoder();
const data = enc.encode("Hello");
const filename = Deno.makeTempDirSync() + "/test.txt";
try {
await Deno.writeFile(filename, data, { signal: ac.signal });
unreachable();
} catch (e) {
assertEquals(e, abortReason);
}
const stat = Deno.statSync(filename);
assertEquals(stat.size, 0);
},
);
Deno.test(
{ permissions: { read: true, write: true } },
async function writeFileAbortSignalPrimitiveReasonPreAborted(): Promise<
void
> {
const ac = new AbortController();
ac.abort("Some string");
const enc = new TextEncoder();
const data = enc.encode("Hello");
const filename = Deno.makeTempDirSync() + "/test.txt";
try {
await Deno.writeFile(filename, data, { signal: ac.signal });
unreachable();
} catch (e) {
assertEquals(e, "Some string");
}
const stat = Deno.statSync(filename);
assertEquals(stat.size, 0);
},
);