Skip to content

Commit 6f68c0e

Browse files
committed
Add CommandMessageTest.getCommandDocumentFromClientBulkWrite
JAVA-5529
1 parent 056d411 commit 6f68c0e

File tree

3 files changed

+77
-3
lines changed

3 files changed

+77
-3
lines changed

driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import com.mongodb.client.model.bulk.ClientUpdateResult;
4040
import com.mongodb.connection.ConnectionDescription;
4141
import com.mongodb.internal.TimeoutContext;
42+
import com.mongodb.internal.VisibleForTesting;
4243
import com.mongodb.internal.async.function.RetryState;
4344
import com.mongodb.internal.binding.ConnectionSource;
4445
import com.mongodb.internal.binding.WriteBinding;
@@ -109,6 +110,8 @@
109110
import static com.mongodb.assertions.Assertions.assertNotNull;
110111
import static com.mongodb.assertions.Assertions.assertTrue;
111112
import static com.mongodb.assertions.Assertions.fail;
113+
import static com.mongodb.internal.VisibleForTesting.AccessModifier.PACKAGE;
114+
import static com.mongodb.internal.VisibleForTesting.AccessModifier.PRIVATE;
112115
import static com.mongodb.internal.connection.BsonWriterHelper.decorateWithDocumentSizeChecking;
113116
import static com.mongodb.internal.connection.DualMessageSequences.WritersProviderAndLimitsChecker.WriteResult.FAIL_LIMIT_EXCEEDED;
114117
import static com.mongodb.internal.connection.DualMessageSequences.WritersProviderAndLimitsChecker.WriteResult.OK_LIMIT_NOT_REACHED;
@@ -682,7 +685,8 @@ public static final class OpsAndNsInfo extends DualMessageSequences {
682685
private final ConcreteClientBulkWriteOptions options;
683686
private final Supplier<Long> doIfCommandIsRetryableAndAdvanceGetTxnNumber;
684687

685-
OpsAndNsInfo(
688+
@VisibleForTesting(otherwise = PACKAGE)
689+
public OpsAndNsInfo(
686690
final boolean effectiveRetryWrites,
687691
final List<? extends ClientNamespacedWriteModel> models,
688692
@Nullable final Integer maxStoredDocumentSize,
@@ -941,10 +945,12 @@ Map<Integer, BsonValue> getInsertModelDocumentIds() {
941945
/**
942946
* Exactly one instance must be used per {@linkplain #executeBatch(int, WriteConcern, WriteBinding, ResultAccumulator) batch}.
943947
*/
944-
private final class BatchEncoder {
948+
@VisibleForTesting(otherwise = PRIVATE)
949+
public final class BatchEncoder {
945950
private EncodedBatchInfo encodedBatchInfo;
946951

947-
BatchEncoder() {
952+
@VisibleForTesting(otherwise = PACKAGE)
953+
public BatchEncoder() {
948954
encodedBatchInfo = new EncodedBatchInfo();
949955
}
950956

driver-core/src/test/unit/com/mongodb/internal/connection/CommandMessageSpecification.groovy

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ import static com.mongodb.internal.connection.SplittablePayload.Type.INSERT
4646
import static com.mongodb.internal.operation.ServerVersionHelper.FOUR_DOT_ZERO_WIRE_VERSION
4747
import static com.mongodb.internal.operation.ServerVersionHelper.LATEST_WIRE_VERSION
4848

49+
/**
50+
* New tests must be added to {@link CommandMessageTest}.
51+
*/
4952
class CommandMessageSpecification extends Specification {
5053

5154
def namespace = new MongoNamespace('db.test')

driver-core/src/test/unit/com/mongodb/internal/connection/CommandMessageTest.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,39 @@
2020
import com.mongodb.MongoOperationTimeoutException;
2121
import com.mongodb.ReadConcern;
2222
import com.mongodb.ReadPreference;
23+
import com.mongodb.WriteConcern;
24+
import com.mongodb.client.model.bulk.ClientNamespacedWriteModel;
2325
import com.mongodb.connection.ClusterConnectionMode;
2426
import com.mongodb.connection.ServerType;
27+
import com.mongodb.internal.IgnorableRequestContext;
2528
import com.mongodb.internal.TimeoutContext;
29+
import com.mongodb.internal.TimeoutSettings;
30+
import com.mongodb.internal.client.model.bulk.ConcreteClientBulkWriteOptions;
2631
import com.mongodb.internal.connection.MessageSequences.EmptyMessageSequences;
32+
import com.mongodb.internal.operation.ClientBulkWriteOperation;
33+
import com.mongodb.internal.operation.ClientBulkWriteOperation.ClientBulkWriteCommand.OpsAndNsInfo;
2734
import com.mongodb.internal.session.SessionContext;
2835
import com.mongodb.internal.validator.NoOpFieldNameValidator;
36+
import org.bson.BsonArray;
37+
import org.bson.BsonBoolean;
2938
import org.bson.BsonDocument;
39+
import org.bson.BsonInt32;
3040
import org.bson.BsonString;
3141
import org.bson.BsonTimestamp;
3242
import org.junit.jupiter.api.Test;
3343

44+
import java.util.List;
45+
import java.util.stream.Collectors;
46+
import java.util.stream.IntStream;
47+
48+
import static com.mongodb.MongoClientSettings.getDefaultCodecRegistry;
49+
import static com.mongodb.client.model.bulk.ClientBulkWriteOptions.clientBulkWriteOptions;
3450
import static com.mongodb.internal.mockito.MongoMockito.mock;
3551
import static com.mongodb.internal.operation.ServerVersionHelper.FOUR_DOT_ZERO_WIRE_VERSION;
52+
import static com.mongodb.internal.operation.ServerVersionHelper.LATEST_WIRE_VERSION;
53+
import static java.util.Arrays.asList;
54+
import static java.util.Collections.singletonList;
55+
import static org.junit.jupiter.api.Assertions.assertEquals;
3656
import static org.junit.jupiter.api.Assertions.assertThrows;
3757
import static org.mockito.ArgumentMatchers.any;
3858
import static org.mockito.Mockito.doThrow;
@@ -105,4 +125,49 @@ void encodeShouldNotAddExtraElementsFromTimeoutContextWhenConnectedToMongoCrypt(
105125
verifyNoInteractions(timeoutContext);
106126
}
107127
}
128+
129+
@Test
130+
void getCommandDocumentFromClientBulkWrite() {
131+
MongoNamespace ns = new MongoNamespace("db", "test");
132+
boolean retryWrites = false;
133+
BsonDocument command = new BsonDocument("bulkWrite", new BsonInt32(1))
134+
.append("errorsOnly", BsonBoolean.valueOf(false))
135+
.append("ordered", BsonBoolean.valueOf(true));
136+
List<BsonDocument> documents = IntStream.range(0, 2).mapToObj(i -> new BsonDocument("_id", new BsonInt32(i)))
137+
.collect(Collectors.toList());
138+
List<ClientNamespacedWriteModel> writeModels = asList(
139+
ClientNamespacedWriteModel.insertOne(ns, documents.get(0)),
140+
ClientNamespacedWriteModel.insertOne(ns, documents.get(1)));
141+
OpsAndNsInfo opsAndNsInfo = new OpsAndNsInfo(
142+
retryWrites,
143+
writeModels,
144+
null,
145+
new ClientBulkWriteOperation(
146+
writeModels,
147+
clientBulkWriteOptions(),
148+
WriteConcern.MAJORITY,
149+
retryWrites,
150+
getDefaultCodecRegistry()
151+
).new BatchEncoder(),
152+
(ConcreteClientBulkWriteOptions) clientBulkWriteOptions(),
153+
() -> 1L);
154+
BsonDocument expectedCommandDocument = command.clone()
155+
.append("$db", new BsonString(ns.getDatabaseName()))
156+
.append("ops", new BsonArray(asList(
157+
new BsonDocument("insert", new BsonInt32(0)).append("document", documents.get(0)),
158+
new BsonDocument("insert", new BsonInt32(0)).append("document", documents.get(1)))))
159+
.append("nsInfo", new BsonArray(singletonList(new BsonDocument("ns", new BsonString(ns.toString())))));
160+
CommandMessage commandMessage = new CommandMessage(
161+
ns, command, NoOpFieldNameValidator.INSTANCE, ReadPreference.primary(),
162+
MessageSettings.builder().maxWireVersion(LATEST_WIRE_VERSION).build(), true, opsAndNsInfo, ClusterConnectionMode.MULTIPLE, null);
163+
try (ByteBufferBsonOutput output = new ByteBufferBsonOutput(new SimpleBufferProvider())) {
164+
commandMessage.encode(
165+
output,
166+
new OperationContext(
167+
IgnorableRequestContext.INSTANCE, NoOpSessionContext.INSTANCE,
168+
new TimeoutContext(TimeoutSettings.DEFAULT), null));
169+
BsonDocument actualCommandDocument = commandMessage.getCommandDocument(output);
170+
assertEquals(expectedCommandDocument, actualCommandDocument);
171+
}
172+
}
108173
}

0 commit comments

Comments
 (0)