Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 81 additions & 0 deletions test/parallel/test-fs-promises-file-handle-pipeto.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
const {

Check failure on line 1 in test/parallel/test-fs-promises-file-handle-pipeto.js

View workflow job for this annotation

GitHub Actions / lint-js-and-md

Mandatory module "common" must be loaded before any other modules

Check failure on line 1 in test/parallel/test-fs-promises-file-handle-pipeto.js

View workflow job for this annotation

GitHub Actions / lint-js-and-md

Mandatory module "common" must be loaded

Check failure on line 1 in test/parallel/test-fs-promises-file-handle-pipeto.js

View workflow job for this annotation

GitHub Actions / lint-js-and-md

Use the global form of 'use strict'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These need the 'use strict'; at the top and the require('../common')

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These should be caught by running make lint

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!!!! I'll do that!!

pipeTo
} = require('stream/iter');

Check failure on line 3 in test/parallel/test-fs-promises-file-handle-pipeto.js

View workflow job for this annotation

GitHub Actions / aarch64-linux: with shared openssl-3.6.3 / build

--- stderr --- node:internal/modules/cjs/loader:1576 throw err; ^ Error: Cannot find module 'stream/iter' Require stack: - /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js at Module._resolveFilename (node:internal/modules/cjs/loader:1572:15) at wrapResolveFilename (node:internal/modules/cjs/loader:1126:27) at defaultResolveImplForCJSLoading (node:internal/modules/cjs/loader:1150:10) at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1177:12) at Module._load (node:internal/modules/cjs/loader:1349:5) at wrapModuleLoad (node:internal/modules/cjs/loader:261:19) at Module.require (node:internal/modules/cjs/loader:1682:12) at require (node:internal/modules/helpers:196:16) at Object.<anonymous> (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js:3:5) at Module._compile (node:internal/modules/cjs/loader:1937:14) { code: 'MODULE_NOT_FOUND', requireStack: [ '/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js' ] } Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js

Check failure on line 3 in test/parallel/test-fs-promises-file-handle-pipeto.js

View workflow job for this annotation

GitHub Actions / aarch64-linux: with shared openssl-4.0.1 / build

--- stderr --- node:internal/modules/cjs/loader:1576 throw err; ^ Error: Cannot find module 'stream/iter' Require stack: - /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js at Module._resolveFilename (node:internal/modules/cjs/loader:1572:15) at wrapResolveFilename (node:internal/modules/cjs/loader:1126:27) at defaultResolveImplForCJSLoading (node:internal/modules/cjs/loader:1150:10) at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1177:12) at Module._load (node:internal/modules/cjs/loader:1349:5) at wrapModuleLoad (node:internal/modules/cjs/loader:261:19) at Module.require (node:internal/modules/cjs/loader:1682:12) at require (node:internal/modules/helpers:196:16) at Object.<anonymous> (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js:3:5) at Module._compile (node:internal/modules/cjs/loader:1937:14) { code: 'MODULE_NOT_FOUND', requireStack: [ '/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js' ] } Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js

Check failure on line 3 in test/parallel/test-fs-promises-file-handle-pipeto.js

View workflow job for this annotation

GitHub Actions / aarch64-linux: with shared boringssl-0.20260803.0 / build

--- stderr --- node:internal/modules/cjs/loader:1576 throw err; ^ Error: Cannot find module 'stream/iter' Require stack: - /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js at Module._resolveFilename (node:internal/modules/cjs/loader:1572:15) at wrapResolveFilename (node:internal/modules/cjs/loader:1126:27) at defaultResolveImplForCJSLoading (node:internal/modules/cjs/loader:1150:10) at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1177:12) at Module._load (node:internal/modules/cjs/loader:1349:5) at wrapModuleLoad (node:internal/modules/cjs/loader:261:19) at Module.require (node:internal/modules/cjs/loader:1682:12) at require (node:internal/modules/helpers:196:16) at Object.<anonymous> (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js:3:5) at Module._compile (node:internal/modules/cjs/loader:1937:14) { code: 'MODULE_NOT_FOUND', requireStack: [ '/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js' ] } Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js

Check failure on line 3 in test/parallel/test-fs-promises-file-handle-pipeto.js

View workflow job for this annotation

GitHub Actions / aarch64-linux: with shared openssl-3.0.21 / build

--- stderr --- node:internal/modules/cjs/loader:1576 throw err; ^ Error: Cannot find module 'stream/iter' Require stack: - /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js at Module._resolveFilename (node:internal/modules/cjs/loader:1572:15) at wrapResolveFilename (node:internal/modules/cjs/loader:1126:27) at defaultResolveImplForCJSLoading (node:internal/modules/cjs/loader:1150:10) at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1177:12) at Module._load (node:internal/modules/cjs/loader:1349:5) at wrapModuleLoad (node:internal/modules/cjs/loader:261:19) at Module.require (node:internal/modules/cjs/loader:1682:12) at require (node:internal/modules/helpers:196:16) at Object.<anonymous> (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js:3:5) at Module._compile (node:internal/modules/cjs/loader:1937:14) { code: 'MODULE_NOT_FOUND', requireStack: [ '/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js' ] } Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js

