deno/cli/tests/unit/read_file_test.ts
Asher Gomez 947ce41e99
feat: deprecate Deno.resources() (#22059)
Most uses of `Deno.resources()` within tests, as they previously checked
for leaked resources. This is not needed as the test runner does this
automatically. Other internal uses of this API have been replaced with
the internal `Deno[Deno.internal].core.resources()`.
2024-01-24 00:27:29 +01:00

183 lines
5 KiB
TypeScript

// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
import {
assert,
assertEquals,
assertRejects,
assertThrows,
pathToAbsoluteFileUrl,
unreachable,
} from "./test_util.ts";
Deno.test({ permissions: { read: true } }, function readFileSyncSuccess() {
const data = Deno.readFileSync("cli/tests/testdata/assets/fixture.json");
assert(data.byteLength > 0);
const decoder = new TextDecoder("utf-8");
const json = decoder.decode(data);
const pkg = JSON.parse(json);
assertEquals(pkg.name, "deno");
});
Deno.test({ permissions: { read: true } }, function readFileSyncUrl() {
const data = Deno.readFileSync(
pathToAbsoluteFileUrl("cli/tests/testdata/assets/fixture.json"),
);
assert(data.byteLength > 0);
const decoder = new TextDecoder("utf-8");
const json = decoder.decode(data);
const pkg = JSON.parse(json);
assertEquals(pkg.name, "deno");
});
Deno.test({ permissions: { read: false } }, function readFileSyncPerm() {
assertThrows(() => {
Deno.readFileSync("cli/tests/testdata/assets/fixture.json");
}, Deno.errors.PermissionDenied);
});
Deno.test({ permissions: { read: true } }, function readFileSyncNotFound() {
assertThrows(() => {
Deno.readFileSync("bad_filename");
}, Deno.errors.NotFound);
});
Deno.test({ permissions: { read: true } }, async function readFileUrl() {
const data = await Deno.readFile(
pathToAbsoluteFileUrl("cli/tests/testdata/assets/fixture.json"),
);
assert(data.byteLength > 0);
const decoder = new TextDecoder("utf-8");
const json = decoder.decode(data);
const pkg = JSON.parse(json);
assertEquals(pkg.name, "deno");
});
Deno.test({ permissions: { read: true } }, async function readFileSuccess() {
const data = await Deno.readFile("cli/tests/testdata/assets/fixture.json");
assert(data.byteLength > 0);
const decoder = new TextDecoder("utf-8");
const json = decoder.decode(data);
const pkg = JSON.parse(json);
assertEquals(pkg.name, "deno");
});
Deno.test({ permissions: { read: false } }, async function readFilePerm() {
await assertRejects(async () => {
await Deno.readFile("cli/tests/testdata/assets/fixture.json");
}, Deno.errors.PermissionDenied);
});
Deno.test({ permissions: { read: true } }, function readFileSyncLoop() {
for (let i = 0; i < 256; i++) {
Deno.readFileSync("cli/tests/testdata/assets/fixture.json");
}
});
Deno.test(
{ permissions: { read: true } },
async function readFileDoesNotLeakResources() {
await assertRejects(async () => await Deno.readFile("cli"));
},
);
Deno.test(
{ permissions: { read: true } },
function readFileSyncDoesNotLeakResources() {
assertThrows(() => Deno.readFileSync("cli"));
},
);
Deno.test(
{ permissions: { read: true } },
async function readFileWithAbortSignal() {
const ac = new AbortController();
queueMicrotask(() => ac.abort());
const error = await assertRejects(
async () => {
await Deno.readFile("cli/tests/testdata/assets/fixture.json", {
signal: ac.signal,
});
},
);
assert(error instanceof DOMException);
assertEquals(error.name, "AbortError");
},
);
Deno.test(
{ permissions: { read: true } },
async function readFileWithAbortSignalReason() {
const ac = new AbortController();
const abortReason = new Error();
queueMicrotask(() => ac.abort(abortReason));
const error = await assertRejects(
async () => {
await Deno.readFile("cli/tests/testdata/assets/fixture.json", {
signal: ac.signal,
});
},
);
assertEquals(error, abortReason);
},
);
Deno.test(
{ permissions: { read: true } },
async function readFileWithAbortSignalPrimitiveReason() {
const ac = new AbortController();
queueMicrotask(() => ac.abort("Some string"));
try {
await Deno.readFile("cli/tests/testdata/assets/fixture.json", {
signal: ac.signal,
});
unreachable();
} catch (e) {
assertEquals(e, "Some string");
}
},
);
// Test that AbortController's cancel handle is cleaned-up correctly, and do not leak resources.
Deno.test(
{ permissions: { read: true } },
async function readFileWithAbortSignalNotCalled() {
const ac = new AbortController();
await Deno.readFile("cli/tests/testdata/assets/fixture.json", {
signal: ac.signal,
});
},
);
Deno.test(
{ permissions: { read: true }, ignore: Deno.build.os !== "linux" },
async function readFileProcFs() {
const data = await Deno.readFile("/proc/self/stat");
assert(data.byteLength > 0);
},
);
Deno.test(
{ permissions: { read: true } },
async function readFileNotFoundErrorCode() {
try {
await Deno.readFile("definitely-not-found.json");
} catch (e) {
assertEquals(e.code, "ENOENT");
}
},
);
Deno.test(
{ permissions: { read: true } },
async function readFileIsDirectoryErrorCode() {
try {
await Deno.readFile("cli/tests/testdata/assets/");
} catch (e) {
if (Deno.build.os === "windows") {
assertEquals(e.code, "ENOENT");
} else {
assertEquals(e.code, "EISDIR");
}
}
},
);