diff options
author | Marvin Hagemeister <marvin@deno.com> | 2024-05-28 14:30:31 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-28 14:30:31 +0200 |
commit | 8c9d1ba1d719c97daabe1adf77e30f746b4edf44 (patch) | |
tree | 9c2229a6ca91751eaf63f9d64da5dbfbc8d0883e /tests/unit_node | |
parent | adbd564758d0f596cee5f23054b24571328bb5d6 (diff) |
fix(ext/node/fs): `position` argument not applied (#24009)
We didn't honour the `position` options of `fd.read` and `fd.write`
because we checked if the buffer is of type `Buffer` instead of just
`Uint8Array`. Node does the latter. In doing so I noticed that the file
handle id was written to a public property which it definitely shouldn't
be. This was probably a typo.
Fixes https://github.com/denoland/deno/issues/23707
Diffstat (limited to 'tests/unit_node')
-rw-r--r-- | tests/unit_node/_fs/_fs_write_test.ts | 24 | ||||
-rw-r--r-- | tests/unit_node/fs_test.ts | 38 |
2 files changed, 61 insertions, 1 deletions
diff --git a/tests/unit_node/_fs/_fs_write_test.ts b/tests/unit_node/_fs/_fs_write_test.ts index 43bc7a10e..148bc40e7 100644 --- a/tests/unit_node/_fs/_fs_write_test.ts +++ b/tests/unit_node/_fs/_fs_write_test.ts @@ -49,3 +49,27 @@ Deno.test({ assertEquals(decoder.decode(data), "hello"); }, }); + +Deno.test({ + name: "Data is padded if position > length", + async fn() { + const tempFile: string = Deno.makeTempFileSync(); + + using file = await Deno.open(tempFile, { + create: true, + write: true, + read: true, + }); + + const str = "hello world"; + const buffer = Buffer.from(str); + const bytesWritten = writeSync(file.rid, buffer, 0, str.length, 4); + + const data = Deno.readFileSync(tempFile); + Deno.removeSync(tempFile); + + assertEquals(bytesWritten, str.length); + // Check if result is padded + assertEquals(decoder.decode(data), "\x00\x00\x00\x00hello world"); + }, +}); diff --git a/tests/unit_node/fs_test.ts b/tests/unit_node/fs_test.ts index a241189a5..1b121c71f 100644 --- a/tests/unit_node/fs_test.ts +++ b/tests/unit_node/fs_test.ts @@ -15,7 +15,13 @@ import { statSync, writeFileSync, } from "node:fs"; -import { constants as fsPromiseConstants, cp } from "node:fs/promises"; +import { + constants as fsPromiseConstants, + cp, + FileHandle, + open, + writeFile, +} from "node:fs/promises"; import process from "node:process"; import { pathToAbsoluteFileUrl } from "../unit/test_util.ts"; @@ -165,3 +171,33 @@ Deno.test( assertEquals(result, undefined); }, ); + +// 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]); + }, +); |