summaryrefslogtreecommitdiff
path: root/src/mongo/rpc/op_msg_integration_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/rpc/op_msg_integration_test.cpp')
-rw-r--r--src/mongo/rpc/op_msg_integration_test.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/mongo/rpc/op_msg_integration_test.cpp b/src/mongo/rpc/op_msg_integration_test.cpp
index 7aa41d66cb1..8ee613a3616 100644
--- a/src/mongo/rpc/op_msg_integration_test.cpp
+++ b/src/mongo/rpc/op_msg_integration_test.cpp
@@ -468,4 +468,33 @@ TEST(OpMsg, ServerRepliesWithoutChecksumToRequestWithoutChecksum) {
TEST(OpMsg, ServerRepliesWithChecksumToRequestWithChecksum) {
checksumTest(true);
}
+
+TEST(OpMsg, ServerHandlesReallyLargeMessagesGracefully) {
+ std::string errMsg;
+ auto conn = unittest::getFixtureConnectionString().connect("integration_test", errMsg);
+ uassert(ErrorCodes::SocketException, errMsg, conn);
+
+ auto buildInfo = conn->runCommand(OpMsgRequest::fromDBAndBody("admin", BSON("buildInfo" << 1)))
+ ->getCommandReply();
+ ASSERT_OK(getStatusFromCommandResult(buildInfo));
+ const auto maxBSONObjSizeFromServer =
+ static_cast<size_t>(buildInfo["maxBsonObjectSize"].Number());
+ const std::string bigData(maxBSONObjSizeFromServer * 2, ' ');
+
+ BSONObjBuilder bob;
+ bob << "ismaster" << 1 << "ignoredField" << bigData << "$db"
+ << "admin";
+ OpMsgRequest request;
+ request.body = bob.obj<BSONObj::LargeSizeTrait>();
+ ASSERT_GT(request.body.objsize(), BSONObjMaxInternalSize);
+ auto requestMsg = request.serialize();
+
+ Message replyMsg;
+ ASSERT(conn->call(requestMsg, replyMsg));
+
+ auto reply = OpMsg::parse(replyMsg);
+ auto replyStatus = getStatusFromCommandResult(reply.body);
+ ASSERT_NOT_OK(replyStatus);
+ ASSERT_EQ(replyStatus, ErrorCodes::BSONObjectTooLarge);
+}
} // namespace mongo