diff options
Diffstat (limited to 'src/mongo/rpc/command_request_test.cpp')
-rw-r--r-- | src/mongo/rpc/command_request_test.cpp | 153 |
1 files changed, 76 insertions, 77 deletions
diff --git a/src/mongo/rpc/command_request_test.cpp b/src/mongo/rpc/command_request_test.cpp index 64732735d6f..8f681655b56 100644 --- a/src/mongo/rpc/command_request_test.cpp +++ b/src/mongo/rpc/command_request_test.cpp @@ -41,82 +41,81 @@ namespace { - using namespace mongo; - - TEST(CommandRequest, ParseAllFields) { - std::vector<char> opCommandData; - - using std::begin; - using std::end; - - auto writeString = [&opCommandData](const std::string& str) { - opCommandData.insert(end(opCommandData), begin(str), end(str)); - opCommandData.push_back('\0'); - }; - - auto writeObj = [&opCommandData](const BSONObj& obj) { - opCommandData.insert(end(opCommandData), obj.objdata(), - obj.objdata() + obj.objsize()); - }; - - auto database = std::string{"ookokokokok"}; - writeString(database); - - auto commandName = std::string{"abababa"}; - writeString(commandName); - - BSONObjBuilder metadataBob{}; - metadataBob.append("foo", "bar"); - auto metadata = metadataBob.done(); - writeObj(metadata); - - BSONObjBuilder commandArgsBob{}; - commandArgsBob.append("baz", "garply"); - auto commandArgs = commandArgsBob.done(); - writeObj(commandArgs); - - BSONObjBuilder inputDoc1Bob{}; - inputDoc1Bob.append("meep", "boop").append("meow", "chirp"); - auto inputDoc1 = inputDoc1Bob.done(); - writeObj(inputDoc1); - - BSONObjBuilder inputDoc2Bob{}; - inputDoc1Bob.append("bleep", "bop").append("woof", "squeak"); - auto inputDoc2 = inputDoc2Bob.done(); - writeObj(inputDoc2); - - Message toSend; - toSend.setData(dbCommand, opCommandData.data(), opCommandData.size()); - - rpc::CommandRequest opCmd{&toSend}; - - ASSERT_EQUALS(opCmd.getCommandName(), commandName); - ASSERT_EQUALS(opCmd.getDatabase(), database); - ASSERT_EQUALS(opCmd.getMetadata(), metadata); - ASSERT_EQUALS(opCmd.getCommandArgs(), commandArgs); - - auto inputDocRange = opCmd.getInputDocs(); - auto inputDocRangeIter = inputDocRange.begin(); - - ASSERT_EQUALS(*inputDocRangeIter, inputDoc1); - // can't use assert equals since we don't have an op to print the iter. - ASSERT_FALSE(inputDocRangeIter == inputDocRange.end()); - ++inputDocRangeIter; - ASSERT_EQUALS(*inputDocRangeIter, inputDoc2); - ASSERT_FALSE(inputDocRangeIter == inputDocRange.end()); - ++inputDocRangeIter; - - ASSERT_TRUE(inputDocRangeIter == inputDocRange.end()); - } - - TEST(CommandRequest, InvalidNSThrows) { - rpc::CommandRequestBuilder crb; - crb.setDatabase("foo////!!!!<><><>"); - crb.setCommandName("foo"); - crb.setMetadata(BSONObj()); - crb.setCommandArgs(BSON("ping" << 1)); - auto msg = crb.done(); - ASSERT_THROWS(rpc::CommandRequest{msg.get()}, AssertionException); - } +using namespace mongo; + +TEST(CommandRequest, ParseAllFields) { + std::vector<char> opCommandData; + + using std::begin; + using std::end; + + auto writeString = [&opCommandData](const std::string& str) { + opCommandData.insert(end(opCommandData), begin(str), end(str)); + opCommandData.push_back('\0'); + }; + + auto writeObj = [&opCommandData](const BSONObj& obj) { + opCommandData.insert(end(opCommandData), obj.objdata(), obj.objdata() + obj.objsize()); + }; + + auto database = std::string{"ookokokokok"}; + writeString(database); + + auto commandName = std::string{"abababa"}; + writeString(commandName); + + BSONObjBuilder metadataBob{}; + metadataBob.append("foo", "bar"); + auto metadata = metadataBob.done(); + writeObj(metadata); + + BSONObjBuilder commandArgsBob{}; + commandArgsBob.append("baz", "garply"); + auto commandArgs = commandArgsBob.done(); + writeObj(commandArgs); + + BSONObjBuilder inputDoc1Bob{}; + inputDoc1Bob.append("meep", "boop").append("meow", "chirp"); + auto inputDoc1 = inputDoc1Bob.done(); + writeObj(inputDoc1); + + BSONObjBuilder inputDoc2Bob{}; + inputDoc1Bob.append("bleep", "bop").append("woof", "squeak"); + auto inputDoc2 = inputDoc2Bob.done(); + writeObj(inputDoc2); + + Message toSend; + toSend.setData(dbCommand, opCommandData.data(), opCommandData.size()); + + rpc::CommandRequest opCmd{&toSend}; + + ASSERT_EQUALS(opCmd.getCommandName(), commandName); + ASSERT_EQUALS(opCmd.getDatabase(), database); + ASSERT_EQUALS(opCmd.getMetadata(), metadata); + ASSERT_EQUALS(opCmd.getCommandArgs(), commandArgs); + + auto inputDocRange = opCmd.getInputDocs(); + auto inputDocRangeIter = inputDocRange.begin(); + + ASSERT_EQUALS(*inputDocRangeIter, inputDoc1); + // can't use assert equals since we don't have an op to print the iter. + ASSERT_FALSE(inputDocRangeIter == inputDocRange.end()); + ++inputDocRangeIter; + ASSERT_EQUALS(*inputDocRangeIter, inputDoc2); + ASSERT_FALSE(inputDocRangeIter == inputDocRange.end()); + ++inputDocRangeIter; + + ASSERT_TRUE(inputDocRangeIter == inputDocRange.end()); +} + +TEST(CommandRequest, InvalidNSThrows) { + rpc::CommandRequestBuilder crb; + crb.setDatabase("foo////!!!!<><><>"); + crb.setCommandName("foo"); + crb.setMetadata(BSONObj()); + crb.setCommandArgs(BSON("ping" << 1)); + auto msg = crb.done(); + ASSERT_THROWS(rpc::CommandRequest{msg.get()}, AssertionException); +} } // namespace |