1+ import { once } from 'node:events' ;
12import * as net from 'node:net' ;
23
34import { expect } from 'chai' ;
45import { coerce } from 'semver' ;
56import * as sinon from 'sinon' ;
67import { setTimeout } from 'timers' ;
8+ import { setTimeout as setTimeoutPromise } from 'timers/promises' ;
79
8- import { MongoClient } from '../../mongodb' ;
10+ import { MongoClient , ServerHeartbeatSucceededEvent } from '../../mongodb' ;
911import {
1012 isHello ,
1113 LEGACY_HELLO_COMMAND ,
@@ -141,7 +143,7 @@ describe('monitoring', function () {
141143 } ) . skipReason = 'TODO(NODE-3600): Unskip flaky tests' ;
142144
143145 describe ( 'Monitor' , function ( ) {
144- let monitor ;
146+ let monitor : Monitor | null ;
145147
146148 beforeEach ( ( ) => {
147149 monitor = null ;
@@ -153,7 +155,7 @@ describe('monitoring', function () {
153155 }
154156 } ) ;
155157
156- it ( 'should connect and issue an initial server check' , function ( done ) {
158+ it ( 'should connect and issue an initial server check' , async function ( ) {
157159 mockServer . setMessageHandler ( request => {
158160 const doc = request . document ;
159161 if ( isHello ( doc ) ) {
@@ -164,15 +166,17 @@ describe('monitoring', function () {
164166 const server = new MockServer ( mockServer . address ( ) ) ;
165167 monitor = new Monitor ( server as any , { } as any ) ;
166168
167- monitor . on ( 'serverHeartbeatFailed' , ( ) => done ( new Error ( 'unexpected heartbeat failure' ) ) ) ;
168- monitor . on ( 'serverHeartbeatSucceeded' , ( ) => {
169- expect ( monitor . connection ) . to . have . property ( 'id' , '<monitor>' ) ;
170- done ( ) ;
171- } ) ;
169+ const heartbeatFailed = once ( monitor , 'serverHeartbeatFailed' ) ;
170+ const heartbeatSucceeded = once ( monitor , 'serverHeartbeatSucceeded' ) ;
172171 monitor . connect ( ) ;
172+
173+ const res = await Promise . race ( [ heartbeatFailed , heartbeatSucceeded ] ) ;
174+
175+ expect ( res [ 0 ] ) . to . be . instanceOf ( ServerHeartbeatSucceededEvent ) ;
176+ expect ( monitor . connection ) . to . have . property ( 'id' , '<monitor>' ) ;
173177 } ) ;
174178
175- it ( 'should ignore attempts to connect when not already closed' , function ( done ) {
179+ it ( 'should ignore attempts to connect when not already closed' , async function ( ) {
176180 mockServer . setMessageHandler ( request => {
177181 const doc = request . document ;
178182 if ( isHello ( doc ) ) {
@@ -183,13 +187,17 @@ describe('monitoring', function () {
183187 const server = new MockServer ( mockServer . address ( ) ) ;
184188 monitor = new Monitor ( server as any , { } as any ) ;
185189
186- monitor . on ( 'serverHeartbeatFailed' , ( ) => done ( new Error ( 'unexpected heartbeat failure' ) ) ) ;
187- monitor . on ( 'serverHeartbeatSucceeded' , ( ) => done ( ) ) ;
190+ const heartbeatFailed = once ( monitor , 'serverHeartbeatFailed' ) ;
191+ const heartbeatSucceeded = once ( monitor , 'serverHeartbeatSucceeded' ) ;
188192 monitor . connect ( ) ;
193+
194+ const res = await Promise . race ( [ heartbeatFailed , heartbeatSucceeded ] ) ;
195+
196+ expect ( res [ 0 ] ) . to . be . instanceOf ( ServerHeartbeatSucceededEvent ) ;
189197 monitor . connect ( ) ;
190198 } ) ;
191199
192- it ( 'should not initiate another check if one is in progress' , function ( done ) {
200+ it ( 'should not initiate another check if one is in progress' , async function ( ) {
193201 mockServer . setMessageHandler ( request => {
194202 const doc = request . document ;
195203 if ( isHello ( doc ) ) {
@@ -202,32 +210,27 @@ describe('monitoring', function () {
202210
203211 const startedEvents : ServerHeartbeatStartedEvent [ ] = [ ] ;
204212 monitor . on ( 'serverHeartbeatStarted' , event => startedEvents . push ( event ) ) ;
205- monitor . on ( 'close' , ( ) => {
206- expect ( startedEvents ) . to . have . length ( 2 ) ;
207- done ( ) ;
208- } ) ;
213+ const monitorClose = once ( monitor , 'close' ) ;
209214
210215 monitor . connect ( ) ;
211- monitor . once ( 'serverHeartbeatSucceeded' , ( ) => {
212- monitor . requestCheck ( ) ;
213- monitor . requestCheck ( ) ;
214- monitor . requestCheck ( ) ;
215- monitor . requestCheck ( ) ;
216- monitor . requestCheck ( ) ;
216+ await once ( monitor , 'serverHeartbeatSucceeded' ) ;
217+ monitor . requestCheck ( ) ;
218+ monitor . requestCheck ( ) ;
219+ monitor . requestCheck ( ) ;
220+ monitor . requestCheck ( ) ;
221+ monitor . requestCheck ( ) ;
217222
218- const minHeartbeatFrequencyMS = 500 ;
219- setTimeout ( ( ) => {
220- // wait for minHeartbeatFrequencyMS, then request a check and verify another check occurred
221- monitor . once ( 'serverHeartbeatSucceeded' , ( ) => {
222- monitor . close ( ) ;
223- } ) ;
223+ const minHeartbeatFrequencyMS = 500 ;
224+ await setTimeoutPromise ( minHeartbeatFrequencyMS ) ;
224225
225- monitor . requestCheck ( ) ;
226- } , minHeartbeatFrequencyMS ) ;
227- } ) ;
226+ await once ( monitor , 'serverHeartbeatSucceeded' ) ;
227+ monitor . close ( ) ;
228+
229+ await monitorClose ;
230+ expect ( startedEvents ) . to . have . length ( 2 ) ;
228231 } ) ;
229232
230- it ( 'should not close the monitor on a failed heartbeat' , function ( done ) {
233+ it ( 'should not close the monitor on a failed heartbeat' , async function ( ) {
231234 let helloCount = 0 ;
232235 mockServer . setMessageHandler ( request => {
233236 const doc = request . document ;
@@ -263,16 +266,13 @@ describe('monitoring', function () {
263266 let successCount = 0 ;
264267 monitor . on ( 'serverHeartbeatSucceeded' , ( ) => {
265268 if ( successCount ++ === 2 ) {
266- monitor . close ( ) ;
269+ monitor ? .close ( ) ;
267270 }
268271 } ) ;
269272
270- monitor . on ( 'close' , ( ) => {
271- expect ( events ) . to . have . length ( 2 ) ;
272- done ( ) ;
273- } ) ;
274-
275273 monitor . connect ( ) ;
274+ await once ( monitor , 'close' ) ;
275+ expect ( events ) . to . have . length ( 2 ) ;
276276 } ) ;
277277
278278 it ( 'should upgrade to hello from legacy hello when initial handshake contains helloOk' , function ( done ) {
@@ -306,6 +306,8 @@ describe('monitoring', function () {
306306 } , minHeartbeatFrequencyMS ) ;
307307 } ) ;
308308 } ) ;
309+
310+ describe ( '' ) ;
309311 } ) ;
310312
311313 describe ( 'class MonitorInterval' , function ( ) {
0 commit comments