Skip to content

Commit 16f100b

Browse files
committed
Implement required test runner changes
JAVA-5528
1 parent 07bac95 commit 16f100b

File tree

4 files changed

+304
-8
lines changed

4 files changed

+304
-8
lines changed

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

+60-7
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.mongodb.client.unified;
1818

19+
import com.mongodb.ClientBulkWriteException;
1920
import com.mongodb.MongoBulkWriteException;
2021
import com.mongodb.MongoClientException;
2122
import com.mongodb.MongoCommandException;
@@ -27,23 +28,33 @@
2728
import com.mongodb.MongoSocketException;
2829
import com.mongodb.MongoWriteConcernException;
2930
import com.mongodb.MongoWriteException;
31+
import com.mongodb.WriteError;
32+
import com.mongodb.bulk.WriteConcernError;
3033
import org.bson.BsonDocument;
34+
import org.bson.BsonInt32;
35+
import org.bson.BsonString;
3136
import org.bson.BsonValue;
3237

3338
import java.util.HashSet;
39+
import java.util.List;
3440
import java.util.Locale;
41+
import java.util.Map;
3542
import java.util.Set;
3643

44+
import static java.lang.Long.parseLong;
3745
import static java.util.Arrays.asList;
46+
import static java.util.stream.Collectors.toList;
3847
import static org.junit.Assert.assertEquals;
3948
import static org.junit.Assert.assertFalse;
49+
import static org.junit.Assert.assertNotNull;
4050
import static org.junit.Assert.assertTrue;
41-
import static org.spockframework.util.Assert.fail;
51+
import static org.junit.jupiter.api.Assertions.fail;
4252

4353
final class ErrorMatcher {
4454
private static final Set<String> EXPECTED_ERROR_FIELDS = new HashSet<>(
4555
asList("isError", "expectError", "isClientError", "errorCode", "errorCodeName", "errorContains", "errorResponse",
46-
"isClientError", "isTimeoutError", "errorLabelsOmit", "errorLabelsContain", "expectResult"));
56+
"isClientError", "isTimeoutError", "errorLabelsOmit", "errorLabelsContain",
57+
"writeErrors", "writeConcernErrors", "expectResult"));
4758

4859
private final AssertionContext context;
4960
private final ValueMatcher valueMatcher;
@@ -134,13 +145,55 @@ void assertErrorsMatch(final BsonDocument expectedError, final Exception e) {
134145
mongoException.hasErrorLabel(cur.asString().getValue()));
135146
}
136147
}
148+
if (expectedError.containsKey("writeErrors")) {
149+
assertTrue(context.getMessage("Exception must be of type ClientBulkWriteException when checking for write errors"),
150+
e instanceof ClientBulkWriteException);
151+
BsonDocument writeErrors = expectedError.getDocument("writeErrors");
152+
ClientBulkWriteException actualException = (ClientBulkWriteException) e;
153+
Map<Long, WriteError> actualWriteErrors = actualException.getWriteErrors();
154+
assertEquals("The number of write errors must match", writeErrors.size(), actualWriteErrors.size());
155+
writeErrors.forEach((index, writeError) -> {
156+
WriteError actualWriteError = actualWriteErrors.get(parseLong(index));
157+
assertNotNull("Expected a write error with index " + index, actualWriteError);
158+
valueMatcher.assertValuesMatch(writeError, toMatchableValue(actualWriteError));
159+
});
160+
}
161+
if (expectedError.containsKey("writeConcernErrors")) {
162+
assertTrue(context.getMessage("Exception must be of type ClientBulkWriteException when checking for write errors"),
163+
e instanceof ClientBulkWriteException);
164+
List<BsonDocument> writeConcernErrors = expectedError.getArray("writeConcernErrors").stream()
165+
.map(BsonValue::asDocument).collect(toList());
166+
ClientBulkWriteException actualException = (ClientBulkWriteException) e;
167+
List<WriteConcernError> actualWriteConcernErrors = actualException.getWriteConcernErrors();
168+
assertEquals("The number of write concern errors must match", writeConcernErrors.size(), actualWriteConcernErrors.size());
169+
for (int index = 0; index < writeConcernErrors.size(); index++) {
170+
BsonDocument writeConcernError = writeConcernErrors.get(index);
171+
WriteConcernError actualWriteConcernError = actualWriteConcernErrors.get(index);
172+
valueMatcher.assertValuesMatch(writeConcernError, toMatchableValue(actualWriteConcernError));
173+
}
174+
}
137175
if (expectedError.containsKey("expectResult")) {
138-
// Neither MongoBulkWriteException nor MongoSocketException includes information about the successful writes, so this
139-
// is the only check that can currently be done
140-
assertTrue(context.getMessage("Exception must be of type MongoBulkWriteException or MongoSocketException "
141-
+ "when checking for results, but actual type is " + e.getClass().getSimpleName()),
142-
e instanceof MongoBulkWriteException || e instanceof MongoSocketException);
176+
assertTrue(context.getMessage("Exception must be of type"
177+
+ " MongoBulkWriteException, or MongoSocketException, or ClientBulkWriteException"
178+
+ " when checking for results, but actual type is " + e.getClass().getSimpleName()),
179+
e instanceof MongoBulkWriteException || e instanceof ClientBulkWriteException || e instanceof MongoSocketException);
180+
// neither `MongoBulkWriteException` nor `MongoSocketException` includes information about the successful individual operations
181+
if (e instanceof ClientBulkWriteException) {
182+
BsonDocument actualPartialResult = ((ClientBulkWriteException) e).getPartialResult()
183+
.map(UnifiedCrudHelper::toMatchableValue)
184+
.orElse(new BsonDocument());
185+
valueMatcher.assertValuesMatch(expectedError.getDocument("expectResult"), actualPartialResult);
186+
}
143187
}
144188
context.pop();
145189
}
190+
191+
private static BsonDocument toMatchableValue(final WriteError writeError) {
192+
return new BsonDocument("code", new BsonInt32(writeError.getCode()));
193+
}
194+
195+
private static BsonDocument toMatchableValue(final WriteConcernError writeConcernError) {
196+
return new BsonDocument("code", new BsonInt32(writeConcernError.getCode()))
197+
.append("message", new BsonString(writeConcernError.getMessage()));
198+
}
146199
}

0 commit comments

Comments
 (0)