Check failure on line 3 in test/parallel/test-fs-promises-file-handle-pipeto.js

View workflow job for this annotation

GitHub Actions / aarch64-darwin: with shared libraries / build

--- stderr --- node:internal/modules/cjs/loader:1576 throw err; ^ Error: Cannot find module 'stream/iter' Require stack: - /Users/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js at Module._resolveFilename (node:internal/modules/cjs/loader:1572:15) at wrapResolveFilename (node:internal/modules/cjs/loader:1126:27) at defaultResolveImplForCJSLoading (node:internal/modules/cjs/loader:1150:10) at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1177:12) at Module._load (node:internal/modules/cjs/loader:1349:5) at wrapModuleLoad (node:internal/modules/cjs/loader:261:19) at Module.require (node:internal/modules/cjs/loader:1682:12) at require (node:internal/modules/helpers:196:16) at Object.<anonymous> (/Users/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js:3:5) at Module._compile (node:internal/modules/cjs/loader:1937:14) { code: 'MODULE_NOT_FOUND', requireStack: [ '/Users/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js' ] } Node.js v27.0.0-pre Command: out/Release/node /Users/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js

Check failure on line 3 in test/parallel/test-fs-promises-file-handle-pipeto.js

View workflow job for this annotation

GitHub Actions / aarch64-linux: with shared openssl-3.5.7 / build

--- stderr --- node:internal/modules/cjs/loader:1576 throw err; ^ Error: Cannot find module 'stream/iter' Require stack: - /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js at Module._resolveFilename (node:internal/modules/cjs/loader:1572:15) at wrapResolveFilename (node:internal/modules/cjs/loader:1126:27) at defaultResolveImplForCJSLoading (node:internal/modules/cjs/loader:1150:10) at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1177:12) at Module._load (node:internal/modules/cjs/loader:1349:5) at wrapModuleLoad (node:internal/modules/cjs/loader:261:19) at Module.require (node:internal/modules/cjs/loader:1682:12) at require (node:internal/modules/helpers:196:16) at Object.<anonymous> (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js:3:5) at Module._compile (node:internal/modules/cjs/loader:1937:14) { code: 'MODULE_NOT_FOUND', requireStack: [ '/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js' ] } Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js

Check failure on line 3 in test/parallel/test-fs-promises-file-handle-pipeto.js

View workflow job for this annotation

GitHub Actions / aarch64-linux: with shared openssl-fips-3.5.7 / build

--- stderr --- node:internal/modules/cjs/loader:1576 throw err; ^ Error: Cannot find module 'stream/iter' Require stack: - /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js at Module._resolveFilename (node:internal/modules/cjs/loader:1572:15) at wrapResolveFilename (node:internal/modules/cjs/loader:1126:27) at defaultResolveImplForCJSLoading (node:internal/modules/cjs/loader:1150:10) at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1177:12) at Module._load (node:internal/modules/cjs/loader:1349:5) at wrapModuleLoad (node:internal/modules/cjs/loader:261:19) at Module.require (node:internal/modules/cjs/loader:1682:12) at require (node:internal/modules/helpers:196:16) at Object.<anonymous> (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js:3:5) at Module._compile (node:internal/modules/cjs/loader:1937:14) { code: 'MODULE_NOT_FOUND', requireStack: [ '/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js' ] } Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js

Check failure on line 3 in test/parallel/test-fs-promises-file-handle-pipeto.js

View workflow job for this annotation

GitHub Actions / x86_64-linux: with shared libraries and perfetto / build

--- stderr --- node:internal/modules/cjs/loader:1576 throw err; ^ Error: Cannot find module 'stream/iter' Require stack: - /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js at Module._resolveFilename (node:internal/modules/cjs/loader:1572:15) at wrapResolveFilename (node:internal/modules/cjs/loader:1126:27) at defaultResolveImplForCJSLoading (node:internal/modules/cjs/loader:1150:10) at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1177:12) at Module._load (node:internal/modules/cjs/loader:1349:5) at wrapModuleLoad (node:internal/modules/cjs/loader:261:19) at Module.require (node:internal/modules/cjs/loader:1682:12) at require (node:internal/modules/helpers:196:16) at Object.<anonymous> (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js:3:5) at Module._compile (node:internal/modules/cjs/loader:1937:14) { code: 'MODULE_NOT_FOUND', requireStack: [ '/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js' ] } Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js

