1
+ import { once } from 'node:events' ;
1
2
import * as net from 'node:net' ;
2
3
3
4
import { expect } from 'chai' ;
4
5
import { coerce } from 'semver' ;
5
6
import * as sinon from 'sinon' ;
6
7
import { setTimeout } from 'timers' ;
8
+ import { setTimeout as setTimeoutPromise } from 'timers/promises' ;
7
9
8
- import { MongoClient } from '../../mongodb' ;
10
+ import { MongoClient , ServerHeartbeatSucceededEvent } from '../../mongodb' ;
9
11
import {
10
12
isHello ,
11
13
LEGACY_HELLO_COMMAND ,
@@ -141,7 +143,7 @@ describe('monitoring', function () {
141
143
} ) . skipReason = 'TODO(NODE-3600): Unskip flaky tests' ;
142
144
143
145
describe ( 'Monitor' , function ( ) {
144
- let monitor ;
146
+ let monitor : Monitor | null ;
145
147
146
148
beforeEach ( ( ) => {
147
149
monitor = null ;
@@ -153,7 +155,7 @@ describe('monitoring', function () {
153
155
}
154
156
} ) ;
155
157
156
- it ( 'should connect and issue an initial server check' , function ( done ) {
158
+ it ( 'should connect and issue an initial server check' , async function ( ) {
157
159
mockServer . setMessageHandler ( request => {
158
160
const doc = request . document ;
159
161
if ( isHello ( doc ) ) {
@@ -164,15 +166,17 @@ describe('monitoring', function () {
164
166
const server = new MockServer ( mockServer . address ( ) ) ;
165
167
monitor = new Monitor ( server as any , { } as any ) ;
166
168
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' ) ;
172
171
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>' ) ;
173
177
} ) ;
174
178
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 ( ) {
176
180
mockServer . setMessageHandler ( request => {
177
181
const doc = request . document ;
178
182
if ( isHello ( doc ) ) {
@@ -183,13 +187,17 @@ describe('monitoring', function () {
183
187
const server = new MockServer ( mockServer . address ( ) ) ;
184
188
monitor = new Monitor ( server as any , { } as any ) ;
185
189
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' ) ;
188
192
monitor . connect ( ) ;
193
+
194
+ const res = await Promise . race ( [ heartbeatFailed , heartbeatSucceeded ] ) ;
195
+
196
+ expect ( res [ 0 ] ) . to . be . instanceOf ( ServerHeartbeatSucceededEvent ) ;
189
197
monitor . connect ( ) ;
190
198
} ) ;
191
199
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 ( ) {
193
201
mockServer . setMessageHandler ( request => {
194
202
const doc = request . document ;
195
203
if ( isHello ( doc ) ) {
@@ -202,32 +210,27 @@ describe('monitoring', function () {
202
210
203
211
const startedEvents : ServerHeartbeatStartedEvent [ ] = [ ] ;
204
212
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' ) ;
209
214
210
215
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 ( ) ;
217
222
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 ) ;
224
225
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 ) ;
228
231
} ) ;
229
232
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 ( ) {
231
234
let helloCount = 0 ;
232
235
mockServer . setMessageHandler ( request => {
233
236
const doc = request . document ;
@@ -263,16 +266,13 @@ describe('monitoring', function () {
263
266
let successCount = 0 ;
264
267
monitor . on ( 'serverHeartbeatSucceeded' , ( ) => {
265
268
if ( successCount ++ === 2 ) {
266
- monitor . close ( ) ;
269
+ monitor ? .close ( ) ;
267
270
}
268
271
} ) ;
269
272
270
- monitor . on ( 'close' , ( ) => {
271
- expect ( events ) . to . have . length ( 2 ) ;
272
- done ( ) ;
273
- } ) ;
274
-
275
273
monitor . connect ( ) ;
274
+ await once ( monitor , 'close' ) ;
275
+ expect ( events ) . to . have . length ( 2 ) ;
276
276
} ) ;
277
277
278
278
it ( 'should upgrade to hello from legacy hello when initial handshake contains helloOk' , function ( done ) {
@@ -306,6 +306,8 @@ describe('monitoring', function () {
306
306
} , minHeartbeatFrequencyMS ) ;
307
307
} ) ;
308
308
} ) ;
309
+
310
+ describe ( '' ) ;
309
311
} ) ;
310
312
311
313
describe ( 'class MonitorInterval' , function ( ) {
0 commit comments