2024-01-01 14:58:21 -05:00
|
|
|
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
2023-03-15 23:16:03 -04:00
|
|
|
|
2024-07-25 01:30:28 -04:00
|
|
|
import { assert, assertEquals, assertThrows } from "@std/assert";
|
2023-03-15 23:16:03 -04:00
|
|
|
import { join } from "node:path";
|
|
|
|
import { tmpdir } from "node:os";
|
2024-01-21 15:48:48 -05:00
|
|
|
import {
|
|
|
|
constants,
|
2024-04-07 23:47:34 -04:00
|
|
|
createWriteStream,
|
2024-01-21 15:48:48 -05:00
|
|
|
existsSync,
|
2024-05-28 06:24:54 -04:00
|
|
|
lstatSync,
|
2024-01-21 15:48:48 -05:00
|
|
|
mkdtempSync,
|
|
|
|
promises,
|
|
|
|
readFileSync,
|
2024-03-06 07:59:10 -05:00
|
|
|
Stats,
|
|
|
|
statSync,
|
2024-01-21 15:48:48 -05:00
|
|
|
writeFileSync,
|
|
|
|
} from "node:fs";
|
2024-05-28 08:30:31 -04:00
|
|
|
import {
|
|
|
|
constants as fsPromiseConstants,
|
|
|
|
cp,
|
|
|
|
FileHandle,
|
|
|
|
open,
|
|
|
|
writeFile,
|
|
|
|
} from "node:fs/promises";
|
2024-04-07 23:47:34 -04:00
|
|
|
import process from "node:process";
|
2023-12-04 16:05:40 -05:00
|
|
|
import { pathToAbsoluteFileUrl } from "../unit/test_util.ts";
|
2023-03-15 23:16:03 -04:00
|
|
|
|
|
|
|
Deno.test(
|
|
|
|
"[node/fs writeFileSync] write file without option",
|
|
|
|
() => {
|
|
|
|
const data = "Hello";
|
|
|
|
const filename = mkdtempSync(join(tmpdir(), "foo-")) + "/test.txt";
|
|
|
|
|
|
|
|
writeFileSync(filename, data);
|
|
|
|
const dataRead = readFileSync(filename, "utf8");
|
|
|
|
|
|
|
|
assert(dataRead === "Hello");
|
|
|
|
},
|
|
|
|
);
|
|
|
|
|
|
|
|
Deno.test(
|
|
|
|
"[node/fs writeFileSync] write file with option ASCII",
|
|
|
|
() => {
|
|
|
|
const data = "Hello";
|
|
|
|
const filename = mkdtempSync(join(tmpdir(), "foo-")) + "/test.txt";
|
|
|
|
|
|
|
|
writeFileSync(filename, data, { encoding: "ascii" });
|
|
|
|
const dataRead = readFileSync(filename, "utf8");
|
|
|
|
|
|
|
|
assert(dataRead === "Hello");
|
|
|
|
},
|
|
|
|
);
|
|
|
|
|
|
|
|
Deno.test(
|
|
|
|
"[node/fs writeFileSync] write file throws error when encoding is not implemented",
|
|
|
|
() => {
|
|
|
|
const data = "Hello";
|
|
|
|
const filename = mkdtempSync(join(tmpdir(), "foo-")) + "/test.txt";
|
|
|
|
|
|
|
|
assertThrows(
|
|
|
|
() => writeFileSync(filename, data, { encoding: "utf16le" }),
|
|
|
|
'The value "utf16le" is invalid for option "encoding"',
|
|
|
|
);
|
|
|
|
},
|
|
|
|
);
|
2023-12-04 16:05:40 -05:00
|
|
|
|
|
|
|
Deno.test(
|
|
|
|
"[node/fs existsSync] path",
|
|
|
|
{ permissions: { read: true } },
|
|
|
|
() => {
|
chore: move cli/tests/ -> tests/ (#22369)
This looks like a massive PR, but it's only a move from cli/tests ->
tests, and updates of relative paths for files.
This is the first step towards aggregate all of the integration test
files under tests/, which will lead to a set of integration tests that
can run without the CLI binary being built.
While we could leave these tests under `cli`, it would require us to
keep a more complex directory structure for the various test runners. In
addition, we have a lot of complexity to ignore various test files in
the `cli` project itself (cargo publish exclusion rules, autotests =
false, etc).
And finally, the `tests/` folder will eventually house the `test_ffi`,
`test_napi` and other testing code, reducing the size of the root repo
directory.
For easier review, the extremely large and noisy "move" is in the first
commit (with no changes -- just a move), while the remainder of the
changes to actual files is in the second commit.
2024-02-10 15:22:13 -05:00
|
|
|
assert(existsSync("tests/testdata/assets/fixture.json"));
|
2023-12-04 16:05:40 -05:00
|
|
|
},
|
|
|
|
);
|
|
|
|
|
|
|
|
Deno.test(
|
|
|
|
"[node/fs existsSync] url",
|
|
|
|
{ permissions: { read: true } },
|
|
|
|
() => {
|
|
|
|
assert(existsSync(
|
chore: move cli/tests/ -> tests/ (#22369)
This looks like a massive PR, but it's only a move from cli/tests ->
tests, and updates of relative paths for files.
This is the first step towards aggregate all of the integration test
files under tests/, which will lead to a set of integration tests that
can run without the CLI binary being built.
While we could leave these tests under `cli`, it would require us to
keep a more complex directory structure for the various test runners. In
addition, we have a lot of complexity to ignore various test files in
the `cli` project itself (cargo publish exclusion rules, autotests =
false, etc).
And finally, the `tests/` folder will eventually house the `test_ffi`,
`test_napi` and other testing code, reducing the size of the root repo
directory.
For easier review, the extremely large and noisy "move" is in the first
commit (with no changes -- just a move), while the remainder of the
changes to actual files is in the second commit.
2024-02-10 15:22:13 -05:00
|
|
|
pathToAbsoluteFileUrl("tests/testdata/assets/fixture.json"),
|
2023-12-04 16:05:40 -05:00
|
|
|
));
|
|
|
|
},
|
|
|
|
);
|
|
|
|
|
|
|
|
Deno.test(
|
|
|
|
"[node/fs existsSync] no permission",
|
|
|
|
{ permissions: { read: false } },
|
|
|
|
() => {
|
|
|
|
assertThrows(() => {
|
chore: move cli/tests/ -> tests/ (#22369)
This looks like a massive PR, but it's only a move from cli/tests ->
tests, and updates of relative paths for files.
This is the first step towards aggregate all of the integration test
files under tests/, which will lead to a set of integration tests that
can run without the CLI binary being built.
While we could leave these tests under `cli`, it would require us to
keep a more complex directory structure for the various test runners. In
addition, we have a lot of complexity to ignore various test files in
the `cli` project itself (cargo publish exclusion rules, autotests =
false, etc).
And finally, the `tests/` folder will eventually house the `test_ffi`,
`test_napi` and other testing code, reducing the size of the root repo
directory.
For easier review, the extremely large and noisy "move" is in the first
commit (with no changes -- just a move), while the remainder of the
changes to actual files is in the second commit.
2024-02-10 15:22:13 -05:00
|
|
|
existsSync("tests/testdata/assets/fixture.json");
|
2023-12-04 16:05:40 -05:00
|
|
|
}, Deno.errors.PermissionDenied);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
|
|
|
|
Deno.test(
|
|
|
|
"[node/fs existsSync] not exists",
|
|
|
|
{ permissions: { read: true } },
|
|
|
|
() => {
|
|
|
|
assert(!existsSync("bad_filename"));
|
|
|
|
},
|
|
|
|
);
|
2024-01-21 15:48:48 -05:00
|
|
|
|
|
|
|
Deno.test(
|
|
|
|
"[node/fs/promises constants] is the same as from node:fs",
|
|
|
|
() => {
|
|
|
|
assertEquals(constants, fsPromiseConstants);
|
|
|
|
assertEquals(constants, promises.constants);
|
|
|
|
},
|
|
|
|
);
|
2024-02-06 02:02:58 -05:00
|
|
|
|
2024-03-06 07:59:10 -05:00
|
|
|
Deno.test(
|
|
|
|
"[node/fs statSync] instanceof fs.Stats",
|
|
|
|
() => {
|
|
|
|
const stat = statSync("tests/testdata/assets/fixture.json");
|
|
|
|
assert(stat);
|
|
|
|
assert(stat instanceof Stats);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
|
2024-02-06 02:02:58 -05:00
|
|
|
Deno.test(
|
|
|
|
"[node/fs/promises cp] copy file",
|
|
|
|
async () => {
|
|
|
|
const src = mkdtempSync(join(tmpdir(), "foo-")) + "/test.txt";
|
|
|
|
const dest = mkdtempSync(join(tmpdir(), "foo-")) + "/test.txt";
|
|
|
|
writeFileSync(src, "Hello");
|
|
|
|
|
|
|
|
await cp(src, dest);
|
|
|
|
|
|
|
|
const dataRead = readFileSync(dest, "utf8");
|
|
|
|
assert(dataRead === "Hello");
|
|
|
|
},
|
|
|
|
);
|
2024-04-07 23:47:34 -04:00
|
|
|
|
|
|
|
// TODO(kt3k): Delete this test case, and instead enable the compat case
|
|
|
|
// `test/parallel/test-fs-writestream-open-write.js`, when we update
|
|
|
|
// `tests/node_compat/runner/suite`.
|
|
|
|
Deno.test("[node/fs createWriteStream", async () => {
|
|
|
|
const { promise, resolve, reject } = Promise.withResolvers<void>();
|
|
|
|
const tempDir = await Deno.makeTempDir();
|
|
|
|
const file = join(tempDir, "file.txt");
|
|
|
|
try {
|
|
|
|
const w = createWriteStream(file);
|
|
|
|
|
|
|
|
w.on("open", () => {
|
|
|
|
w.write("hello, ");
|
|
|
|
|
|
|
|
process.nextTick(() => {
|
|
|
|
w.write("world");
|
|
|
|
w.end();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
w.on("close", async () => {
|
|
|
|
try {
|
|
|
|
assertEquals(await Deno.readTextFile(file), "hello, world");
|
|
|
|
resolve();
|
|
|
|
} catch (e) {
|
|
|
|
reject(e);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
await promise;
|
|
|
|
} finally {
|
|
|
|
await Deno.remove(tempDir, { recursive: true });
|
|
|
|
}
|
|
|
|
});
|
2024-05-28 06:24:54 -04:00
|
|
|
|
|
|
|
Deno.test(
|
|
|
|
"[node/fs lstatSync] supports throwIfNoEntry option",
|
|
|
|
() => {
|
|
|
|
const result = lstatSync("non-existing-path", { throwIfNoEntry: false });
|
|
|
|
assertEquals(result, undefined);
|
|
|
|
},
|
|
|
|
);
|
2024-05-28 08:30:31 -04:00
|
|
|
|
|
|
|
// Test for https://github.com/denoland/deno/issues/23707
|
|
|
|
Deno.test(
|
|
|
|
"[node/fs/promises read] respect position argument",
|
|
|
|
async () => {
|
|
|
|
const file = mkdtempSync(join(tmpdir(), "foo-")) + "/test.bin";
|
|
|
|
await writeFile(file, "");
|
|
|
|
|
|
|
|
const res: number[] = [];
|
|
|
|
let fd: FileHandle | undefined;
|
|
|
|
try {
|
|
|
|
fd = await open(file, "r+");
|
|
|
|
|
|
|
|
for (let i = 0; i <= 5; i++) {
|
|
|
|
const buffer = new Uint8Array([i]);
|
|
|
|
await fd.write(buffer, 0, 1, i + 10);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (let i = 10; i <= 15; i++) {
|
|
|
|
const buffer = new Uint8Array(1);
|
|
|
|
await fd.read(buffer, 0, 1, i);
|
|
|
|
res.push(Number(buffer.toString()));
|
|
|
|
}
|
|
|
|
} finally {
|
|
|
|
await fd?.close();
|
|
|
|
}
|
|
|
|
|
|
|
|
assertEquals(res, [0, 1, 2, 3, 4, 5]);
|
|
|
|
},
|
|
|
|
);
|