Check failure on line 3 in test/parallel/test-fs-promises-file-handle-pipeto.js

View workflow job for this annotation

GitHub Actions / test-linux (ubuntu-24.04-arm)

--- stderr --- node:internal/modules/cjs/loader:1576 throw err; ^ Error: Cannot find module 'stream/iter' Require stack: - /home/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-pipeto.js at Module._resolveFilename (node:internal/modules/cjs/loader:1572:15) at wrapResolveFilename (node:internal/modules/cjs/loader:1126:27) at defaultResolveImplForCJSLoading (node:internal/modules/cjs/loader:1150:10) at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1177:12) at Module._load (node:internal/modules/cjs/loader:1349:5) at wrapModuleLoad (node:internal/modules/cjs/loader:261:19) at Module.require (node:internal/modules/cjs/loader:1682:12) at require (node:internal/modules/helpers:196:16) at Object.<anonymous> (/home/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-pipeto.js:3:5) at Module._compile (node:internal/modules/cjs/loader:1937:14) { code: 'MODULE_NOT_FOUND', requireStack: [ '/home/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-pipeto.js' ] } Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-pipeto.js

Check failure on line 3 in test/parallel/test-fs-promises-file-handle-pipeto.js

View workflow job for this annotation

GitHub Actions / test-linux (ubuntu-24.04)

--- stderr --- node:internal/modules/cjs/loader:1576 throw err; ^ Error: Cannot find module 'stream/iter' Require stack: - /home/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-pipeto.js at Module._resolveFilename (node:internal/modules/cjs/loader:1572:15) at wrapResolveFilename (node:internal/modules/cjs/loader:1126:27) at defaultResolveImplForCJSLoading (node:internal/modules/cjs/loader:1150:10) at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1177:12) at Module._load (node:internal/modules/cjs/loader:1349:5) at wrapModuleLoad (node:internal/modules/cjs/loader:261:19) at Module.require (node:internal/modules/cjs/loader:1682:12) at require (node:internal/modules/helpers:196:16) at Object.<anonymous> (/home/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-pipeto.js:3:5) at Module._compile (node:internal/modules/cjs/loader:1937:14) { code: 'MODULE_NOT_FOUND', requireStack: [ '/home/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-pipeto.js' ] } Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-pipeto.js

Check failure on line 3 in test/parallel/test-fs-promises-file-handle-pipeto.js

View workflow job for this annotation

GitHub Actions / x86_64-darwin: with shared libraries / build

--- stderr --- node:internal/modules/cjs/loader:1576 throw err; ^ Error: Cannot find module 'stream/iter' Require stack: - /Users/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js at Module._resolveFilename (node:internal/modules/cjs/loader:1572:15) at wrapResolveFilename (node:internal/modules/cjs/loader:1126:27) at defaultResolveImplForCJSLoading (node:internal/modules/cjs/loader:1150:10) at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1177:12) at Module._load (node:internal/modules/cjs/loader:1349:5) at wrapModuleLoad (node:internal/modules/cjs/loader:261:19) at Module.require (node:internal/modules/cjs/loader:1682:12) at require (node:internal/modules/helpers:196:16) at Object.<anonymous> (/Users/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js:3:5) at Module._compile (node:internal/modules/cjs/loader:1937:14) { code: 'MODULE_NOT_FOUND', requireStack: [ '/Users/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js' ] } Node.js v27.0.0-pre Command: out/Release/node /Users/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-pipeto.js

Check failure on line 3 in test/parallel/test-fs-promises-file-handle-pipeto.js

View workflow job for this annotation

GitHub Actions / test-macOS

--- stderr --- node:internal/modules/cjs/loader:1576 throw err; ^ Error: Cannot find module 'stream/iter' Require stack: - /Users/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-pipeto.js at Module._resolveFilename (node:internal/modules/cjs/loader:1572:15) at wrapResolveFilename (node:internal/modules/cjs/loader:1126:27) at defaultResolveImplForCJSLoading (node:internal/modules/cjs/loader:1150:10) at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1177:12) at Module._load (node:internal/modules/cjs/loader:1349:5) at wrapModuleLoad (node:internal/modules/cjs/loader:261:19) at Module.require (node:internal/modules/cjs/loader:1682:12) at require (node:internal/modules/helpers:196:16) at Object.<anonymous> (/Users/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-pipeto.js:3:5) at Module._compile (node:internal/modules/cjs/loader:1937:14) { code: 'MODULE_NOT_FOUND', requireStack: [ '/Users/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-pipeto.js' ] } Node.js v27.0.0-pre Command: out/Release/node /Users/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-pipeto.js
const { open } = fs.promises;

Check failure on line 4 in test/parallel/test-fs-promises-file-handle-pipeto.js

View workflow job for this annotation

GitHub Actions / lint-js-and-md

