@@ -56,3 +56,76 @@ var Stream = require('stream').Stream;
5656
5757 assert . strictEqual ( gotErr , err ) ;
5858} ) ( ) ;
59+
60+ ( function testErrorWithRemovedListenerThrows ( ) {
61+ var EE = require ( 'events' ) . EventEmitter ;
62+ var R = Stream . Readable ;
63+ var W = Stream . Writable ;
64+
65+ var r = new R ;
66+ var w = new W ;
67+ var removed = false ;
68+ var didTest = false ;
69+
70+ process . on ( 'exit' , function ( ) {
71+ assert ( didTest ) ;
72+ console . log ( 'ok' ) ;
73+ } ) ;
74+
75+ r . _read = function ( ) {
76+ setTimeout ( function ( ) {
77+ assert ( removed ) ;
78+ assert . throws ( function ( ) {
79+ w . emit ( 'error' , new Error ( 'fail' ) ) ;
80+ } ) ;
81+ didTest = true ;
82+ } ) ;
83+ } ;
84+
85+ w . on ( 'error' , myOnError ) ;
86+ r . pipe ( w ) ;
87+ w . removeListener ( 'error' , myOnError ) ;
88+ removed = true ;
89+
90+ function myOnError ( er ) {
91+ throw new Error ( 'this should not happen' ) ;
92+ }
93+ } ) ( ) ;
94+
95+ ( function testErrorWithRemovedListenerThrows ( ) {
96+ var EE = require ( 'events' ) . EventEmitter ;
97+ var R = Stream . Readable ;
98+ var W = Stream . Writable ;
99+
100+ var r = new R ;
101+ var w = new W ;
102+ var removed = false ;
103+ var didTest = false ;
104+ var caught = false ;
105+
106+ process . on ( 'exit' , function ( ) {
107+ assert ( didTest ) ;
108+ console . log ( 'ok' ) ;
109+ } ) ;
110+
111+ r . _read = function ( ) {
112+ setTimeout ( function ( ) {
113+ assert ( removed ) ;
114+ w . emit ( 'error' , new Error ( 'fail' ) ) ;
115+ didTest = true ;
116+ } ) ;
117+ } ;
118+
119+ w . on ( 'error' , myOnError ) ;
120+ w . _write = function ( ) { } ;
121+
122+ r . pipe ( w ) ;
123+ // Removing some OTHER random listener should not do anything
124+ w . removeListener ( 'error' , function ( ) { } ) ;
125+ removed = true ;
126+
127+ function myOnError ( er ) {
128+ assert ( ! caught ) ;
129+ caught = true ;
130+ }
131+ } ) ( ) ;
0 commit comments