38
38
import com .mongodb .internal .connection .TestConnectionPoolListener ;
39
39
import com .mongodb .internal .connection .TestServerListener ;
40
40
import com .mongodb .lang .NonNull ;
41
+ import com .mongodb .lang .Nullable ;
41
42
import org .bson .BsonArray ;
42
43
import org .bson .BsonDocument ;
43
44
import org .bson .types .ObjectId ;
@@ -295,7 +296,7 @@ public <T> void waitForServerMonitorEvents(final String client, final Class<T> e
295
296
BsonDocument expectedEventContents = getEventContents (expectedEvent );
296
297
try {
297
298
serverMonitorListener .waitForEvents (expectedEventType ,
298
- event -> serverMonitorEventMatches (expectedEventContents , event ), count , Duration .ofSeconds (10 ));
299
+ event -> serverMonitorEventMatches (expectedEventContents , event , null ), count , Duration .ofSeconds (10 ));
299
300
context .pop ();
300
301
} catch (InterruptedException e ) {
301
302
throw new RuntimeException (e );
@@ -308,11 +309,37 @@ public <T> void assertServerMonitorEventCount(final String client, final Class<T
308
309
final int count , final TestServerMonitorListener serverMonitorListener ) {
309
310
BsonDocument expectedEventContents = getEventContents (expectedEvent );
310
311
context .push (ContextElement .ofServerMonitorEventCount (client , expectedEvent , count ));
311
- long matchCount = serverMonitorListener .countEvents (expectedEventType , event -> serverMonitorEventMatches (expectedEventContents , event ));
312
+ long matchCount = serverMonitorListener .countEvents (expectedEventType , event ->
313
+ serverMonitorEventMatches (expectedEventContents , event , null ));
312
314
assertEquals (context .getMessage ("Expected server monitor event counts to match" ), count , matchCount );
313
315
context .pop ();
314
316
}
315
317
318
+ public void assertServerMonitorEventsEquality (
319
+ final String client ,
320
+ final boolean ignoreExtraEvents ,
321
+ final BsonArray expectedEventDocuments ,
322
+ final List <?> events ) {
323
+ context .push (ContextElement .ofServerMonitorEvents (client , expectedEventDocuments , events ));
324
+ if (ignoreExtraEvents ) {
325
+ assertTrue (context .getMessage ("Number of events must be greater than or equal to the expected number of events" ),
326
+ events .size () >= expectedEventDocuments .size ());
327
+ } else {
328
+ assertEquals (context .getMessage ("Number of events must be the same" ), expectedEventDocuments .size (), events .size ());
329
+ }
330
+ for (int i = 0 ; i < expectedEventDocuments .size (); i ++) {
331
+ Object actualEvent = events .get (i );
332
+ BsonDocument expectedEventDocument = expectedEventDocuments .get (i ).asDocument ();
333
+ String expectedEventType = expectedEventDocument .getFirstKey ();
334
+ context .push (ContextElement .ofServerMonitorEvent (expectedEventDocument , actualEvent , i ));
335
+ assertEquals (context .getMessage ("Expected event type to match" ), expectedEventType , getEventType (actualEvent .getClass ()));
336
+ BsonDocument expectedEventContents = expectedEventDocument .getDocument (expectedEventType );
337
+ serverMonitorEventMatches (expectedEventContents , actualEvent , context );
338
+ context .pop ();
339
+ }
340
+ context .pop ();
341
+ }
342
+
316
343
@ NonNull
317
344
private BsonDocument getEventContents (final BsonDocument expectedEvent ) {
318
345
HashSet <String > supportedEventTypes = new HashSet <>(asList (
@@ -364,30 +391,52 @@ private static boolean clusterDescriptionChangedEventMatches(final BsonDocument
364
391
return true ;
365
392
}
366
393
367
- private static <T > boolean serverMonitorEventMatches (final BsonDocument expectedEventContents , final T event ) {
394
+ /**
395
+ * @param context Not {@code null} iff mismatch must result in an error, that is, this method works as an assertion.
396
+ */
397
+ private static <T > boolean serverMonitorEventMatches (
398
+ final BsonDocument expectedEventContents ,
399
+ final T event ,
400
+ @ Nullable final AssertionContext context ) {
401
+ if (expectedEventContents .size () > 1 ) {
402
+ throw new UnsupportedOperationException ("Matching for the following event is not implemented " + expectedEventContents .toJson ());
403
+ }
368
404
if (expectedEventContents .containsKey ("awaited" )) {
369
405
boolean expectedAwaited = expectedEventContents .getBoolean ("awaited" ).getValue ();
370
- boolean actualAwaited ;
371
- if (event instanceof ServerHeartbeatStartedEvent ) {
372
- actualAwaited = ((ServerHeartbeatStartedEvent ) event ).isAwaited ();
373
- } else if (event instanceof ServerHeartbeatSucceededEvent ) {
374
- actualAwaited = ((ServerHeartbeatSucceededEvent ) event ).isAwaited ();
375
- } else if (event instanceof ServerHeartbeatFailedEvent ) {
376
- actualAwaited = ((ServerHeartbeatFailedEvent ) event ).isAwaited ();
377
- } else {
378
- throw Assertions .fail (event .toString ());
406
+ boolean actualAwaited = getAwaitedFromServerMonitorEvent (event );
407
+ boolean awaitedMatches = expectedAwaited == actualAwaited ;
408
+ if (context != null ) {
409
+ assertTrue (context .getMessage ("Expected `awaited` to match" ), awaitedMatches );
379
410
}
380
- return expectedAwaited == actualAwaited ;
411
+ return awaitedMatches ;
381
412
}
382
413
return true ;
383
414
}
384
415
385
- private static String getEventType (final Class <?> eventClass ) {
416
+ static boolean getAwaitedFromServerMonitorEvent (final Object event ) {
417
+ if (event instanceof ServerHeartbeatStartedEvent ) {
418
+ return ((ServerHeartbeatStartedEvent ) event ).isAwaited ();
419
+ } else if (event instanceof ServerHeartbeatSucceededEvent ) {
420
+ return ((ServerHeartbeatSucceededEvent ) event ).isAwaited ();
421
+ } else if (event instanceof ServerHeartbeatFailedEvent ) {
422
+ return ((ServerHeartbeatFailedEvent ) event ).isAwaited ();
423
+ } else {
424
+ throw Assertions .fail (event .toString ());
425
+ }
426
+ }
427
+
428
+ static String getEventType (final Class <?> eventClass ) {
386
429
String eventClassName = eventClass .getSimpleName ();
387
430
if (eventClassName .startsWith ("ConnectionPool" )) {
388
431
return eventClassName .replace ("ConnectionPool" , "pool" );
389
- } else {
432
+ } else if ( eventClassName . startsWith ( "Connection" )) {
390
433
return eventClassName .replace ("Connection" , "connection" );
434
+ } else if (eventClassName .startsWith ("ServerHeartbeat" )) {
435
+ StringBuilder eventTypeBuilder = new StringBuilder (eventClassName );
436
+ eventTypeBuilder .setCharAt (0 , Character .toLowerCase (eventTypeBuilder .charAt (0 )));
437
+ return eventTypeBuilder .toString ();
438
+ } else {
439
+ throw new UnsupportedOperationException (eventClassName );
391
440
}
392
441
}
393
442
0 commit comments