'fs' was used before it was defined
const fs = require('fs');
const path = require('path');
const assert = require('assert');

const tmpdir = require('../common/tmpdir');

tmpdir.refresh();

const tmpDir = tmpdir.path;


// =============================================================================
// pipeTo() with transforms - uppercase through writer
// =============================================================================

async function testPipeToWithTransform() {
const srcPath = path.join(tmpDir, 'writer-transform-src.txt');
const dstPath = path.join(tmpDir, 'writer-transform-dst.txt');
const data = 'hello world from transforms test\n'.repeat(200);
fs.writeFileSync(srcPath, data);

function uppercase(chunks) {
if (chunks === null) return null;
const out = new Array(chunks.length);
for (let i = 0; i < chunks.length; i++) {
const src = chunks[i];
const buf = Buffer.allocUnsafe(src.length);
for (let j = 0; j < src.length; j++) {
const b = src[j];
buf[j] = (b >= 0x61 && b <= 0x7a) ? b - 0x20 : b;
}
out[i] = buf;
}
return out;
}

const rfh = await open(srcPath, 'r');
const wfh = await open(dstPath, 'w');
const w = wfh.writer();

await pipeTo(rfh.pull(), uppercase, w);

await rfh.close();
await wfh.close();

assert.strictEqual(fs.readFileSync(dstPath, 'utf8'), data.toUpperCase());
}


// =============================================================================
// pipeTo() integration - pipe source through writer
// =============================================================================

async function testPipeToIntegration() {
const srcPath = path.join(tmpDir, 'writer-pipeto-src.txt');
const dstPath = path.join(tmpDir, 'writer-pipeto-dst.txt');
const data = 'The quick brown fox jumps over the lazy dog.\n'.repeat(500);
fs.writeFileSync(srcPath, data);

const rfh = await open(srcPath, 'r');
const wfh = await open(dstPath, 'w');
const w = wfh.writer();

const totalBytes = await pipeTo(rfh.pull(), w);

await rfh.close();
await wfh.close();

assert.strictEqual(totalBytes, Buffer.byteLength(data));
assert.strictEqual(fs.readFileSync(dstPath, 'utf8'), data);
}


Promise.all([
testPipeToIntegration(),
testPipeToWithTransform(),
]).then(common.mustCall());

Check failure on line 81 in test/parallel/test-fs-promises-file-handle-pipeto.js

View workflow job for this annotation

GitHub Actions / lint-js-and-md

'common' is not defined
77 changes: 77 additions & 0 deletions test/parallel/test-fs-promises-file-handle-writer-abort.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
'use strict';

const common = require('../common');
const assert = require('assert');
const fs = require('fs');
const { open } = fs.promises;
const path = require('path');
const tmpdir = require('../common/tmpdir');

tmpdir.refresh();

const tmpDir = tmpdir.path;

// =============================================================================
// Pre-aborted signal rejects write/writev/end
// =============================================================================

