summaryrefslogtreecommitdiff
path: root/tests/unit_node/_fs/_fs_write_test.ts
diff options
context:
space:
mode:
authorNathan Whitaker <17734409+nathanwhit@users.noreply.github.com>2024-08-16 09:48:57 -0700
committerGitHub <noreply@github.com>2024-08-16 09:48:57 -0700
commitff4226a3cd20ef6cfb155ca206c745785b6e098f (patch)
treec845e539ec01f4261a7f824cb3d50f1b6e2d7ab4 /tests/unit_node/_fs/_fs_write_test.ts
parent4d1b263e91dc7b85e9c8cd1cb42270ddc0468396 (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.ts76
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));
},
});