@@ -256,5 +256,57 @@ describe('monitoring', function() {
256256
257257 monitor . connect ( ) ;
258258 } ) ;
259+
260+ it ( 'should report the most recent error on second monitoring failure' , function ( done ) {
261+ let failedCount = 0 ;
262+ let initialConnectCompleted = false ;
263+ mockServer . setMessageHandler ( request => {
264+ const doc = request . document ;
265+ if ( doc . ismaster ) {
266+ if ( ! initialConnectCompleted ) {
267+ request . reply ( mock . DEFAULT_ISMASTER_36 ) ;
268+ initialConnectCompleted = true ;
269+ return ;
270+ }
271+
272+ if ( failedCount === 0 ) {
273+ failedCount ++ ;
274+ request . reply ( { ok : 0 , errmsg : 'first error message' } ) ;
275+ } else {
276+ failedCount ++ ;
277+ request . reply ( { ok : 0 , errmsg : 'second error message' } ) ;
278+ }
279+ }
280+ } ) ;
281+
282+ const server = new MockServer ( mockServer . address ( ) ) ;
283+ const monitor = new Monitor ( server , {
284+ heartbeatFrequencyMS : 250 ,
285+ minHeartbeatFrequencyMS : 50
286+ } ) ;
287+ this . defer ( ( ) => monitor . close ( ) ) ;
288+
289+ let resetRequested = false ;
290+ monitor . on ( 'resetConnectionPool' , ( ) => ( resetRequested = true ) ) ;
291+ monitor . on ( 'serverHeartbeatSucceeded' , ( ) => {
292+ if ( server . description . type === ServerType . Unknown ) {
293+ // this is the first successful heartbeat, set the server type
294+ server . description . type = ServerType . Standalone ;
295+ return ;
296+ }
297+
298+ done ( new Error ( 'unexpected heartbeat success' ) ) ;
299+ } ) ;
300+
301+ monitor . on ( 'serverHeartbeatFailed' , event => {
302+ expect ( resetRequested ) . to . be . true ;
303+ expect ( event )
304+ . property ( 'failure' )
305+ . to . match ( / s e c o n d e r r o r m e s s a g e / ) ;
306+ done ( ) ;
307+ } ) ;
308+
309+ monitor . connect ( ) ;
310+ } ) ;
259311 } ) ;
260312} ) ;
0 commit comments