From 0f7e2c0bb58d3a089e8cc98107e56cea349c1744 Mon Sep 17 00:00:00 2001 From: Nikola Glavina Date: Sat, 14 Nov 2020 01:53:49 +0100 Subject: [PATCH] fs: filehandle read now accepts object as argument PR-URL: https://github.com/nodejs/node/pull/34180 Fixes: https://github.com/nodejs/node/issues/34176 Refs: https://nodejs.org/api/fs.html#fs_filehandle_read_options Reviewed-By: Zeyu Yang Reviewed-By: Antoine du Hamel --- lib/internal/fs/promises.js | 15 ++++++++-- .../test-fs-promises-file-handle-read.js | 29 ++++++++++++++----- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/lib/internal/fs/promises.js b/lib/internal/fs/promises.js index bec0b5ebbc64e2..1f81a6f47b1d59 100644 --- a/lib/internal/fs/promises.js +++ b/lib/internal/fs/promises.js @@ -322,8 +322,19 @@ async function open(path, flags, mode) { flagsNumber, mode, kUsePromises)); } -async function read(handle, buffer, offset, length, position) { - validateBuffer(buffer); +async function read(handle, bufferOrOptions, offset, length, position) { + let buffer = bufferOrOptions; + if (!isArrayBufferView(buffer)) { + if (bufferOrOptions.buffer) { + buffer = bufferOrOptions.buffer; + validateBuffer(buffer); + } else { + buffer = Buffer.alloc(16384); + } + offset = bufferOrOptions.offset || 0; + length = buffer.length; + position = bufferOrOptions.position || null; + } if (offset == null) { offset = 0; diff --git a/test/parallel/test-fs-promises-file-handle-read.js b/test/parallel/test-fs-promises-file-handle-read.js index 5ba7fc63e3f44d..44c35840f283ed 100644 --- a/test/parallel/test-fs-promises-file-handle-read.js +++ b/test/parallel/test-fs-promises-file-handle-read.js @@ -13,7 +13,11 @@ const tmpdir = require('../common/tmpdir'); const assert = require('assert'); const tmpDir = tmpdir.path; -tmpdir.refresh(); +async function read(fileHandle, buffer, offset, length, position) { + return useConf ? + fileHandle.read({ buffer, offset, length, position }) : + fileHandle.read(buffer, offset, length, position); +} async function validateRead() { const filePath = path.resolve(tmpDir, 'tmp-read-file.txt'); @@ -23,7 +27,7 @@ async function validateRead() { const fd = fs.openSync(filePath, 'w+'); fs.writeSync(fd, buffer, 0, buffer.length); fs.closeSync(fd); - const readAsyncHandle = await fileHandle.read(Buffer.alloc(11), 0, 11, 0); + const readAsyncHandle = await read(fileHandle, Buffer.alloc(11), 0, 11, 0); assert.deepStrictEqual(buffer.length, readAsyncHandle.bytesRead); assert.deepStrictEqual(buffer, readAsyncHandle.buffer); @@ -38,7 +42,7 @@ async function validateEmptyRead() { const fd = fs.openSync(filePath, 'w+'); fs.writeSync(fd, buffer, 0, buffer.length); fs.closeSync(fd); - const readAsyncHandle = await fileHandle.read(Buffer.alloc(11), 0, 11, 0); + const readAsyncHandle = await read(fileHandle, Buffer.alloc(11), 0, 11, 0); assert.deepStrictEqual(buffer.length, readAsyncHandle.bytesRead); await fileHandle.close(); @@ -51,12 +55,21 @@ async function validateLargeRead() { const filePath = fixtures.path('x.txt'); const fileHandle = await open(filePath, 'r'); const pos = 0xffffffff + 1; // max-uint32 + 1 - const readHandle = await fileHandle.read(Buffer.alloc(1), 0, 1, pos); + const readHandle = await read(fileHandle, Buffer.alloc(1), 0, 1, pos); assert.strictEqual(readHandle.bytesRead, 0); } -validateRead() - .then(validateEmptyRead) - .then(validateLargeRead) - .then(common.mustCall()); +let useConf = false; + +(async function() { + for (const value of [false, true]) { + tmpdir.refresh(); + useConf = value; + + await validateRead() + .then(validateEmptyRead) + .then(validateLargeRead) + .then(common.mustCall()); + } +});