@@ -129,13 +129,20 @@ const assert = require('assert');
129129 cb ( expected ) ;
130130 } ) ;
131131
132+ let ticked = false ;
132133 read . on ( 'end' , common . mustNotCall ( 'no end event' ) ) ;
133134 read . on ( 'error' , common . mustCall ( ( err ) => {
135+ assert . strictEqual ( ticked , true ) ;
136+ assert . strictEqual ( read . _readableState . errorEmitted , true ) ;
137+ assert . strictEqual ( read . _readableState . errored , true ) ;
134138 assert . strictEqual ( err , expected ) ;
135139 } ) ) ;
136140
137141 read . destroy ( ) ;
142+ assert . strictEqual ( read . _readableState . errorEmitted , false ) ;
143+ assert . strictEqual ( read . _readableState . errored , true ) ;
138144 assert . strictEqual ( read . destroyed , true ) ;
145+ ticked = true ;
139146}
140147
141148{
@@ -174,10 +181,58 @@ const assert = require('assert');
174181
175182 const expected = new Error ( 'kaboom' ) ;
176183
177- read . on ( 'close' , common . mustCall ( ) ) ;
184+ let ticked = false ;
185+ read . on ( 'close' , common . mustCall ( ( ) => {
186+ assert . strictEqual ( read . _readableState . errorEmitted , false ) ;
187+ assert . strictEqual ( ticked , true ) ;
188+ } ) ) ;
189+ // 'error' should not be emitted since a callback is passed to
190+ // destroy(err, callback);
191+ read . on ( 'error' , common . mustNotCall ( ) ) ;
192+
193+ assert . strictEqual ( read . _readableState . errored , false ) ;
194+ assert . strictEqual ( read . _readableState . errorEmitted , false ) ;
195+
178196 read . destroy ( expected , common . mustCall ( function ( err ) {
197+ assert . strictEqual ( read . _readableState . errored , true ) ;
179198 assert . strictEqual ( err , expected ) ;
180199 } ) ) ;
200+ assert . strictEqual ( read . _readableState . errorEmitted , false ) ;
201+ assert . strictEqual ( read . _readableState . errored , true ) ;
202+ ticked = true ;
203+ }
204+
205+ {
206+ const readable = new Readable ( {
207+ destroy : common . mustCall ( function ( err , cb ) {
208+ process . nextTick ( cb , new Error ( 'kaboom 1' ) ) ;
209+ } ) ,
210+ read ( ) { }
211+ } ) ;
212+
213+ let ticked = false ;
214+ readable . on ( 'close' , common . mustCall ( ( ) => {
215+ assert . strictEqual ( ticked , true ) ;
216+ assert . strictEqual ( readable . _readableState . errorEmitted , true ) ;
217+ } ) ) ;
218+ readable . on ( 'error' , common . mustCall ( ( err ) => {
219+ assert . strictEqual ( ticked , true ) ;
220+ assert . strictEqual ( err . message , 'kaboom 2' ) ;
221+ assert . strictEqual ( readable . _readableState . errorEmitted , true ) ;
222+ } ) ) ;
223+
224+ readable . destroy ( ) ;
225+ assert . strictEqual ( readable . destroyed , true ) ;
226+ assert . strictEqual ( readable . _readableState . errored , false ) ;
227+ assert . strictEqual ( readable . _readableState . errorEmitted , false ) ;
228+
229+ // Test case where `readable.destroy()` is called again with an error before
230+ // the `_destroy()` callback is called.
231+ readable . destroy ( new Error ( 'kaboom 2' ) ) ;
232+ assert . strictEqual ( readable . _readableState . errorEmitted , false ) ;
233+ assert . strictEqual ( readable . _readableState . errored , true ) ;
234+
235+ ticked = true ;
181236}
182237
183238{
0 commit comments