Skip to content

Commit e557fc4

Browse files
authored
Fix ServerDiscoveryAndMonitoringProseTests.testConnectionPoolManagement and disable it (#873)
JAVA-4483
1 parent a9a15b4 commit e557fc4

File tree

1 file changed

+30
-14
lines changed

1 file changed

+30
-14
lines changed

driver-sync/src/test/functional/com/mongodb/client/ServerDiscoveryAndMonitoringProseTests.java

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,17 @@
3939
import org.bson.BsonNull;
4040
import org.bson.BsonString;
4141
import org.bson.Document;
42+
import org.junit.Ignore;
4243
import org.junit.Test;
4344

4445
import java.util.ArrayList;
46+
import java.util.HashSet;
4547
import java.util.List;
48+
import java.util.Optional;
49+
import java.util.Set;
4650
import java.util.concurrent.BlockingQueue;
4751
import java.util.concurrent.CountDownLatch;
48-
import java.util.concurrent.SynchronousQueue;
52+
import java.util.concurrent.LinkedBlockingQueue;
4953
import java.util.concurrent.TimeUnit;
5054

5155
import static com.mongodb.ClusterFixture.configureFailPoint;
@@ -57,6 +61,7 @@
5761
import static com.mongodb.client.Fixture.getMongoClientSettingsBuilder;
5862
import static java.lang.String.format;
5963
import static java.util.Arrays.asList;
64+
import static java.util.Collections.singleton;
6065
import static java.util.Collections.synchronizedList;
6166
import static java.util.concurrent.TimeUnit.MILLISECONDS;
6267
import 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

Comments
 (0)