async function testWriteWithAbortedSignalRejects() {
const filePath = path.join(tmpDir, 'writer-signal-write.txt');
const fh = await open(filePath, 'w');
const w = fh.writer();

Check failure on line 21 in test/parallel/test-fs-promises-file-handle-writer-abort.js

View workflow job for this annotation

GitHub Actions / aarch64-linux: with shared openssl-3.6.3 / build

--- stderr --- /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js:21 const w = fh.writer(); ^ TypeError: fh.writer is not a function at testWriteWithAbortedSignalRejects (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js:21:16) at async Promise.all (index 0) Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js

Check failure on line 21 in test/parallel/test-fs-promises-file-handle-writer-abort.js

View workflow job for this annotation

GitHub Actions / aarch64-linux: with shared openssl-4.0.1 / build

--- stderr --- /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js:21 const w = fh.writer(); ^ TypeError: fh.writer is not a function at testWriteWithAbortedSignalRejects (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js:21:16) at async Promise.all (index 0) Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js

Check failure on line 21 in test/parallel/test-fs-promises-file-handle-writer-abort.js

View workflow job for this annotation

GitHub Actions / aarch64-linux: with shared boringssl-0.20260803.0 / build

--- stderr --- /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js:21 const w = fh.writer(); ^ TypeError: fh.writer is not a function at testWriteWithAbortedSignalRejects (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js:21:16) at async Promise.all (index 0) Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js

Check failure on line 21 in test/parallel/test-fs-promises-file-handle-writer-abort.js

View workflow job for this annotation

GitHub Actions / aarch64-linux: with shared openssl-3.0.21 / build

--- stderr --- /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js:21 const w = fh.writer(); ^ TypeError: fh.writer is not a function at testWriteWithAbortedSignalRejects (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js:21:16) at async Promise.all (index 0) Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js

Check failure on line 21 in test/parallel/test-fs-promises-file-handle-writer-abort.js

View workflow job for this annotation

GitHub Actions / aarch64-darwin: with shared libraries / build

--- stderr --- /Users/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js:21 const w = fh.writer(); ^ TypeError: fh.writer is not a function at testWriteWithAbortedSignalRejects (/Users/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js:21:16) at async Promise.all (index 0) Node.js v27.0.0-pre Command: out/Release/node /Users/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js

Check failure on line 21 in test/parallel/test-fs-promises-file-handle-writer-abort.js

View workflow job for this annotation

GitHub Actions / aarch64-linux: with shared openssl-3.5.7 / build

--- stderr --- /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js:21 const w = fh.writer(); ^ TypeError: fh.writer is not a function at testWriteWithAbortedSignalRejects (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js:21:16) at async Promise.all (index 0) Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js

Check failure on line 21 in test/parallel/test-fs-promises-file-handle-writer-abort.js

View workflow job for this annotation

GitHub Actions / aarch64-linux: with shared openssl-fips-3.5.7 / build

--- stderr --- /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js:21 const w = fh.writer(); ^ TypeError: fh.writer is not a function at testWriteWithAbortedSignalRejects (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js:21:16) at async Promise.all (index 0) Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js

Check failure on line 21 in test/parallel/test-fs-promises-file-handle-writer-abort.js

View workflow job for this annotation

GitHub Actions / x86_64-linux: with shared libraries and perfetto / build

--- stderr --- /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js:21 const w = fh.writer(); ^ TypeError: fh.writer is not a function at testWriteWithAbortedSignalRejects (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js:21:16) at async Promise.all (index 0) Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js

Check failure on line 21 in test/parallel/test-fs-promises-file-handle-writer-abort.js

View workflow job for this annotation

GitHub Actions / test-linux (ubuntu-24.04-arm)

--- stderr --- /home/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-writer-abort.js:21 const w = fh.writer(); ^ TypeError: fh.writer is not a function at testWriteWithAbortedSignalRejects (/home/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-writer-abort.js:21:16) at async Promise.all (index 0) Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-writer-abort.js

Check failure on line 21 in test/parallel/test-fs-promises-file-handle-writer-abort.js

View workflow job for this annotation

GitHub Actions / test-linux (ubuntu-24.04)

--- stderr --- /home/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-writer-abort.js:21 const w = fh.writer(); ^ TypeError: fh.writer is not a function at testWriteWithAbortedSignalRejects (/home/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-writer-abort.js:21:16) at async Promise.all (index 0) Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-writer-abort.js

Check failure on line 21 in test/parallel/test-fs-promises-file-handle-writer-abort.js

View workflow job for this annotation

GitHub Actions / x86_64-darwin: with shared libraries / build

--- stderr --- /Users/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js:21 const w = fh.writer(); ^ TypeError: fh.writer is not a function at testWriteWithAbortedSignalRejects (/Users/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js:21:16) at async Promise.all (index 0) Node.js v27.0.0-pre Command: out/Release/node /Users/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-abort.js

Check failure on line 21 in test/parallel/test-fs-promises-file-handle-writer-abort.js

View workflow job for this annotation

GitHub Actions / test-macOS

--- stderr --- /Users/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-writer-abort.js:21 const w = fh.writer(); ^ TypeError: fh.writer is not a function at testWriteWithAbortedSignalRejects (/Users/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-writer-abort.js:21:16) at async Promise.all (index 0) Node.js v27.0.0-pre Command: out/Release/node /Users/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-writer-abort.js

await assert.rejects(
w.write(Buffer.from('data'), { signal: AbortSignal.abort() }),
{ name: 'AbortError' },
);

// Writer should still be usable after a signal rejection
await w.write(Buffer.from('ok'));
await w.end();
await fh.close();

assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'ok');
}

async function testWritevWithAbortedSignalRejects() {
const filePath = path.join(tmpDir, 'writer-signal-writev.txt');
const fh = await open(filePath, 'w');
const w = fh.writer();

await assert.rejects(
w.writev([Buffer.from('a'), Buffer.from('b')], { signal: AbortSignal.abort() }),
{ name: 'AbortError' },
);

await w.writev([Buffer.from('ok')]);
await w.end();
await fh.close();

assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'ok');
}

async function testEndWithAbortedSignalRejects() {
const filePath = path.join(tmpDir, 'writer-signal-end.txt');
const fh = await open(filePath, 'w');
const w = fh.writer();

await w.write(Buffer.from('data'));

await assert.rejects(
w.end({ signal: AbortSignal.abort() }),
{ name: 'AbortError' },
);

// end() was rejected so writer is still open - end it cleanly
const totalBytes = await w.end();
await fh.close();

assert.strictEqual(totalBytes, 4);
assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'data');
}

