@@ -1647,3 +1647,63 @@ useSslVariants.forEach((useSsl) => {
16471647 } ) ;
16481648 } ) ;
16491649} ) ;
1650+
1651+ describe ( 'Socket error handler regression test' , ( ) => {
1652+ let server ;
1653+ let logs = [ ] ;
1654+ const originalLog = console . log ;
1655+
1656+ before ( ( ) => {
1657+ console . log = ( ...args ) => {
1658+ logs . push ( args . join ( ' ' ) ) ;
1659+ originalLog . apply ( console , args ) ;
1660+ } ;
1661+ } ) ;
1662+
1663+ after ( ( ) => {
1664+ console . log = originalLog ;
1665+ } ) ;
1666+
1667+ beforeEach ( ( ) => {
1668+ logs = [ ] ;
1669+ } ) ;
1670+
1671+ afterEach ( async ( ) => {
1672+ if ( server ) {
1673+ await server . close ( true ) ;
1674+ server = null ;
1675+ }
1676+ } ) ;
1677+
1678+ // The bug was checking `this.listenerCount('error')` (Server) instead of `socket.listenerCount('error')`.
1679+ // By adding an error listener to the Server, we make server.listenerCount('error') === 1.
1680+ // With buggy code: condition becomes TRUE (1 === 1) and incorrectly logs.
1681+ // With fixed code: condition stays FALSE (socket has 2 listeners, 2 !== 1) and correctly doesn't log.
1682+ it ( 'does not log when server has 1 error listener but socket has multiple' , ( done ) => {
1683+ server = new Server ( { port : 0 , verbose : true } ) ;
1684+
1685+ server . on ( 'error' , ( ) => { } ) ;
1686+
1687+ server . server . once ( 'connection' , ( serverSocket ) => {
1688+ setImmediate ( ( ) => {
1689+ expect ( server . listenerCount ( 'error' ) ) . to . equal ( 1 ) ;
1690+ expect ( serverSocket . listenerCount ( 'error' ) ) . to . equal ( 2 ) ;
1691+
1692+ serverSocket . emit ( 'error' , new Error ( 'Regression test error' ) ) ;
1693+
1694+ setTimeout ( ( ) => {
1695+ const hasLog = logs . some ( ( log ) => log . includes ( 'Source socket emitted error' ) && log . includes ( 'Regression test error' ) ) ;
1696+
1697+ expect ( hasLog ) . to . equal ( false , 'Should check socket.listenerCount, not this.listenerCount (server)' ) ;
1698+
1699+ serverSocket . destroy ( ) ;
1700+ done ( ) ;
1701+ } , 50 ) ;
1702+ } ) ;
1703+ } ) ;
1704+
1705+ server . listen ( ) . then ( ( ) => {
1706+ net . connect ( server . port , '127.0.0.1' ) ;
1707+ } ) ;
1708+ } ) ;
1709+ } ) ;
0 commit comments