Skip to content

Commit f201248

Browse files
authored
Fix or skip new failing unified change stream tests (#916)
* Add support for ignoreExtraEvents in unified test runner * Update change stream tests to specify ignoreExtraEvents * Update reactive change stream test runner to skip tests where extra getMore events occur between required events * Update reactive change stream test runner to skip tests that require change stream initialization to report an error * Enable artificial delay for change stream tests that expect an event when change stream is initialized JAVA-4369
1 parent 1609e39 commit f201248

File tree

4 files changed

+72
-10
lines changed

4 files changed

+72
-10
lines changed

driver-core/src/test/resources/unified-test-format/change-streams/change-streams.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@
143143
"expectEvents": [
144144
{
145145
"client": "client0",
146+
"ignoreExtraEvents": true,
146147
"events": [
147148
{
148149
"commandStartedEvent": {
@@ -189,6 +190,7 @@
189190
"expectEvents": [
190191
{
191192
"client": "client0",
193+
"ignoreExtraEvents": true,
192194
"events": [
193195
{
194196
"commandStartedEvent": {
@@ -230,6 +232,7 @@
230232
"expectEvents": [
231233
{
232234
"client": "client0",
235+
"ignoreExtraEvents": true,
233236
"events": [
234237
{
235238
"commandStartedEvent": {
@@ -288,6 +291,7 @@
288291
"expectEvents": [
289292
{
290293
"client": "client0",
294+
"ignoreExtraEvents": true,
291295
"events": [
292296
{
293297
"commandStartedEvent": {
@@ -378,6 +382,7 @@
378382
"expectEvents": [
379383
{
380384
"client": "client0",
385+
"ignoreExtraEvents": true,
381386
"events": [
382387
{
383388
"commandStartedEvent": {

driver-reactive-streams/src/test/functional/com/mongodb/reactivestreams/client/unified/ChangeStreamsTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,59 @@
1919
import com.mongodb.lang.Nullable;
2020
import org.bson.BsonArray;
2121
import org.bson.BsonDocument;
22+
import org.junit.After;
2223
import org.junit.runners.Parameterized;
2324

2425
import java.io.IOException;
2526
import java.net.URISyntaxException;
27+
import java.util.Arrays;
2628
import java.util.Collection;
29+
import java.util.Collections;
30+
import java.util.List;
31+
32+
import static com.mongodb.reactivestreams.client.syncadapter.SyncMongoClient.disableSleep;
33+
import static com.mongodb.reactivestreams.client.syncadapter.SyncMongoClient.enableSleepAfterCursorOpen;
34+
import static org.junit.Assume.assumeFalse;
2735

2836
public final class ChangeStreamsTest extends UnifiedReactiveStreamsTest {
37+
38+
private static final List<String> ERROR_REQUIRED_FROM_CHANGE_STREAM_INITIALIZATION_TESTS =
39+
Collections.singletonList(
40+
"Test with document comment - pre 4.4"
41+
);
42+
43+
private static final List<String> EVENT_SENSITIVE_TESTS =
44+
Arrays.asList(
45+
"Test that comment is set on getMore",
46+
"Test that comment is not set on getMore - pre 4.4"
47+
);
48+
49+
private static final List<String> CURSOR_OPEN_TIMING_SENSITIVE_TESTS =
50+
Arrays.asList(
51+
"Test with document comment",
52+
"Test with document comment - pre 4.4",
53+
"Test with string comment",
54+
"Test that comment is set on getMore"
55+
);
56+
2957
public ChangeStreamsTest(@SuppressWarnings("unused") final String fileDescription,
3058
@SuppressWarnings("unused") final String testDescription,
3159
final String schemaVersion, @Nullable final BsonArray runOnRequirements, final BsonArray entities,
3260
final BsonArray initialData, final BsonDocument definition) {
3361
super(schemaVersion, runOnRequirements, entities, initialData, definition);
62+
63+
assumeFalse(ERROR_REQUIRED_FROM_CHANGE_STREAM_INITIALIZATION_TESTS.contains(testDescription));
64+
assumeFalse(EVENT_SENSITIVE_TESTS.contains(testDescription));
65+
66+
if (CURSOR_OPEN_TIMING_SENSITIVE_TESTS.contains(testDescription)) {
67+
enableSleepAfterCursorOpen(256);
68+
}
69+
}
70+
71+
@After
72+
public void cleanUp() {
73+
super.cleanUp();
74+
disableSleep();
3475
}
3576

3677
@Parameterized.Parameters(name = "{0}: {1}")

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

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import static org.junit.Assert.assertEquals;
3333
import static org.junit.Assert.assertNotNull;
3434
import static org.junit.Assert.assertNull;
35+
import static org.junit.Assert.assertTrue;
3536

3637
final class EventMatcher {
3738
private final ValueMatcher valueMatcher;
@@ -42,11 +43,17 @@ final class EventMatcher {
4243
this.context = context;
4344
}
4445

45-
public void assertCommandEventsEquality(final String client, final BsonArray expectedEventDocuments, final List<CommandEvent> events) {
46+
public void assertCommandEventsEquality(final String client, final boolean ignoreExtraEvents, final BsonArray expectedEventDocuments,
47+
final List<CommandEvent> events) {
4648
context.push(ContextElement.ofCommandEvents(client, expectedEventDocuments, events));
47-
assertEquals(context.getMessage("Number of events must be the same"), expectedEventDocuments.size(), events.size());
49+
if (ignoreExtraEvents) {
50+
assertTrue(context.getMessage("Number of events must be greater than or equal to the expected number of events"),
51+
events.size() >= expectedEventDocuments.size());
52+
} else {
53+
assertEquals(context.getMessage("Number of events must be the same"), expectedEventDocuments.size(), events.size());
54+
}
4855

49-
for (int i = 0; i < events.size(); i++) {
56+
for (int i = 0; i < expectedEventDocuments.size(); i++) {
5057
CommandEvent actual = events.get(i);
5158
BsonDocument expectedEventDocument = expectedEventDocuments.get(i).asDocument();
5259
String eventType = expectedEventDocument.getFirstKey();
@@ -106,11 +113,17 @@ public void assertCommandEventsEquality(final String client, final BsonArray exp
106113
context.pop();
107114
}
108115

109-
public void assertConnectionPoolEventsEquality(final String client, final BsonArray expectedEventDocuments, final List<Object> events) {
116+
public void assertConnectionPoolEventsEquality(final String client, final boolean ignoreExtraEvents, final BsonArray expectedEventDocuments,
117+
final List<Object> events) {
110118
context.push(ContextElement.ofConnectionPoolEvents(client, expectedEventDocuments, events));
111-
assertEquals(context.getMessage("Number of events must be the same"), expectedEventDocuments.size(), events.size());
119+
if (ignoreExtraEvents) {
120+
assertTrue(context.getMessage("Number of events must be greater than or equal to the expected number of events"),
121+
events.size() >= expectedEventDocuments.size());
122+
} else {
123+
assertEquals(context.getMessage("Number of events must be the same"), expectedEventDocuments.size(), events.size());
124+
}
112125

113-
for (int i = 0; i < events.size(); i++) {
126+
for (int i = 0; i < expectedEventDocuments.size(); i++) {
114127
Object actual = events.get(i);
115128
BsonDocument expectedEventDocument = expectedEventDocuments.get(i).asDocument();
116129
String eventType = expectedEventDocument.getFirstKey();

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,17 +188,20 @@ public void shouldPassAllOutcomes() {
188188
}
189189
}
190190

191-
private void compareEvents(final BsonDocument operation) {
192-
for (BsonValue cur : operation.getArray("expectEvents")) {
191+
private void compareEvents(final BsonDocument definition) {
192+
for (BsonValue cur : definition.getArray("expectEvents")) {
193193
BsonDocument curClientEvents = cur.asDocument();
194194
String client = curClientEvents.getString("client").getValue();
195+
boolean ignoreExtraEvents = curClientEvents.getBoolean("ignoreExtraEvents", BsonBoolean.FALSE).getValue();
195196
String eventType = curClientEvents.getString("eventType", new BsonString("command")).getValue();
196197
if (eventType.equals("command")) {
197198
TestCommandListener listener = entities.getClientCommandListener(client);
198-
eventMatcher.assertCommandEventsEquality(client, curClientEvents.getArray("events"), listener.getEvents());
199+
eventMatcher.assertCommandEventsEquality(client, ignoreExtraEvents, curClientEvents.getArray("events"),
200+
listener.getEvents());
199201
} else if (eventType.equals("cmap")) {
200202
TestConnectionPoolListener listener = entities.getConnectionPoolListener(client);
201-
eventMatcher.assertConnectionPoolEventsEquality(client, curClientEvents.getArray("events"), listener.getEvents());
203+
eventMatcher.assertConnectionPoolEventsEquality(client, ignoreExtraEvents, curClientEvents.getArray("events"),
204+
listener.getEvents());
202205
} else {
203206
throw new UnsupportedOperationException("Unexpected event type: " + eventType);
204207
}

0 commit comments

Comments
 (0)