Promise.all([
testWriteWithAbortedSignalRejects(),
testWritevWithAbortedSignalRejects(),
testEndWithAbortedSignalRejects(),
]).then(common.mustCall());
169 changes: 169 additions & 0 deletions test/parallel/test-fs-promises-file-handle-writer-dispose.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@

Check failure on line 1 in test/parallel/test-fs-promises-file-handle-writer-dispose.js

View workflow job for this annotation

GitHub Actions / lint-js-and-md

Too many blank lines at the beginning of file. Max of 0 allowed
'use strict';

const common = require('../common');
const assert = require('assert');
const fs = require('fs');
const { open } = fs.promises;
const path = require('path');
const tmpdir = require('../common/tmpdir');

tmpdir.refresh();

const tmpDir = tmpdir.path;

// =============================================================================
// Symbol.asyncDispose - await using
// =============================================================================

async function testAsyncDispose() {
const filePath = path.join(tmpDir, 'writer-async-dispose.txt');
{
await using fh = await open(filePath, 'w');
await using w = fh.writer({ autoClose: true });
await w.write(Buffer.from('async dispose'));
}
// Both writer and file handle should be cleaned up
assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'async dispose');

// Verify the handle is actually closed by trying to open a new one
// (if the old one were still open with a write lock on some OSes,
// this could fail - but it should succeed).
const fh2 = await open(filePath, 'r');
await fh2.close();
}

// =============================================================================
// Symbol.asyncDispose - cleanup on error (await using unwinds)
// =============================================================================

