@@ -97,6 +97,18 @@ const { promisify } = require('util');
9797 } ) ) ;
9898}
9999
100+ {
101+ const rs = new Readable ( ) ;
102+
103+ finished ( rs , common . mustCall ( ( err ) => {
104+ assert ( err , 'premature close error' ) ;
105+ } ) ) ;
106+
107+ rs . push ( null ) ;
108+ rs . emit ( 'close' ) ;
109+ rs . resume ( ) ;
110+ }
111+
100112{
101113 const rs = new Readable ( ) ;
102114
@@ -105,7 +117,9 @@ const { promisify } = require('util');
105117 } ) ) ;
106118
107119 rs . push ( null ) ;
108- rs . emit ( 'close' ) ; // Should not trigger an error
120+ rs . on ( 'end' , common . mustCall ( ( ) => {
121+ rs . emit ( 'close' ) ; // Should not trigger an error
122+ } ) ) ;
109123 rs . resume ( ) ;
110124}
111125
@@ -155,8 +169,9 @@ const { promisify } = require('util');
155169 rs . resume ( ) ;
156170}
157171
158- // Test that calling returned function removes listeners
159172{
173+ // Nothing happens if disposed.
174+
160175 const ws = new Writable ( {
161176 write ( data , env , cb ) {
162177 cb ( ) ;
@@ -168,6 +183,8 @@ const { promisify } = require('util');
168183}
169184
170185{
186+ // Nothing happens if disposed.
187+
171188 const rs = new Readable ( ) ;
172189 const removeListeners = finished ( rs , common . mustNotCall ( ) ) ;
173190 removeListeners ( ) ;
@@ -178,9 +195,126 @@ const { promisify } = require('util');
178195}
179196
180197{
198+ // Completed if readable-like is ended before.
199+
181200 const streamLike = new EE ( ) ;
182201 streamLike . readableEnded = true ;
183202 streamLike . readable = true ;
184- finished ( streamLike , common . mustCall ) ;
203+ finished ( streamLike , common . mustCall ( ) ) ;
204+ }
205+
206+ {
207+ // Completed if readable-like is never ended.
208+
209+ const streamLike = new EE ( ) ;
210+ streamLike . readableEnded = false ;
211+ streamLike . readable = true ;
212+ finished ( streamLike , common . expectsError ( {
213+ code : 'ERR_STREAM_PREMATURE_CLOSE'
214+ } ) ) ;
215+ streamLike . emit ( 'close' ) ;
216+ }
217+
218+ {
219+ // Completed if writable-like is destroyed before.
220+
221+ const streamLike = new EE ( ) ;
222+ streamLike . destroyed = true ;
223+ streamLike . writable = true ;
224+ finished ( streamLike , common . mustCall ( ) ) ;
225+ }
226+
227+ {
228+ // Completed if readable-like is aborted before.
229+
230+ const streamLike = new EE ( ) ;
231+ streamLike . destroyed = true ;
232+ streamLike . readable = true ;
233+ finished ( streamLike , common . mustCall ( ) ) ;
234+ }
235+
236+ {
237+ // Completed if writable-like is aborted before.
238+
239+ const streamLike = new EE ( ) ;
240+ streamLike . aborted = true ;
241+ streamLike . writable = true ;
242+ finished ( streamLike , common . mustCall ( ) ) ;
243+ }
244+
245+ {
246+ // Completed if readable-like is aborted before.
247+
248+ const streamLike = new EE ( ) ;
249+ streamLike . aborted = true ;
250+ streamLike . readable = true ;
251+ finished ( streamLike , common . mustCall ( ) ) ;
252+ }
253+
254+ {
255+ // Completed if streamlike is finished before.
256+
257+ const streamLike = new EE ( ) ;
258+ streamLike . writableFinished = true ;
259+ streamLike . writable = true ;
260+ finished ( streamLike , common . mustCall ( ) ) ;
261+ }
262+
263+ {
264+ // Premature close if stream is not finished.
265+
266+ const streamLike = new EE ( ) ;
267+ streamLike . writableFinished = false ;
268+ streamLike . writable = true ;
269+ finished ( streamLike , common . expectsError ( {
270+ code : 'ERR_STREAM_PREMATURE_CLOSE'
271+ } ) ) ;
272+ streamLike . emit ( 'close' ) ;
273+ }
274+
275+ {
276+ // Premature close if stream never emitted 'finish'
277+ // even if writableFinished says something else.
278+
279+ const streamLike = new EE ( ) ;
280+ streamLike . writable = true ;
281+ finished ( streamLike , common . expectsError ( {
282+ code : 'ERR_STREAM_PREMATURE_CLOSE'
283+ } ) ) ;
284+ streamLike . writableFinished = true ;
285+ streamLike . emit ( 'close' ) ;
286+ }
287+
288+
289+ {
290+ // Premature close if stream never emitted 'end'
291+ // even if readableEnded says something else.
292+
293+ const streamLike = new EE ( ) ;
294+ streamLike . readable = true ;
295+ finished ( streamLike , common . expectsError ( {
296+ code : 'ERR_STREAM_PREMATURE_CLOSE'
297+ } ) ) ;
298+ streamLike . readableEnded = true ;
185299 streamLike . emit ( 'close' ) ;
186300}
301+
302+ {
303+ // Completes if already finished.
304+
305+ const w = new Writable ( ) ;
306+ finished ( w , common . mustCall ( ( ) => {
307+ finished ( w , common . mustCall ( ) ) ;
308+ } ) ) ;
309+ w . destroy ( ) ;
310+ }
311+
312+ {
313+ // Completes if already ended.
314+
315+ const r = new Readable ( ) ;
316+ finished ( r , common . mustCall ( ( ) => {
317+ finished ( r , common . mustCall ( ) ) ;
318+ } ) ) ;
319+ r . destroy ( ) ;
320+ }
0 commit comments