3939import org .bson .BsonNull ;
4040import org .bson .BsonString ;
4141import org .bson .Document ;
42+ import org .junit .Ignore ;
4243import org .junit .Test ;
4344
4445import java .util .ArrayList ;
46+ import java .util .HashSet ;
4547import java .util .List ;
48+ import java .util .Optional ;
49+ import java .util .Set ;
4650import java .util .concurrent .BlockingQueue ;
4751import java .util .concurrent .CountDownLatch ;
48- import java .util .concurrent .SynchronousQueue ;
52+ import java .util .concurrent .LinkedBlockingQueue ;
4953import java .util .concurrent .TimeUnit ;
5054
5155import static com .mongodb .ClusterFixture .configureFailPoint ;
5761import static com .mongodb .client .Fixture .getMongoClientSettingsBuilder ;
5862import static java .lang .String .format ;
5963import static java .util .Arrays .asList ;
64+ import static java .util .Collections .singleton ;
6065import static java .util .Collections .synchronizedList ;
6166import static java .util .concurrent .TimeUnit .MILLISECONDS ;
6267import static java .util .concurrent .TimeUnit .NANOSECONDS ;
@@ -168,11 +173,12 @@ public void serverDescriptionChanged(final ServerDescriptionChangedEvent event)
168173 * <a href="https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring-tests.rst#connection-pool-management">Connection Pool Management</a>.
169174 */
170175 @ Test
176+ @ Ignore
171177 @ SuppressWarnings ("try" )
172178 public void testConnectionPoolManagement () throws InterruptedException {
173179 assumeTrue (serverVersionAtLeast (4 , 3 ));
174180 assumeFalse (isServerlessTest ());
175- BlockingQueue <Object > events = new SynchronousQueue <>(true );
181+ BlockingQueue <Object > events = new LinkedBlockingQueue <>();
176182 ServerMonitorListener serverMonitorListener = new ServerMonitorListener () {
177183 @ Override
178184 public void serverHeartbeatSucceeded (final ServerHeartbeatSucceededEvent event ) {
@@ -209,7 +215,7 @@ public void connectionPoolCleared(final ConnectionPoolClearedEvent event) {
209215 /* Note that ServerHeartbeatSucceededEvent type is sometimes allowed but never required.
210216 * This is because DefaultServerMonitor does not send such events in situations when a server check happens as part
211217 * of a connection handshake. */
212- assertPoll (events , ServerHeartbeatSucceededEvent .class , ConnectionPoolReadyEvent .class );
218+ assertPoll (events , ServerHeartbeatSucceededEvent .class , singleton ( ConnectionPoolReadyEvent .class ) );
213219 configureFailPoint (new BsonDocument ()
214220 .append ("configureFailPoint" , new BsonString ("failCommand" ))
215221 .append ("mode" , new BsonDocument ()
@@ -218,9 +224,9 @@ public void connectionPoolCleared(final ConnectionPoolClearedEvent event) {
218224 .append ("failCommands" , new BsonArray (asList (new BsonString ("isMaster" ), new BsonString ("hello" ))))
219225 .append ("errorCode" , new BsonInt32 (1234 ))
220226 .append ("appName" , new BsonString (appName ))));
221- assertPoll (events , ServerHeartbeatSucceededEvent .class , ServerHeartbeatFailedEvent . class );
222- assertPoll ( events , null , ConnectionPoolClearedEvent .class );
223- assertPoll (events , ServerHeartbeatSucceededEvent .class , ConnectionPoolReadyEvent .class );
227+ assertPoll (events , ServerHeartbeatSucceededEvent .class ,
228+ new HashSet <>( asList ( ServerHeartbeatFailedEvent . class , ConnectionPoolClearedEvent .class )) );
229+ assertPoll (events , null , new HashSet <>( asList ( ServerHeartbeatSucceededEvent .class , ConnectionPoolReadyEvent .class )) );
224230 } finally {
225231 disableFailPoint ("failCommand" );
226232 }
@@ -268,13 +274,14 @@ public void monitorsSleepAtLeastMinHeartbeatFreqencyMSBetweenChecks() {
268274 }
269275 }
270276
271- private static void assertPoll (final BlockingQueue <?> queue , @ Nullable final Class <?> allowed , final Class <?> required )
277+ private static void assertPoll (final BlockingQueue <?> queue , @ Nullable final Class <?> allowed , final Set < Class <?> > required )
272278 throws InterruptedException {
273279 assertPoll (queue , allowed , required , Timeout .startNow (TEST_WAIT_TIMEOUT_MILLIS , MILLISECONDS ));
274280 }
275281
276- private static void assertPoll (final BlockingQueue <?> queue , @ Nullable final Class <?> allowed , final Class <?> required ,
282+ private static void assertPoll (final BlockingQueue <?> queue , @ Nullable final Class <?> allowed , final Set < Class <?> > required ,
277283 final Timeout timeout ) throws InterruptedException {
284+ Set <Class <?>> encountered = new HashSet <>();
278285 while (true ) {
279286 Object element ;
280287 if (timeout .isImmediate ()) {
@@ -286,22 +293,31 @@ private static void assertPoll(final BlockingQueue<?> queue, @Nullable final Cla
286293 }
287294 if (element != null ) {
288295 if (LOGGER .isInfoEnabled ()) {
289- LOGGER .info ("Polled " + element . toString () );
296+ LOGGER .info ("Polled " + element );
290297 }
291298 Class <?> elementClass = element .getClass ();
292- if (required .isAssignableFrom (elementClass )) {
299+ if (findAssignable (elementClass , required )
300+ .map (found -> {
301+ encountered .add (found );
302+ return encountered .equals (required );
303+ }).orElseGet (() -> {
304+ assertTrue (String .format ("allowed %s, required %s, actual %s" , allowed , required , elementClass ),
305+ allowed != null && allowed .isAssignableFrom (elementClass ));
306+ return false ;
307+ })) {
293308 return ;
294- } else {
295- assertTrue (String .format ("allowed %s, required %s, actual %s" , allowed , required , elementClass ),
296- allowed != null && allowed .isAssignableFrom (elementClass ));
297309 }
298310 }
299311 if (timeout .expired ()) {
300- fail (" required " + required );
312+ fail (String . format ( "encountered %s, required %s" , encountered , required ) );
301313 }
302314 }
303315 }
304316
317+ private static Optional <Class <?>> findAssignable (final Class <?> from , final Set <Class <?>> toAnyOf ) {
318+ return toAnyOf .stream ().filter (to -> to .isAssignableFrom (from )).findAny ();
319+ }
320+
305321 private static <E > void put (final BlockingQueue <E > q , final E e ) {
306322 try {
307323 q .put (e );
0 commit comments