async function testAsyncDisposeOnError() {
const filePath = path.join(tmpDir, 'writer-dispose-error.txt');
const fh = await open(filePath, 'w');

try {
await using w = fh.writer();
await w.write(Buffer.from('before error'));
throw new Error('intentional');
} catch (e) {
assert.strictEqual(e.message, 'intentional');

Check failure on line 49 in test/parallel/test-fs-promises-file-handle-writer-dispose.js

View workflow job for this annotation

GitHub Actions / aarch64-linux: with shared openssl-3.6.3 / build

--- stderr --- node:internal/process/promises:324 triggerUncaughtException(err, true /* fromPromise */); ^ AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + actual - expected + 'fh.writer is not a function' - 'intentional' at testAsyncDisposeOnError (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-dispose.js:49:12) at async Promise.all (index 1) { generatedMessage: true, code: 'ERR_ASSERTION', actual: 'fh.writer is not a function', expected: 'intentional', operator: 'strictEqual', diff: 'simple' } Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-dispose.js

Check failure on line 49 in test/parallel/test-fs-promises-file-handle-writer-dispose.js

View workflow job for this annotation

GitHub Actions / aarch64-linux: with shared openssl-4.0.1 / build

--- stderr --- node:internal/process/promises:324 triggerUncaughtException(err, true /* fromPromise */); ^ AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + actual - expected + 'fh.writer is not a function' - 'intentional' at testAsyncDisposeOnError (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-dispose.js:49:12) at async Promise.all (index 1) { generatedMessage: true, code: 'ERR_ASSERTION', actual: 'fh.writer is not a function', expected: 'intentional', operator: 'strictEqual', diff: 'simple' } Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-dispose.js

Check failure on line 49 in test/parallel/test-fs-promises-file-handle-writer-dispose.js

View workflow job for this annotation

GitHub Actions / aarch64-linux: with shared boringssl-0.20260803.0 / build

--- stderr --- node:internal/process/promises:324 triggerUncaughtException(err, true /* fromPromise */); ^ AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + actual - expected + 'fh.writer is not a function' - 'intentional' at testAsyncDisposeOnError (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-dispose.js:49:12) at async Promise.all (index 1) { generatedMessage: true, code: 'ERR_ASSERTION', actual: 'fh.writer is not a function', expected: 'intentional', operator: 'strictEqual', diff: 'simple' } Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-dispose.js

Check failure on line 49 in test/parallel/test-fs-promises-file-handle-writer-dispose.js

View workflow job for this annotation

GitHub Actions / aarch64-linux: with shared openssl-3.0.21 / build

--- stderr --- node:internal/process/promises:324 triggerUncaughtException(err, true /* fromPromise */); ^ AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + actual - expected + 'fh.writer is not a function' - 'intentional' at testAsyncDisposeOnError (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-dispose.js:49:12) at async Promise.all (index 1) { generatedMessage: true, code: 'ERR_ASSERTION', actual: 'fh.writer is not a function', expected: 'intentional', operator: 'strictEqual', diff: 'simple' } Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-dispose.js

Check failure on line 49 in test/parallel/test-fs-promises-file-handle-writer-dispose.js

View workflow job for this annotation

GitHub Actions / aarch64-darwin: with shared libraries / build

--- stderr --- node:internal/process/promises:324 triggerUncaughtException(err, true /* fromPromise */); ^ AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + actual - expected + 'fh.writer is not a function' - 'intentional' at testAsyncDisposeOnError (/Users/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-dispose.js:49:12) at async Promise.all (index 1) { generatedMessage: true, code: 'ERR_ASSERTION', actual: 'fh.writer is not a function', expected: 'intentional', operator: 'strictEqual', diff: 'simple' } Node.js v27.0.0-pre Command: out/Release/node /Users/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-dispose.js

Check failure on line 49 in test/parallel/test-fs-promises-file-handle-writer-dispose.js

View workflow job for this annotation

GitHub Actions / aarch64-linux: with shared openssl-3.5.7 / build

--- stderr --- node:internal/process/promises:324 triggerUncaughtException(err, true /* fromPromise */); ^ AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + actual - expected + 'fh.writer is not a function' - 'intentional' at testAsyncDisposeOnError (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-dispose.js:49:12) at async Promise.all (index 1) { generatedMessage: true, code: 'ERR_ASSERTION', actual: 'fh.writer is not a function', expected: 'intentional', operator: 'strictEqual', diff: 'simple' } Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-dispose.js

Check failure on line 49 in test/parallel/test-fs-promises-file-handle-writer-dispose.js

View workflow job for this annotation

GitHub Actions / aarch64-linux: with shared openssl-fips-3.5.7 / build

--- stderr --- node:internal/process/promises:324 triggerUncaughtException(err, true /* fromPromise */); ^ AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + actual - expected + 'fh.writer is not a function' - 'intentional' at testAsyncDisposeOnError (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-dispose.js:49:12) at async Promise.all (index 1) { generatedMessage: true, code: 'ERR_ASSERTION', actual: 'fh.writer is not a function', expected: 'intentional', operator: 'strictEqual', diff: 'simple' } Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-dispose.js

Check failure on line 49 in test/parallel/test-fs-promises-file-handle-writer-dispose.js

View workflow job for this annotation

GitHub Actions / x86_64-linux: with shared libraries and perfetto / build

--- stderr --- node:internal/process/promises:324 triggerUncaughtException(err, true /* fromPromise */); ^ AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + actual - expected + 'fh.writer is not a function' - 'intentional' at testAsyncDisposeOnError (/home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-dispose.js:49:12) at async Promise.all (index 1) { generatedMessage: true, code: 'ERR_ASSERTION', actual: 'fh.writer is not a function', expected: 'intentional', operator: 'strictEqual', diff: 'simple' } Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-dispose.js

Check failure on line 49 in test/parallel/test-fs-promises-file-handle-writer-dispose.js

View workflow job for this annotation

GitHub Actions / test-linux (ubuntu-24.04-arm)

--- stderr --- node:internal/process/promises:324 triggerUncaughtException(err, true /* fromPromise */); ^ AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + actual - expected + 'fh.writer is not a function' - 'intentional' at testAsyncDisposeOnError (/home/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-writer-dispose.js:49:12) at async Promise.all (index 1) { generatedMessage: true, code: 'ERR_ASSERTION', actual: 'fh.writer is not a function', expected: 'intentional', operator: 'strictEqual', diff: 'simple' } Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-writer-dispose.js

Check failure on line 49 in test/parallel/test-fs-promises-file-handle-writer-dispose.js

View workflow job for this annotation

GitHub Actions / test-linux (ubuntu-24.04)

--- stderr --- node:internal/process/promises:324 triggerUncaughtException(err, true /* fromPromise */); ^ AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + actual - expected + 'fh.writer is not a function' - 'intentional' at testAsyncDisposeOnError (/home/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-writer-dispose.js:49:12) at async Promise.all (index 1) { generatedMessage: true, code: 'ERR_ASSERTION', actual: 'fh.writer is not a function', expected: 'intentional', operator: 'strictEqual', diff: 'simple' } Node.js v27.0.0-pre Command: out/Release/node /home/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-writer-dispose.js

Check failure on line 49 in test/parallel/test-fs-promises-file-handle-writer-dispose.js

View workflow job for this annotation

GitHub Actions / x86_64-darwin: with shared libraries / build

--- stderr --- node:internal/process/promises:324 triggerUncaughtException(err, true /* fromPromise */); ^ AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + actual - expected + 'fh.writer is not a function' - 'intentional' at testAsyncDisposeOnError (/Users/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-dispose.js:49:12) at async Promise.all (index 1) { generatedMessage: true, code: 'ERR_ASSERTION', actual: 'fh.writer is not a function', expected: 'intentional', operator: 'strictEqual', diff: 'simple' } Node.js v27.0.0-pre Command: out/Release/node /Users/runner/work/_temp/node-v27.0.0-nightly2026-08-186e342deba0-slim/test/parallel/test-fs-promises-file-handle-writer-dispose.js

Check failure on line 49 in test/parallel/test-fs-promises-file-handle-writer-dispose.js

View workflow job for this annotation

GitHub Actions / test-macOS

--- stderr --- node:internal/process/promises:324 triggerUncaughtException(err, true /* fromPromise */); ^ AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + actual - expected + 'fh.writer is not a function' - 'intentional' at testAsyncDisposeOnError (/Users/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-writer-dispose.js:49:12) at async Promise.all (index 1) { generatedMessage: true, code: 'ERR_ASSERTION', actual: 'fh.writer is not a function', expected: 'intentional', operator: 'strictEqual', diff: 'simple' } Node.js v27.0.0-pre Command: out/Release/node /Users/runner/work/node/node/node/test/parallel/test-fs-promises-file-handle-writer-dispose.js
}

// If asyncDispose ran, the handle should be unlocked and reusable
const w2 = fh.writer();
await w2.write(Buffer.from('after error'));
await w2.end();
await fh.close();

const content = fs.readFileSync(filePath, 'utf8');
assert.ok(content.includes('after error'),
`Expected 'after error' in ${JSON.stringify(content)}`);

Check failure on line 60 in test/parallel/test-fs-promises-file-handle-writer-dispose.js

View workflow job for this annotation

GitHub Actions / lint-js-and-md

Expected indentation of 12 spaces but found 4
}

