diff options
author | Nathan Whitaker <17734409+nathanwhit@users.noreply.github.com> | 2024-08-16 09:48:57 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-16 09:48:57 -0700 |
commit | ff4226a3cd20ef6cfb155ca206c745785b6e098f (patch) | |
tree | c845e539ec01f4261a7f824cb3d50f1b6e2d7ab4 /tests/unit_node/_fs/_fs_write_test.ts | |
parent | 4d1b263e91dc7b85e9c8cd1cb42270ddc0468396 (diff) |
fix(node/fs): Use correct offset and length in node:fs.read and write (#25049)
My fix in #25030 was buggy, I forgot to pass the `byteOffset` and
`byteLength`. Whoops.
I also discovered that fs.read was not respecting the `offset` argument,
and we were constructing a new `Buffer` for the callback instead of just
passing the original one (which is what node does, and the @types/node
definitions also indicate the callback should get the same type).
Fixes #25028.
Diffstat (limited to 'tests/unit_node/_fs/_fs_write_test.ts')
-rw-r--r-- | tests/unit_node/_fs/_fs_write_test.ts | 76 |
1 files changed, 50 insertions, 26 deletions
diff --git a/tests/unit_node/_fs/_fs_write_test.ts b/tests/unit_node/_fs/_fs_write_test.ts index 3ce030bc6..a140548e1 100644 --- a/tests/unit_node/_fs/_fs_write_test.ts +++ b/tests/unit_node/_fs/_fs_write_test.ts @@ -75,7 +75,7 @@ Deno.test({ }); Deno.test({ - name: "Accepts non Uint8Array buffer", + name: "write with offset TypedArray buffers", async fn() { const tempFile: string = Deno.makeTempFileSync(); using file = Deno.openSync(tempFile, { @@ -83,32 +83,56 @@ Deno.test({ write: true, read: true, }); + const arrayBuffer = new ArrayBuffer(128); + const resetBuffer = () => { + new Uint8Array(arrayBuffer).fill(0); + }; + const bufConstructors = [ + Int8Array, + Uint8Array, + ]; + const offsets = [0, 24, 48]; const bytes = [0, 1, 2, 3, 4]; - const buffer = new Int8Array(bytes); - for (let i = 0; i < buffer.length; i++) { - buffer[i] = i; + for (const constr of bufConstructors) { + // test combinations of buffers internally offset from their backing array buffer, + // and also offset in the write call + for (const innerOffset of offsets) { + for (const offset of offsets) { + resetBuffer(); + const buffer = new constr( + arrayBuffer, + innerOffset, + offset + bytes.length, + ); + for (let i = 0; i < bytes.length; i++) { + buffer[offset + i] = i; + } + let nWritten = writeSync(file.rid, buffer, offset, bytes.length, 0); + + let data = Deno.readFileSync(tempFile); + + assertEquals(nWritten, bytes.length); + console.log(constr, innerOffset, offset); + assertEquals(data, new Uint8Array(bytes)); + nWritten = await new Promise((resolve, reject) => + write( + file.rid, + buffer, + offset, + bytes.length, + 0, + (err: unknown, nwritten: number) => { + if (err) return reject(err); + resolve(nwritten); + }, + ) + ); + + data = Deno.readFileSync(tempFile); + assertEquals(nWritten, 5); + assertEquals(data, new Uint8Array(bytes)); + } + } } - let nWritten = writeSync(file.rid, buffer); - - const data = Deno.readFileSync(tempFile); - - assertEquals(nWritten, 5); - assertEquals(data, new Uint8Array(bytes)); - - nWritten = await new Promise((resolve, reject) => - write( - file.rid, - buffer, - 0, - 5, - (err: unknown, nwritten: number) => { - if (err) return reject(err); - resolve(nwritten); - }, - ) - ); - - assertEquals(nWritten, 5); - assertEquals(data, new Uint8Array(bytes)); }, }); |