From 4e013565866b3a4c02214b392c4aca8a4e5e9a91 Mon Sep 17 00:00:00 2001 From: Kaique da Silva <44123854+ktfth@users.noreply.github.com> Date: Wed, 21 Jun 2023 14:11:06 -0300 Subject: [PATCH] test(ext/node): add fs open unit test from std (#19505) --- cli/tests/integration/node_unit_tests.rs | 1 + cli/tests/unit_node/_fs/_fs_open_test.ts | 400 +++++++++++++++++++++++ 2 files changed, 401 insertions(+) create mode 100644 cli/tests/unit_node/_fs/_fs_open_test.ts diff --git a/cli/tests/integration/node_unit_tests.rs b/cli/tests/integration/node_unit_tests.rs index 409ac6a560..e86135d020 100644 --- a/cli/tests/integration/node_unit_tests.rs +++ b/cli/tests/integration/node_unit_tests.rs @@ -20,6 +20,7 @@ util::unit_test_factory!( _fs_copy_test = _fs / _fs_copy_test, _fs_dir_test = _fs / _fs_dir_test, _fs_dirent_test = _fs / _fs_dirent_test, + _fs_open_test = _fs / _fs_open_test, _fs_exists_test = _fs / _fs_exists_test, _fs_fdatasync_test = _fs / _fs_fdatasync_test, _fs_fstat_test = _fs / _fs_fstat_test, diff --git a/cli/tests/unit_node/_fs/_fs_open_test.ts b/cli/tests/unit_node/_fs/_fs_open_test.ts new file mode 100644 index 0000000000..b64e6c4c56 --- /dev/null +++ b/cli/tests/unit_node/_fs/_fs_open_test.ts @@ -0,0 +1,400 @@ +// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. +import { + O_APPEND, + O_CREAT, + O_EXCL, + O_RDONLY, + O_RDWR, + O_SYNC, + O_TRUNC, + O_WRONLY, +} from "node:constants"; +import { + assert, + assertEquals, + assertThrows, + fail, +} from "../../../../test_util/std/testing/asserts.ts"; +import { assertCallbackErrorUncaught } from "../_test_utils.ts"; +import { open, openSync } from "node:fs"; +import { join, parse } from "node:path"; +import { closeSync, existsSync } from "node:fs"; + +const tempDir = parse(Deno.makeTempFileSync()).dir; + +Deno.test({ + name: "ASYNC: open file", + async fn() { + const file = Deno.makeTempFileSync(); + let fd1: number; + await new Promise((resolve, reject) => { + open(file, (err, fd) => { + if (err) reject(err); + resolve(fd); + }); + }) + .then((fd) => { + fd1 = fd; + assert(Deno.resources()[fd], `${fd}`); + }, () => fail()) + .finally(() => closeSync(fd1)); + }, +}); + +Deno.test({ + name: "SYNC: open file", + fn() { + const file = Deno.makeTempFileSync(); + const fd = openSync(file, "r"); + assert(Deno.resources()[fd]); + closeSync(fd); + }, +}); + +Deno.test({ + name: "open with string flag 'a'", + fn() { + const file = join(tempDir, "some_random_file"); + const fd = openSync(file, "a"); + assertEquals(typeof fd, "number"); + assertEquals(existsSync(file), true); + assert(Deno.resources()[fd]); + closeSync(fd); + }, +}); + +Deno.test({ + name: "open with string flag 'ax'", + fn() { + const file = Deno.makeTempFileSync(); + assertThrows( + () => { + openSync(file, "ax"); + }, + Error, + `EEXIST: file already exists, open '${file}'`, + ); + Deno.removeSync(file); + }, +}); + +Deno.test({ + name: "open with string flag 'a+'", + fn() { + const file = join(tempDir, "some_random_file2"); + const fd = openSync(file, "a+"); + assertEquals(typeof fd, "number"); + assertEquals(existsSync(file), true); + closeSync(fd); + }, +}); + +Deno.test({ + name: "open with string flag 'ax+'", + fn() { + const file = Deno.makeTempFileSync(); + assertThrows( + () => { + openSync(file, "ax+"); + }, + Error, + `EEXIST: file already exists, open '${file}'`, + ); + Deno.removeSync(file); + }, +}); + +Deno.test({ + name: "open with string flag 'as'", + fn() { + const file = join(tempDir, "some_random_file10"); + const fd = openSync(file, "as"); + assertEquals(existsSync(file), true); + assertEquals(typeof fd, "number"); + closeSync(fd); + }, +}); + +Deno.test({ + name: "open with string flag 'as+'", + fn() { + const file = join(tempDir, "some_random_file10"); + const fd = openSync(file, "as+"); + assertEquals(existsSync(file), true); + assertEquals(typeof fd, "number"); + closeSync(fd); + }, +}); + +Deno.test({ + name: "open with string flag 'r'", + fn() { + const file = join(tempDir, "some_random_file3"); + assertThrows(() => { + openSync(file, "r"); + }, Error); + }, +}); + +Deno.test({ + name: "open with string flag 'r+'", + fn() { + const file = join(tempDir, "some_random_file4"); + assertThrows(() => { + openSync(file, "r+"); + }, Error); + }, +}); + +Deno.test({ + name: "open with string flag 'w'", + fn() { + const file = Deno.makeTempFileSync(); + Deno.writeTextFileSync(file, "hi there"); + const fd = openSync(file, "w"); + assertEquals(typeof fd, "number"); + assertEquals(Deno.readTextFileSync(file), ""); + closeSync(fd); + + const file2 = join(tempDir, "some_random_file5"); + const fd2 = openSync(file2, "w"); + assertEquals(typeof fd2, "number"); + assertEquals(existsSync(file2), true); + closeSync(fd2); + }, +}); + +Deno.test({ + name: "open with string flag 'wx'", + fn() { + const file = Deno.makeTempFileSync(); + Deno.writeTextFileSync(file, "hi there"); + const fd = openSync(file, "w"); + assertEquals(typeof fd, "number"); + assertEquals(Deno.readTextFileSync(file), ""); + closeSync(fd); + + const file2 = Deno.makeTempFileSync(); + assertThrows( + () => { + openSync(file2, "wx"); + }, + Error, + `EEXIST: file already exists, open '${file2}'`, + ); + }, +}); + +Deno.test({ + name: "open with string flag 'w+'", + fn() { + const file = Deno.makeTempFileSync(); + Deno.writeTextFileSync(file, "hi there"); + const fd = openSync(file, "w+"); + assertEquals(typeof fd, "number"); + assertEquals(Deno.readTextFileSync(file), ""); + closeSync(fd); + + const file2 = join(tempDir, "some_random_file6"); + const fd2 = openSync(file2, "w+"); + assertEquals(typeof fd2, "number"); + assertEquals(existsSync(file2), true); + closeSync(fd2); + }, +}); + +Deno.test({ + name: "open with string flag 'wx+'", + fn() { + const file = Deno.makeTempFileSync(); + assertThrows( + () => { + openSync(file, "wx+"); + }, + Error, + `EEXIST: file already exists, open '${file}'`, + ); + Deno.removeSync(file); + }, +}); + +Deno.test({ + name: "open with numeric flag `O_APPEND | O_CREAT | O_WRONLY` ('a')", + fn() { + const file = join(tempDir, "some_random_file"); + const fd = openSync(file, O_APPEND | O_CREAT | O_WRONLY); + assertEquals(typeof fd, "number"); + assertEquals(existsSync(file), true); + assert(Deno.resources()[fd]); + closeSync(fd); + }, +}); + +Deno.test({ + name: + "open with numeric flag `O_APPEND | O_CREAT | O_WRONLY | O_EXCL` ('ax')", + fn() { + const file = Deno.makeTempFileSync(); + assertThrows( + () => { + openSync(file, O_APPEND | O_CREAT | O_WRONLY | O_EXCL); + }, + Error, + `EEXIST: file already exists, open '${file}'`, + ); + Deno.removeSync(file); + }, +}); + +Deno.test({ + name: "open with numeric flag `O_APPEND | O_CREAT | O_RDWR` ('a+')", + fn() { + const file = join(tempDir, "some_random_file2"); + const fd = openSync(file, O_APPEND | O_CREAT | O_RDWR); + assertEquals(typeof fd, "number"); + assertEquals(existsSync(file), true); + closeSync(fd); + }, +}); + +Deno.test({ + name: "open with numeric flag `O_APPEND | O_CREAT | O_RDWR | O_EXCL` ('ax+')", + fn() { + const file = Deno.makeTempFileSync(); + assertThrows( + () => { + openSync(file, O_APPEND | O_CREAT | O_RDWR | O_EXCL); + }, + Error, + `EEXIST: file already exists, open '${file}'`, + ); + Deno.removeSync(file); + }, +}); + +Deno.test({ + name: + "open with numeric flag `O_APPEND | O_CREAT | O_WRONLY | O_SYNC` ('as')", + fn() { + const file = join(tempDir, "some_random_file10"); + const fd = openSync(file, O_APPEND | O_CREAT | O_WRONLY | O_SYNC); + assertEquals(existsSync(file), true); + assertEquals(typeof fd, "number"); + closeSync(fd); + }, +}); + +Deno.test({ + name: "open with numeric flag `O_APPEND | O_CREAT | O_RDWR | O_SYNC` ('as+')", + fn() { + const file = join(tempDir, "some_random_file10"); + const fd = openSync(file, O_APPEND | O_CREAT | O_RDWR | O_SYNC); + assertEquals(existsSync(file), true); + assertEquals(typeof fd, "number"); + closeSync(fd); + }, +}); + +Deno.test({ + name: "open with numeric flag `O_RDONLY` ('r')", + fn() { + const file = join(tempDir, "some_random_file3"); + assertThrows(() => { + openSync(file, O_RDONLY); + }, Error); + }, +}); + +Deno.test({ + name: "open with numeric flag `O_RDWR` ('r+')", + fn() { + const file = join(tempDir, "some_random_file4"); + assertThrows(() => { + openSync(file, O_RDWR); + }, Error); + }, +}); + +Deno.test({ + name: "open with numeric flag `O_TRUNC | O_CREAT | O_WRONLY` ('w')", + fn() { + const file = Deno.makeTempFileSync(); + Deno.writeTextFileSync(file, "hi there"); + const fd = openSync(file, O_TRUNC | O_CREAT | O_WRONLY); + assertEquals(typeof fd, "number"); + assertEquals(Deno.readTextFileSync(file), ""); + closeSync(fd); + + const file2 = join(tempDir, "some_random_file5"); + const fd2 = openSync(file2, O_TRUNC | O_CREAT | O_WRONLY); + assertEquals(typeof fd2, "number"); + assertEquals(existsSync(file2), true); + closeSync(fd2); + }, +}); + +Deno.test({ + name: "open with numeric flag `O_TRUNC | O_CREAT | O_WRONLY | O_EXCL` ('wx')", + fn() { + const file = Deno.makeTempFileSync(); + Deno.writeTextFileSync(file, "hi there"); + const fd = openSync(file, "w"); + assertEquals(typeof fd, "number"); + assertEquals(Deno.readTextFileSync(file), ""); + closeSync(fd); + + const file2 = Deno.makeTempFileSync(); + assertThrows( + () => { + openSync(file2, O_TRUNC | O_CREAT | O_WRONLY | O_EXCL); + }, + Error, + `EEXIST: file already exists, open '${file2}'`, + ); + }, +}); + +Deno.test({ + name: "open with numeric flag `O_TRUNC | O_CREAT | O_RDWR` ('w+')", + fn() { + const file = Deno.makeTempFileSync(); + Deno.writeTextFileSync(file, "hi there"); + const fd = openSync(file, O_TRUNC | O_CREAT | O_RDWR); + assertEquals(typeof fd, "number"); + assertEquals(Deno.readTextFileSync(file), ""); + closeSync(fd); + + const file2 = join(tempDir, "some_random_file6"); + const fd2 = openSync(file2, O_TRUNC | O_CREAT | O_RDWR); + assertEquals(typeof fd2, "number"); + assertEquals(existsSync(file2), true); + closeSync(fd2); + }, +}); + +Deno.test({ + name: "open with numeric flag `O_TRUNC | O_CREAT | O_RDWR | O_EXCL` ('wx+')", + fn() { + const file = Deno.makeTempFileSync(); + assertThrows( + () => { + openSync(file, O_TRUNC | O_CREAT | O_RDWR | O_EXCL); + }, + Error, + `EEXIST: file already exists, open '${file}'`, + ); + Deno.removeSync(file); + }, +}); + +Deno.test("[std/node/fs] open callback isn't called twice if error is thrown", async () => { + const tempFile = await Deno.makeTempFile(); + const importUrl = new URL("node:fs", import.meta.url); + await assertCallbackErrorUncaught({ + prelude: `import { open } from ${JSON.stringify(importUrl)}`, + invocation: `open(${JSON.stringify(tempFile)}, `, + async cleanup() { + await Deno.remove(tempFile); + }, + }); +});