@@ -42,7 +42,87 @@ async function validateRead() {
4242 ) ;
4343}
4444
45+ async function validateReadStreamReleasesFileHandleCloseListener ( ) {
46+ const filePathForHandle = path . resolve ( tmpDir , 'tmp-read-listener.txt' ) ;
47+ const buf = Buffer . from ( 'Hello world' , 'utf8' ) ;
48+
49+ fs . writeFileSync ( filePathForHandle , buf ) ;
50+
51+ const fileHandle = await open ( filePathForHandle ) ;
52+
53+ for ( let i = 0 ; i < buf . length ; i ++ ) {
54+ await buffer ( fileHandle . createReadStream ( {
55+ start : i ,
56+ end : i ,
57+ autoClose : false ,
58+ } ) ) ;
59+
60+ assert . strictEqual ( fileHandle . listenerCount ( 'close' ) , 0 ) ;
61+ }
62+
63+ await fileHandle . close ( ) ;
64+ }
65+
66+ async function validateWriteStreamReleasesFileHandleCloseListener ( ) {
67+ const filePathForHandle = path . resolve ( tmpDir , 'tmp-write-listener.txt' ) ;
68+ const buf = Buffer . from ( 'Hello world' , 'utf8' ) ;
69+
70+ const fileHandle = await open ( filePathForHandle , 'w' ) ;
71+
72+ for ( let i = 0 ; i < buf . length ; i ++ ) {
73+ const stream = fileHandle . createWriteStream ( {
74+ start : i ,
75+ autoClose : false ,
76+ } ) ;
77+ stream . end ( buf . subarray ( i , i + 1 ) ) ;
78+ await finished ( stream ) ;
79+
80+ assert . strictEqual ( fileHandle . listenerCount ( 'close' ) , 0 ) ;
81+ }
82+
83+ await fileHandle . close ( ) ;
84+ assert . deepStrictEqual ( fs . readFileSync ( filePathForHandle ) , buf ) ;
85+ }
86+
87+ async function validateReadStreamAutoCloseClosesFileHandle ( ) {
88+ const filePathForHandle = path . resolve ( tmpDir , 'tmp-read-auto-close.txt' ) ;
89+ const buf = Buffer . from ( 'Hello world' , 'utf8' ) ;
90+
91+ fs . writeFileSync ( filePathForHandle , buf ) ;
92+
93+ const fileHandle = await open ( filePathForHandle ) ;
94+ const closed = new Promise ( ( resolve ) => {
95+ fileHandle . once ( 'close' , common . mustCall ( resolve ) ) ;
96+ } ) ;
97+
98+ assert . deepStrictEqual ( await buffer ( fileHandle . createReadStream ( ) ) , buf ) ;
99+ await closed ;
100+ assert . strictEqual ( fileHandle . listenerCount ( 'close' ) , 0 ) ;
101+ }
102+
103+ async function validateWriteStreamAutoCloseClosesFileHandle ( ) {
104+ const filePathForHandle = path . resolve ( tmpDir , 'tmp-write-auto-close.txt' ) ;
105+ const buf = Buffer . from ( 'Hello world' , 'utf8' ) ;
106+
107+ const fileHandle = await open ( filePathForHandle , 'w' ) ;
108+ const closed = new Promise ( ( resolve ) => {
109+ fileHandle . once ( 'close' , common . mustCall ( resolve ) ) ;
110+ } ) ;
111+ const stream = fileHandle . createWriteStream ( ) ;
112+
113+ stream . end ( buf ) ;
114+ await finished ( stream ) ;
115+ await closed ;
116+
117+ assert . strictEqual ( fileHandle . listenerCount ( 'close' ) , 0 ) ;
118+ assert . deepStrictEqual ( fs . readFileSync ( filePathForHandle ) , buf ) ;
119+ }
120+
45121Promise . all ( [
46122 validateWrite ( ) ,
47123 validateRead ( ) ,
124+ validateReadStreamReleasesFileHandleCloseListener ( ) ,
125+ validateWriteStreamReleasesFileHandleCloseListener ( ) ,
126+ validateReadStreamAutoCloseClosesFileHandle ( ) ,
127+ validateWriteStreamAutoCloseClosesFileHandle ( ) ,
48128] ) . then ( common . mustCall ( ) ) ;
0 commit comments