Skip to content

Commit bb294cc

Browse files
committed
Add whenExceptionContains, fixes
1 parent 96e9bd9 commit bb294cc

File tree

2 files changed

+55
-15
lines changed

2 files changed

+55
-15
lines changed

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

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@
8484
import static com.mongodb.client.test.CollectionHelper.getCurrentClusterTime;
8585
import static com.mongodb.client.test.CollectionHelper.killAllSessions;
8686
import static com.mongodb.client.unified.RunOnRequirementsMatcher.runOnRequirementsMet;
87-
import static com.mongodb.client.unified.UnifiedTestModifications.doSkips;
87+
import static com.mongodb.client.unified.UnifiedTestModifications.Modifier;
88+
import static com.mongodb.client.unified.UnifiedTestModifications.applyCustomizations;
8889
import static com.mongodb.client.unified.UnifiedTestModifications.testDef;
8990
import static java.util.Collections.singletonList;
9091
import static java.util.stream.Collectors.toList;
@@ -174,10 +175,10 @@ protected static Collection<Arguments> getTestData(final String directory, final
174175
String testDescription = testDocument.getString("description").getValue();
175176
String fileDescription = fileDocument.getString("description").getValue();
176177
TestDef testDef = testDef(directory, fileDescription, testDescription, isReactive);
177-
doSkips(testDef);
178+
applyCustomizations(testDef);
178179

179-
boolean forceFlaky = testDef.wasAssignedModifier(UnifiedTestModifications.Modifier.FORCE_FLAKY);
180-
boolean retry = forceFlaky || testDef.wasAssignedModifier(UnifiedTestModifications.Modifier.RETRY);
180+
boolean forceFlaky = testDef.wasAssignedModifier(Modifier.FORCE_FLAKY);
181+
boolean retry = forceFlaky || testDef.wasAssignedModifier(Modifier.RETRY);
181182

182183
int attempts = retry ? ATTEMPTS : 1;
183184
if (forceFlaky) {
@@ -243,9 +244,9 @@ public void setUp(
243244
ignoreExtraEvents = false;
244245
if (directoryName != null && fileDescription != null && testDescription != null) {
245246
testDef = testDef(directoryName, fileDescription, testDescription, isReactive());
246-
UnifiedTestModifications.doSkips(testDef);
247+
applyCustomizations(testDef);
247248

248-
boolean skip = testDef.wasAssignedModifier(UnifiedTestModifications.Modifier.SKIP);
249+
boolean skip = testDef.wasAssignedModifier(Modifier.SKIP);
249250
assumeFalse(skip, "Skipping test");
250251
}
251252
skips(fileDescription, testDescription);
@@ -376,6 +377,12 @@ public void shouldPassAllOutcomes(
376377
compareLogMessages(rootContext, definition, tweaks);
377378
}
378379
} catch (AssertionFailedError e) {
380+
assertTrue(testDef.wasAssignedModifier(Modifier.RETRY));
381+
if (!testDef.matchesError(e)) {
382+
// if the error is not matched, test definitions were not intended to apply; throw it
383+
throw e;
384+
}
385+
379386
completed.remove(testName);
380387
boolean lastAttempt = attemptNumber == Math.abs(totalAttempts);
381388
if (forceFlaky || lastAttempt) {

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

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,34 +17,41 @@
1717
package com.mongodb.client.unified;
1818

1919
import com.mongodb.assertions.Assertions;
20+
import org.opentest4j.AssertionFailedError;
2021

2122
import java.util.ArrayList;
2223
import java.util.Arrays;
2324
import java.util.List;
25+
import java.util.function.Function;
2426
import java.util.function.Supplier;
2527

2628
import static com.mongodb.ClusterFixture.isDataLakeTest;
2729
import static com.mongodb.ClusterFixture.isDiscoverableReplicaSet;
2830
import static com.mongodb.ClusterFixture.isServerlessTest;
2931
import static com.mongodb.ClusterFixture.isSharded;
3032
import static com.mongodb.ClusterFixture.serverVersionLessThan;
31-
import static com.mongodb.client.unified.UnifiedTestModifications.Modifier.FORCE_FLAKY;
3233
import static com.mongodb.assertions.Assertions.assertNotNull;
3334
import static com.mongodb.client.unified.UnifiedTestModifications.Modifier.IGNORE_EXTRA_EVENTS;
35+
import static com.mongodb.client.unified.UnifiedTestModifications.Modifier.RETRY;
3436
import static com.mongodb.client.unified.UnifiedTestModifications.Modifier.SKIP;
3537
import static com.mongodb.client.unified.UnifiedTestModifications.Modifier.SLEEP_AFTER_CURSOR_CLOSE;
3638
import static com.mongodb.client.unified.UnifiedTestModifications.Modifier.SLEEP_AFTER_CURSOR_OPEN;
3739
import static com.mongodb.client.unified.UnifiedTestModifications.Modifier.WAIT_FOR_BATCH_CURSOR_CREATION;
3840

3941
public final class UnifiedTestModifications {
40-
public static void doSkips(final TestDef def) {
42+
public static void applyCustomizations(final TestDef def) {
4143

4244
// TODO reasons for retry
43-
def.modify(FORCE_FLAKY)
44-
// Exception in encryption library: ChangeCipherSpec message sequence violation
45-
.test("client-side-encryption", "namedKMS-createDataKey", "create datakey with named KMIP KMS provider")
46-
// Number of checked out connections must match expected
47-
.test("load-balancers", "cursors are correctly pinned to connections for load-balanced clusters", "pinned connections are returned after a network error during a killCursors request")
45+
// Exception in encryption library: ChangeCipherSpec message sequence violation
46+
def.retry("TODO reason")
47+
.whenExceptionContains("ChangeCipherSpec message sequence violation")
48+
.test("client-side-encryption", "namedKMS-createDataKey", "create datakey with named KMIP KMS provider");
49+
50+
def.retry("TODO reason")
51+
.whenExceptionContains("Number of checked out connections must match expected")
52+
.test("load-balancers", "cursors are correctly pinned to connections for load-balanced clusters", "pinned connections are returned after a network error during a killCursors request");
53+
54+
def.retry("TODO reason")
4855
.test("client-side-encryption", "namedKMS-rewrapManyDataKey", "rewrap to kmip:name1");
4956

5057
// atlas-data-lake
@@ -268,6 +275,7 @@ public static final class TestDef {
268275
private final boolean reactive;
269276

270277
private final List<Modifier> modifiers = new ArrayList<>();
278+
private Function<AssertionFailedError, Boolean> matchesError;
271279

272280
private TestDef(final String dir, final String file, final String test, final boolean reactive) {
273281
this.dir = assertNotNull(dir);
@@ -331,6 +339,14 @@ public TestApplicator skipUnknownReason(final String reason) {
331339
return new TestApplicator(this, reason, SKIP);
332340
}
333341

342+
343+
/**
344+
* The test will be retried, for the reason provided
345+
*/
346+
public TestApplicator retry(final String reason) {
347+
return new TestApplicator(this, reason, RETRY);
348+
}
349+
334350
public TestApplicator modify(final Modifier... modifiers) {
335351
return new TestApplicator(this, null, modifiers);
336352
}
@@ -342,24 +358,33 @@ public boolean isReactive() {
342358
public boolean wasAssignedModifier(final Modifier modifier) {
343359
return this.modifiers.contains(modifier);
344360
}
361+
362+
public boolean matchesError(final AssertionFailedError e) {
363+
if (matchesError != null) {
364+
return matchesError.apply(e);
365+
}
366+
return false;
367+
}
345368
}
346369

347370
/**
348371
* Applies settings to the underlying test definition. Chainable.
349372
*/
350373
public static final class TestApplicator {
351374
private final TestDef testDef;
352-
private final List<Modifier> modifiersToApply;
353375
private Supplier<Boolean> precondition;
354376
private boolean matchWasPerformed = false;
355377

378+
private final List<Modifier> modifiersToApply;
379+
private Function<AssertionFailedError, Boolean> matchesError;
380+
356381
private TestApplicator(
357382
final TestDef testDef,
358383
final String reason,
359384
final Modifier... modifiersToApply) {
360385
this.testDef = testDef;
361386
this.modifiersToApply = Arrays.asList(modifiersToApply);
362-
if (this.modifiersToApply.contains(SKIP)) {
387+
if (this.modifiersToApply.contains(SKIP) || this.modifiersToApply.contains(RETRY)) {
363388
assertNotNull(reason);
364389
}
365390
}
@@ -371,6 +396,7 @@ private TestApplicator onMatch(final boolean match) {
371396
}
372397
if (match) {
373398
this.testDef.modifiers.addAll(this.modifiersToApply);
399+
this.testDef.matchesError = this.matchesError;
374400
}
375401
return this;
376402
}
@@ -462,6 +488,13 @@ public TestApplicator when(final Supplier<Boolean> precondition) {
462488
this.precondition = precondition;
463489
return this;
464490
}
491+
492+
public TestApplicator whenExceptionContains(final String fragment) {
493+
this.matchesError = (final AssertionFailedError e) -> {
494+
return e.getCause().getMessage().contains(fragment);
495+
};
496+
return this;
497+
}
465498
}
466499

467500
public enum Modifier {

0 commit comments

Comments
 (0)