From 2504fa9a0e3566da95db80b7c4b9dff5005ab4db Mon Sep 17 00:00:00 2001
From: Paraspandey-debugs
Date: Thu, 20 Aug 2026 15:45:15 +0530
Subject: [PATCH] test: add validation for listener removal in read streams
---
...es-file-handle-readstream-listener-leak.js | 39 +++++++++++++++++++
1 file changed, 39 insertions(+)
create mode 100644 test/parallel/test-fs-promises-file-handle-readstream-listener-leak.js
diff --git a/test/parallel/test-fs-promises-file-handle-readstream-listener-leak.js b/test/parallel/test-fs-promises-file-handle-readstream-listener-leak.js
new file mode 100644
index 00000000000..5a3d72c8ecc
--- /dev/null
+++ b/test/parallel/test-fs-promises-file-handle-readstream-listener-leak.js
@@ -0,0 +1,39 @@
+'use strict';
+
+const common = require('../common');
+const assert = require('assert');
+const fs = require('fs');
+const path = require('path');
+const { buffer } = require('stream/consumers');
+const { open } = fs.promises;
+const tmpdir = require('../common/tmpdir');
+
+tmpdir.refresh();
+
+async function validateRepeatedStreamsRemoveListeners(filePath) {
+ const fileHandle = await open(filePath, 'r');
+ try {
+ const initialListeners = fileHandle.listenerCount('close');
+
+ for (let i = 0; i < 100; i++) {
+ const stream = fileHandle.createReadStream({
+ start: i,
+ end: i,
+ autoClose: false,
+ });
+ const data = await buffer(stream);
+ assert.strictEqual(data.length, 1);
+ }
+
+ assert.strictEqual(fileHandle.listenerCount('close'), initialListeners);
+ } finally {
+ await fileHandle.close();
+ }
+}
+
+(async function() {
+ const filePath = path.resolve(tmpdir.path, 'readstream-listener-leak');
+ fs.writeFileSync(filePath, 'x'.repeat(100));
+
+ await validateRepeatedStreamsRemoveListeners(filePath);
+})().then(common.mustCall());