Skip to content

Commit 44e7add

Browse files
vbabaninrozza
andauthored
Add support for awaiting CommandStartedEvent in Unified Test Runner. (#1790)
JAVA-5815 --------- Co-authored-by: Ross Lawley <ross.lawley@gmail.com>
1 parent 3c3e677 commit 44e7add

File tree

5 files changed

+57
-20
lines changed

5 files changed

+57
-20
lines changed

driver-core/src/test/functional/com/mongodb/internal/connection/TestCommandListener.java

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import java.util.Arrays;
4141
import java.util.List;
4242
import java.util.concurrent.TimeUnit;
43+
import java.util.concurrent.TimeoutException;
4344
import java.util.concurrent.locks.Condition;
4445
import java.util.concurrent.locks.Lock;
4546
import java.util.concurrent.locks.ReentrantLock;
@@ -63,6 +64,7 @@ public class TestCommandListener implements CommandListener {
6364
private final TestListener listener;
6465
private final Lock lock = new ReentrantLock();
6566
private final Condition commandCompletedCondition = lock.newCondition();
67+
private final Condition commandAnyEventCondition = lock.newCondition();
6668
private final boolean observeSensitiveCommands;
6769
private boolean ignoreNextSucceededOrFailedEvent;
6870
private static final CodecRegistry CODEC_REGISTRY_HACK;
@@ -223,22 +225,12 @@ private <T extends CommandEvent> List<T> getEvents(final Class<T> type,
223225
}
224226
}
225227

226-
public List<CommandStartedEvent> waitForStartedEvents(final int numEvents) {
227-
lock.lock();
228-
try {
229-
while (!hasCompletedEvents(numEvents)) {
230-
try {
231-
if (!commandCompletedCondition.await(TIMEOUT, TimeUnit.SECONDS)) {
232-
throw new MongoTimeoutException("Timeout waiting for event");
233-
}
234-
} catch (InterruptedException e) {
235-
throw interruptAndCreateMongoInterruptedException("Interrupted waiting for event", e);
236-
}
237-
}
238-
return getEvents(CommandStartedEvent.class, numEvents);
239-
} finally {
240-
lock.unlock();
241-
}
228+
private <T extends CommandEvent> long getEventCount(final Class<T> eventClass, final Predicate<T> matcher) {
229+
return getEvents().stream()
230+
.filter(eventClass::isInstance)
231+
.map(eventClass::cast)
232+
.filter(matcher)
233+
.count();
242234
}
243235

244236
public void waitForFirstCommandCompletion() {
@@ -287,6 +279,7 @@ else if (!observeSensitiveCommands) {
287279
addEvent(new CommandStartedEvent(event.getRequestContext(), event.getOperationId(), event.getRequestId(),
288280
event.getConnectionDescription(), event.getDatabaseName(), event.getCommandName(),
289281
event.getCommand() == null ? null : getWritableClone(event.getCommand())));
282+
commandAnyEventCondition.signal();
290283
} finally {
291284
lock.unlock();
292285
}
@@ -312,6 +305,7 @@ else if (!observeSensitiveCommands) {
312305
event.getResponse() == null ? null : event.getResponse().clone(),
313306
event.getElapsedTime(TimeUnit.NANOSECONDS)));
314307
commandCompletedCondition.signal();
308+
commandAnyEventCondition.signal();
315309
} finally {
316310
lock.unlock();
317311
}
@@ -334,6 +328,7 @@ else if (!observeSensitiveCommands) {
334328
try {
335329
addEvent(event);
336330
commandCompletedCondition.signal();
331+
commandAnyEventCondition.signal();
337332
} finally {
338333
lock.unlock();
339334
}
@@ -428,4 +423,22 @@ private void assertEquivalence(final CommandStartedEvent actual, final CommandSt
428423
assertEquals(expected.getDatabaseName(), actual.getDatabaseName());
429424
assertEquals(expected.getCommand(), actual.getCommand());
430425
}
426+
427+
public <T extends CommandEvent> void waitForEvents(final Class<T> eventClass, final Predicate<T> matcher, final int count)
428+
throws TimeoutException {
429+
lock.lock();
430+
try {
431+
while (getEventCount(eventClass, matcher) < count) {
432+
try {
433+
if (!commandAnyEventCondition.await(TIMEOUT, TimeUnit.SECONDS)) {
434+
throw new MongoTimeoutException("Timeout waiting for command event");
435+
}
436+
} catch (InterruptedException e) {
437+
throw interruptAndCreateMongoInterruptedException("Interrupted waiting for event", e);
438+
}
439+
}
440+
} finally {
441+
lock.unlock();
442+
}
443+
}
431444
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,10 @@ public String toString() {
146146
};
147147
}
148148

149+
public static ContextElement ofWaitForCommandEvents(final String client, final BsonDocument commandEvent, final int count) {
150+
return new EventCountContext("Wait For Command Events", client, commandEvent, count);
151+
}
152+
149153
public static ContextElement ofTopologyEvents(final String client, final BsonArray expectedEvents,
150154
final List<?> actualEvents) {
151155
return new ContextElement() {

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import com.mongodb.event.ServerHeartbeatSucceededEvent;
3838
import com.mongodb.event.TestServerMonitorListener;
3939
import com.mongodb.internal.connection.TestClusterListener;
40+
import com.mongodb.internal.connection.TestCommandListener;
4041
import com.mongodb.internal.connection.TestConnectionPoolListener;
4142
import com.mongodb.internal.connection.TestServerListener;
4243
import com.mongodb.lang.NonNull;
@@ -223,6 +224,26 @@ public void waitForConnectionPoolEvents(final String client, final BsonDocument
223224
}
224225
}
225226

227+
public void waitForCommandEvents(final String clientId, final BsonDocument expectedCommandEvent, final int count,
228+
final TestCommandListener clientCommandListener) {
229+
context.push(ContextElement.ofWaitForCommandEvents(clientId, expectedCommandEvent, count));
230+
try {
231+
switch (expectedCommandEvent.getFirstKey()) {
232+
case "commandStartedEvent":
233+
BsonDocument properties = expectedCommandEvent.getDocument(expectedCommandEvent.getFirstKey());
234+
String commandName = properties.getString("commandName").getValue();
235+
clientCommandListener.waitForEvents(CommandStartedEvent.class, commandStartedEvent ->
236+
commandName.equals(commandStartedEvent.getCommandName()), count);
237+
break;
238+
default:
239+
throw new UnsupportedOperationException("Unsupported event: " + expectedCommandEvent.getFirstKey());
240+
}
241+
context.pop();
242+
} catch (TimeoutException e) {
243+
fail(context.getMessage("Timed out waiting for connection pool events"));
244+
}
245+
}
246+
226247
public void assertConnectionPoolEventCount(final String client, final BsonDocument event, final int count, final List<Object> events) {
227248
context.push(ContextElement.ofConnectionPoolEventCount(client, event, count));
228249
Class<?> eventClass;

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,9 @@ private OperationResult executeWaitForEvent(final UnifiedTestContext context, fi
779779
context.getEventMatcher().waitForServerMonitorEvents(clientId, TestServerMonitorListener.eventType(eventName), event, count,
780780
entities.getServerMonitorListener(clientId));
781781
break;
782+
case "commandStartedEvent":
783+
context.getEventMatcher().waitForCommandEvents(clientId, event, count, entities.getClientCommandListener(clientId));
784+
break;
782785
default:
783786
throw new UnsupportedOperationException("Unsupported event: " + eventName);
784787
}

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,6 @@ public static void applyCustomizations(final TestDef def) {
7676
.test("client-side-operations-timeout", "timeoutMS behaves correctly for GridFS download operations",
7777
"timeoutMS applied to entire download, not individual parts");
7878

79-
def.skipJira("https://jira.mongodb.org/browse/JAVA-5815")
80-
.test("client-side-operations-timeout", "WaitQueueTimeoutError does not clear the pool",
81-
"WaitQueueTimeoutError does not clear the pool");
82-
8379
def.skipJira("https://jira.mongodb.org/browse/JAVA-5491")
8480
.testContains("client-side-operations-timeout", "dropIndex")
8581
.when(() -> !serverVersionLessThan(8, 3))

0 commit comments

Comments
 (0)