summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Carey <jcarey@argv.me>2017-11-09 11:12:53 -0500
committerJason Carey <jcarey@argv.me>2017-11-15 13:50:17 -0500
commitf6f0b9ff586964ddc59ca430f52e05e4cd7f5123 (patch)
tree6a5a13692c16fe4a39d845cf7b69940fa743f070
parent301ffaedeecaad53df28106191485b4c76c2d86b (diff)
downloadmongo-f6f0b9ff586964ddc59ca430f52e05e4cd7f5123.tar.gz
SERVER-31883 update nia test for op_msg
network_interface_asio_test tests nia by setting the global wire version and running the nia code against a manually simulated server. Updating it to work with op_msg requires a few modifications to select server responses and to handle the new mingling of metadata and response. (cherry picked from commit 4abdc7aff5cd5d0531c53b0ff784826e96700418)
-rw-r--r--src/mongo/executor/network_interface_asio_test.cpp63
1 files changed, 41 insertions, 22 deletions
diff --git a/src/mongo/executor/network_interface_asio_test.cpp b/src/mongo/executor/network_interface_asio_test.cpp
index ac34727a702..91cc6649de2 100644
--- a/src/mongo/executor/network_interface_asio_test.cpp
+++ b/src/mongo/executor/network_interface_asio_test.cpp
@@ -59,14 +59,15 @@ HostAndPort testHost{"localhost", 20000};
void initWireSpecMongoD() {
WireSpec& spec = WireSpec::instance();
- // accept from any version
- spec.incomingInternalClient.minWireVersion = RELEASE_2_4_AND_BEFORE;
- spec.incomingInternalClient.maxWireVersion = COMMANDS_ACCEPT_WRITE_CONCERN;
+ // accept from latest internal version
+ spec.incomingInternalClient.minWireVersion = LATEST_WIRE_VERSION;
+ spec.incomingInternalClient.maxWireVersion = LATEST_WIRE_VERSION;
+ // accept from any external version
spec.incomingExternalClient.minWireVersion = RELEASE_2_4_AND_BEFORE;
- spec.incomingExternalClient.maxWireVersion = COMMANDS_ACCEPT_WRITE_CONCERN;
- // connect to any version
- spec.outgoing.minWireVersion = RELEASE_2_4_AND_BEFORE;
- spec.outgoing.maxWireVersion = COMMANDS_ACCEPT_WRITE_CONCERN;
+ spec.incomingExternalClient.maxWireVersion = LATEST_WIRE_VERSION;
+ // connect to latest
+ spec.outgoing.minWireVersion = LATEST_WIRE_VERSION;
+ spec.outgoing.maxWireVersion = LATEST_WIRE_VERSION;
}
// Utility function to use with mock streams
@@ -82,6 +83,16 @@ RemoteCommandResponse simulateIsMaster(RemoteCommandRequest request) {
return response;
}
+BSONObj objConcat(std::initializer_list<BSONObj> objs) {
+ BSONObjBuilder bob;
+
+ for (const auto& obj : objs) {
+ bob.appendElements(obj);
+ }
+
+ return bob.obj();
+}
+
class NetworkInterfaceASIOTest : public mongo::unittest::Test {
public:
void setUp() override {
@@ -227,7 +238,7 @@ TEST_F(NetworkInterfaceASIOTest, LateCancel) {
});
// Simulate user command
- stream->simulateServer(rpc::Protocol::kOpCommandV1,
+ stream->simulateServer(rpc::Protocol::kOpMsg,
[](RemoteCommandRequest request) -> RemoteCommandResponse {
RemoteCommandResponse response;
response.data = BSONObj();
@@ -425,9 +436,11 @@ TEST_F(NetworkInterfaceASIOTest, StartCommand) {
<< "ok"
<< 1.0);
+ auto expectedCommandReplyWithMetadata = objConcat({expectedCommandReply, expectedMetadata});
+
// simulate user command
stream->simulateServer(
- rpc::Protocol::kOpCommandV1, [&](RemoteCommandRequest request) -> RemoteCommandResponse {
+ rpc::Protocol::kOpMsg, [&](RemoteCommandRequest request) -> RemoteCommandResponse {
ASSERT_EQ(std::string{request.cmdObj.firstElementFieldName()}, "foo");
ASSERT_EQ(request.dbname, "testDB");
@@ -440,8 +453,8 @@ TEST_F(NetworkInterfaceASIOTest, StartCommand) {
auto& res = deferred.get();
ASSERT(res.elapsedMillis);
uassertStatusOK(res.status);
- ASSERT_BSONOBJ_EQ(res.data, expectedCommandReply);
- ASSERT_BSONOBJ_EQ(res.metadata, expectedMetadata);
+ ASSERT_BSONOBJ_EQ(res.data, expectedCommandReplyWithMetadata);
+ ASSERT_BSONOBJ_EQ(res.metadata, expectedCommandReplyWithMetadata);
assertNumOps(0u, 0u, 0u, 1u);
}
@@ -486,7 +499,7 @@ public:
}
// Build a mock reply message
- auto replyBuilder = rpc::makeReplyBuilder(rpc::Protocol::kOpCommandV1);
+ auto replyBuilder = rpc::makeReplyBuilder(rpc::Protocol::kOpMsg);
replyBuilder->setCommandReply(BSON("hello!" << 1));
replyBuilder->setMetadata(BSONObj());
@@ -771,6 +784,8 @@ TEST_F(NetworkInterfaceASIOConnectionHookTest, MakeRequestReturnsNone) {
auto metadata = BSON("aaa"
<< "bbb");
+ auto commandReplyWithMetadata = objConcat({commandReply, metadata});
+
RemoteCommandRequest request{testHost, "blah", commandRequest, nullptr};
auto deferred = startCommand(makeCallbackHandle(), request);
@@ -784,7 +799,7 @@ TEST_F(NetworkInterfaceASIOConnectionHookTest, MakeRequestReturnsNone) {
});
// Simulate user command.
- stream->simulateServer(rpc::Protocol::kOpCommandV1,
+ stream->simulateServer(rpc::Protocol::kOpMsg,
[&](RemoteCommandRequest request) -> RemoteCommandResponse {
ASSERT_BSONOBJ_EQ(commandRequest, request.cmdObj.removeField("$db"));
@@ -798,9 +813,9 @@ TEST_F(NetworkInterfaceASIOConnectionHookTest, MakeRequestReturnsNone) {
auto& result = deferred.get();
ASSERT(result.isOK());
- ASSERT_BSONOBJ_EQ(commandReply, result.data);
+ ASSERT_BSONOBJ_EQ(commandReplyWithMetadata, result.data);
ASSERT(result.elapsedMillis);
- ASSERT_BSONOBJ_EQ(metadata, result.metadata);
+ ASSERT_BSONOBJ_EQ(commandReplyWithMetadata, result.metadata);
assertNumOps(0u, 0u, 0u, 1u);
}
@@ -818,6 +833,7 @@ TEST_F(NetworkInterfaceASIOConnectionHookTest, HandleReplyReturnsError) {
<< "blah"
<< "ok"
<< 1.0);
+
BSONObj hookUnifiedRequest = ([&] {
BSONObjBuilder bob;
bob.appendElements(hookCommandRequest);
@@ -825,7 +841,9 @@ TEST_F(NetworkInterfaceASIOConnectionHookTest, HandleReplyReturnsError) {
bob.append("$db", "foo");
return bob.obj();
}());
+
BSONObj hookReplyMetadata = BSON("1111" << 2222);
+ BSONObj hookCommandReplyWithMetadata = objConcat({hookCommandReply, hookReplyMetadata});
Status handleReplyError{ErrorCodes::AuthSchemaIncompatible, "daowdjkpowkdjpow"};
@@ -841,9 +859,10 @@ TEST_F(NetworkInterfaceASIOConnectionHookTest, HandleReplyReturnsError) {
},
[&](const HostAndPort& remoteHost, RemoteCommandResponse&& response) {
handleReplyCalled = true;
- handleReplyArgumentCorrect =
- SimpleBSONObjComparator::kInstance.evaluate(response.data == hookCommandReply) &&
- SimpleBSONObjComparator::kInstance.evaluate(response.metadata == hookReplyMetadata);
+ handleReplyArgumentCorrect = SimpleBSONObjComparator::kInstance.evaluate(
+ response.data == hookCommandReplyWithMetadata) &&
+ SimpleBSONObjComparator::kInstance.evaluate(response.metadata ==
+ hookCommandReplyWithMetadata);
return handleReplyError;
}));
@@ -862,7 +881,7 @@ TEST_F(NetworkInterfaceASIOConnectionHookTest, HandleReplyReturnsError) {
});
// Simulate hook reply
- stream->simulateServer(rpc::Protocol::kOpCommandV1,
+ stream->simulateServer(rpc::Protocol::kOpMsg,
[&](RemoteCommandRequest request) -> RemoteCommandResponse {
ASSERT_BSONOBJ_EQ(request.cmdObj, hookUnifiedRequest);
ASSERT_BSONOBJ_EQ(request.metadata, BSONObj());
@@ -936,7 +955,7 @@ TEST_F(NetworkInterfaceASIOTest, IsMasterRequestContainsOutgoingWireVersionInter
});
// Simulate ping reply.
- stream->simulateServer(rpc::Protocol::kOpCommandV1,
+ stream->simulateServer(rpc::Protocol::kOpMsg,
[&](RemoteCommandRequest request) -> RemoteCommandResponse {
RemoteCommandResponse response;
response.data = BSON("ok" << 1);
@@ -965,7 +984,7 @@ TEST_F(NetworkInterfaceASIOTest, IsMasterRequestMissingInternalClientInfoWhenNot
});
// Simulate ping reply.
- stream->simulateServer(rpc::Protocol::kOpCommandV1,
+ stream->simulateServer(rpc::Protocol::kOpMsg,
[&](RemoteCommandRequest request) -> RemoteCommandResponse {
RemoteCommandResponse response;
response.data = BSON("ok" << 1);
@@ -1038,7 +1057,7 @@ TEST_F(NetworkInterfaceASIOMetadataTest, Metadata) {
});
// Simulate hook reply
- stream->simulateServer(rpc::Protocol::kOpCommandV1,
+ stream->simulateServer(rpc::Protocol::kOpMsg,
[&](RemoteCommandRequest request) -> RemoteCommandResponse {
ASSERT_EQ("bar", request.cmdObj["foo"].str());
RemoteCommandResponse response;