// =============================================================================
// Symbol.dispose calls fail()
// =============================================================================

async function testSyncDispose() {
const filePath = path.join(tmpDir, 'writer-sync-dispose.txt');
const fh = await open(filePath, 'w');

{
using w = fh.writer();
await w.write(Buffer.from('before dispose'));
}
// Symbol.dispose calls fail(), which unlocks the handle.
// The handle should be reusable.
const w2 = fh.writer();
await w2.write(Buffer.from('after dispose'));
await w2.end();
await fh.close();

const content = fs.readFileSync(filePath, 'utf8');
assert.ok(content.includes('after dispose'),
`Expected 'after dispose' in ${JSON.stringify(content)}`);

Check failure on line 84 in test/parallel/test-fs-promises-file-handle-writer-dispose.js

View workflow job for this annotation

GitHub Actions / lint-js-and-md

Expected indentation of 12 spaces but found 4
}

// =============================================================================
// Symbol.dispose on error unwind
// =============================================================================

async function testSyncDisposeOnError() {
const filePath = path.join(tmpDir, 'writer-sync-dispose-error.txt');
const fh = await open(filePath, 'w');

try {
using w = fh.writer();
await w.write(Buffer.from('data'));
throw new Error('intentional');
} catch (e) {
assert.strictEqual(e.message, 'intentional');
}

// Handle should be unlocked and reusable after sync dispose
const w2 = fh.writer();
await w2.write(Buffer.from('recovered'));
await w2.end();
await fh.close();

const content = fs.readFileSync(filePath, 'utf8');
assert.ok(content.includes('recovered'),
`Expected 'recovered' in ${JSON.stringify(content)}`);

Check failure on line 111 in test/parallel/test-fs-promises-file-handle-writer-dispose.js

View workflow job for this annotation

GitHub Actions / lint-js-and-md

Expected indentation of 12 spaces but found 4
}

// =============================================================================
// asyncDispose waits for pending end() when closing
// =============================================================================

async function testAsyncDisposeWhileClosing() {
const filePath = path.join(tmpDir, 'writer-dispose-closing.txt');
const fh = await open(filePath, 'w');
const w = fh.writer({ autoClose: true });

await w.write(Buffer.from('closing test'));

// Start end() but don't await - writer is now "closing"
const endPromise = w.end();

// asyncDispose should wait for the pending end, not call fail()
await w[Symbol.asyncDispose]();
await endPromise;

assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'closing test');
}


// =============================================================================
// asyncDispose calls fail() on open writer (not graceful cleanup)
// =============================================================================

async function testAsyncDisposeCallsFail() {
const filePath = path.join(tmpDir, 'writer-dispose-fails.txt');
const fh = await open(filePath, 'w');
const w = fh.writer();

await w.write(Buffer.from('some data'));

// Dispose without end() - should call fail(), not graceful cleanup
await w[Symbol.asyncDispose]();

// Writer should be in errored state - write should reject
await assert.rejects(
w.write(Buffer.from('more')),
(err) => err instanceof Error,
);

// Handle should be unlocked and reusable
const w2 = fh.writer();
await w2.end();
await fh.close();
}

Promise.all([
testAsyncDispose(),
testAsyncDisposeOnError(),
testSyncDispose(),
testSyncDisposeOnError(),
testAsyncDisposeWhileClosing(),
testAsyncDisposeCallsFail(),
]).then(common.mustCall());
Loading
Loading